1.数据库,数据表,数据字段中的命名规范:
采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线'_'组成,共63个字符.不能出现其他字符。
业务数据库,数据表一律使用前缀
库名使用小写英文以及下划线组成,尽量说明是那个应用或者系统在使用的.比如:
web_dbaeye_com
web_dbaeye
如有遇到生产环境,开发环境,测试环境数据库名采用下划线加上production, development,test相关字样也可以使用缩写来标明数据库场景名字
数据表名使用小写英文以及下划线组成,尽量说明是那个应用或者系统在使用的.
相关应用的数据表使用同一前缀,如论坛的表使用cdb_前缀,博客的数据表使用supe_前缀,前缀名称一般 不超过5字 比如:
web_user
web_group
supe_userspace
数据表字段名使用小写英文以及下划线组成,最好是带表名前缀
规则:用尽量少的存储空间来存数一个字段的数据.
如能用int的就不用char或者varchar
能用tinyint的就不用int
能用 varchar(20)的就不用varchar(255)
时间戳字段尽量用int型,如created:表示从 '1970-01-01 08:00:00'开始的int秒数.
2. 数据库权限设置方案:
权限设置原则最小权限方案,意思就是说针对不同用户,不同业务,不同场景设定相关权限
一)MySQL服务器安全规范
1. 禁止应用直连DB,一般通过代理访问
2. 禁止DB公网访问。
3. 禁止生产和办公互通,需生产环境和办公环境隔离。
4. Linux系统初始化安全选项:
1)、一些alias,写入/etc/profile,防止误操作
alias c='clear'
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias MySQL='MySQL -U'
其中MySQL -U,防止update和delete没有指定条件,拒绝操作。
2)、删除linux操作日志信息、MySQL操作历史记录,避免被拖库。
rm .bash_history .mysql_history
ln -s /dev/null .bash_history
ln -s /dev/null .mysql_history
3)、避免"Too many open files"
OS限制:cat /etc/security/limits.conf,MySQL用户能够打开65535个文件描述符
MySQL soft nofile 65535
MySQL hard nofile 65535
my.cnf参数修改:
open_files_limit=65535
innodb_open_files=65535
5. MySQL初始化配置安全选项:
1)、合理规划目录结构,日志目录顺序写建议机械盘(binlog/slowlog/relaylog),数据目录随机写建议ssd。
2)、MySQL相关目录设置专用MySQL组和用户,MySQL后台启动方式不能以root来启动,比如通过MySQL用户 。
3)、设置bind-address为内网本机IP。
4)、修改MySQL默认服务端口号,不推荐使用3306,不同业务设置不同的端口号。
5)、通过修改max_connections和max_user_connections来控制最大连接数,过载保护。
6)、启用safe-user-create,用户不能用GRANT语句创建新用户,除非用户有MySQL.user表的INSERT权限。
7)、禁止local-infile=1,打开load data local file权限,避免数据泄漏和黑客攻击。
8)、禁止skip-grant-tables启动,防止MySQL绕过权限系统
9)、配置加上skip-name-resolve,防止主机名不被解析。
10)、禁止skip-networking,其它机器不能使用tcp/ip连接。
11)、禁止symbolic-links=1,关闭软链接功能。
数据库权限创建流程:开发人员向开发项目经理申请->开发项目经理向运维数据管理员申请->运维数据管理创建数据库并把数据库名字和数据库相关权限以及相关安全说明发邮件或是口头通知(权限相关设定一定要详细找运维人员进行商量)
数据库权限更新流程:开发人员向开发项目经理申请->开发项目经理向运维数据管理员申请->运维数据管理更新数据库并把数据库名字和数据库相关权限以及相关安全说明发邮件或是口头通知(权限相关设定一定要详细找运维人员进行商量)
二)MySQL帐号管理安全策略和MySQL权限相关的系统表:
1. MySQL.USER表
2. MySQL.DB表
3. MySQL.TABLES_PRIV表
4. MySQL.COLUMNS_PRIV表
自上而下,逐级验证,逐级进行账户权限的粒度控制
MySQL初始化:
1. 删除线上密码长度小于16的帐号。
2. 删除非root账户
3. 删除非localhost和127.0.0.1账户。
4. 删除test数据库
5. 账号区分:监控帐号或浏览帐号、管理帐号、复制帐号、备份帐号、应用帐号
1)监控帐号(localhost和127.0.0.1):
GRANT SELECT,PROCESS,REPLICATION CLIENT
2)备份帐号(localhost和127.0.0.1):
GRANT SELECT,LOCK TABLES,RELOAD
3)复制帐号(对应主库ip):
GRANT REPLICATION SLAVE,REPLICATION CLIENT
4)管理帐号(对应代理ip):
GRANT ALL PRIVILEGES
5)root帐号
root密码采用强密码策略,至少32位随机密码,推荐使用pwgen和makepasswd来生成32位随机密码,包含大小写、数字、字母、特殊字符。
root帐号只授权localhost和127.0.0.1,不得授予%权限。
root帐号建议每3个月修改一次,不同实例,设置不同的root密码。
6)应用帐号
a. 应用帐号不得拥有Super、Create、Drop、File,Grant,Reload,Shutdown,Process等权限。
b. 最小权限原则:select,insert,update,delete权限,禁止应用帐号权限设置为all。
c. 应用帐号不得拥有系统数据库(MySQL)的任何权限,不能使用*.*来授权。
d. 应用帐号只给所属应用的数据库授权,只给其所属应用的IP或代理授权。
e. MySQL从库必须添加read-only,只给select权限,严禁all,导致只读失效。
f. 应用帐号密码策略同root,建议每3-6个月修改一次。
3. 数据库备份回滚方案
1) 物理(xtrabackup)和逻辑(MySQLdump)相结合的备份策略,全备+增量+异地。
2) 数据库备份文件定期回放,定期验证备份的可恢复性。
3) 针对重要业务系统建立delay数据库或者采取Linux初始化时设置lvm策略,可快照闪回。
4) 假设有Binlog Server,遇到紧急情况可数据恢复
5) 可以采用去哪儿inecptionSQL开源方案,这个开源是一个自动化实时线上审计和备份方案需要一些资源(备选方案)
使用过Mysql版本号:4.0.26,5.0.37,5.5.38,5.7.19 Mysql下载可以到https://www.percona.com/.前面两个老版本如有需要可以QQ我,QQ:610794426@qq.com
文章评论