MySQL数据库安全权限控制管理思想

2012年写的笔记,部分内容可能已经过时,仅供参考。

1. 制度与流程控制

1.1. 项目开发制度流程

办公开发--->办公测试--->IDC测试--->IDC上线

防止潜在问题隐患发生。

1.2. 数据库更新流程

开发人员提交需求--->开发主管审核--->部门领导审核--->DBA(运维)审核--->执行开发流程的数据库更新测试步骤,最后在IDC上线执行。

需要说明的是在一开始提交需求,就会同时抄送给以上人等。

通过较完善的数据库更新流程控制,可以防止很多潜在的数据丢失破坏问题发生。

1.3. DBA参与项目数据库设计

在开发环节上,DBA和资深运维人员可以参与数据库的设计与审核,从源头上减少降低不良数据库设计及语句的发生,如果有可能可以做所有语句的审核工作,包括select,这个需要评估所需的工作量,看不否允许。

1.4. 各种操作申请流程

(1) 开发等人员权限申请流程

(2) 数据库更新执行流程

(3) 烂SQL语句计入KPI考核。

1.5. 定期对内部人员培训

定期给开发及相关人员培训,还是从源头上减少降低不良设计及sql语句的发生,并通过培训告诉大家数据库性能的重要性,让大家提升性能意识。

(1) 数据库设计规范及制度。

(2) SQL语句执行优化,性能优化技巧等。

(3) 数据库架构设计等内容。

2. 账户权限控制

2.1. 内部开发等人员权限分配

(1)	权限申请流程要设置严格点,主需求不明确者知难而退。
(2)	开发和测试环境可以放开一些权限,IDC测试和生产环境严格控制数据库的写权限,并且读权限和对外业务服务器分离。
(3)	开发人员线上数据库权限分配:给单独的不对外服务的正式从库只读权限,不能分配线上正式主库写权限。
(4)	特殊人员(如领导),开通权限时问清楚做什么,发邮件回复,注明用户名、密码、权限范围,多提醒操作注意事项。
(5)	特殊账号,由DBA专人控制,禁止在任何客户端上执行特权账号操作(如只能localhost或其它策略)

2.2. web账户权限分配制度

(1)	写库账号默认权限为select,insert,update,delete。不要给建表改表(create alter)的权限,更不能给all权限。
(2)	读库账号默认权限为select(配合read-only参数用)。 一定要确保从库是只读的(对所有人员)。
(3)	根据需要,最好专库专账号,不要一个账号管理多个库。碎库特别多的小公司根据情况处理。
(4)	如果是lamp、lnmp一体的环境,db权限主机要设置为localhost,避免用root用户作为web连接用。
(5)	web和数据库分离的服务器的授权可以根据web服务数量多少按IP或网段来授权。
(6)	安全性和方便管理,是矛盾的,要尽量达到一个平衡的状态,如何是平衡就要根据具体公司和业务来衡量了。

2.3. web账户授权实战案例

生产环境访问主库授权:

grant select,insert,update,delete on blog.* to 'blog'@'10.0.0.%' identified by '123456';

生产环境访问从库授权:

grant select on blog.* to 'blog'@'10.0.0.%' identified by '123456';

2.4. 生产环境读写分离账户设置

主库(提供写):blog 	passwd 	ip:192.168.65.133 	port:3306
从库(提供读):blog 	passwd 	ip:192.168.65.134 	port:3306

两个账号的权限是不一样的。

除了IP之外,账号、密码、端口等看起来都是一样的。尽量为开发人员提供方便。

在数据库设计上,开发人员应该设计优先连接读库,如果读库连接超时,可以考虑读主库,从程序设计上来保证提升用户体验。当然也要根据主库的繁忙程序来综合考虑。具体情况具体分析。

3. 数据库客户端访问控制

(1)	更改默认mysql client端口,如phpadmin管理端口为9999,其它客户端也是一样。
(2)	数据库web client端统一部署在1-2台不对外服务server上限制ip及9999端口只能从内网访问。
(3)	不做公网域名解析,用hosts实现访问或用内部IP访问。
(4)	phpadmin站点目录独立于所有其它站点要目录外,只能由指定的域名或IP地址访问。
(5)	限制使用web连接的账号管理数据库,根据用户角色设置指定账号访问。
(6)	按开发及相关人员根据职位角色分配管理账号。
(7)	设置指定账号访问(apache/nginx验证+mysql用户登录限制)
(8)	统一所有数据库账号登录入口地址。禁止所有开发人员私自上传phpadmin等管理库管理的程序。
(9)	开通VPN,跳板机,内部管理数据库。

4. 系统层控制

(1)	限制或禁止开发人员SSH ROOT管理,通过SUDO细化权限,使用日志审计。
(2)	对phpadmin端config等配置文件进行读写权限控制。
(3)	取消非指定服务器的所有phpadmin web连接端。
(4)	禁止非管理人员管理有数据库web client端的服务器权限。

5. 读库分业务读写分离

对数据库的select等大量测试、统计、备份等操作,要在不对外提供select的单独从库执行。

不同的从服务器,可以按业务进行拆分:

--为外部用户提供查询
--用来备份
--提供公司内部后台、脚本、日志分析及开发人员服务的从服务器。

这样的拆分除了减轻主服务器的压力外,还使得对外用户浏览,对内处理公司内部用户业务,及DBA备份业务互不影响。

6. 数据库运维管理思想核心

(1)	未雨绸缪,不要停留在制度上,而是,实际做出来。
(2)	亡羊补牢,举一反三
(3)	完备的架构及备份恢复策略。
(4)	定期思考,并实战模拟以上策略演练。