MySQL数据库基线检查策略
1、禁止mysql以管理员帐号权限运行
1、参考配置
(1)在/etc/my.cnf中设置:
[mysql.server]
user=mysql
2、补充操作说明
(1)即使做了上述配置,root用户还是具有启用mysql的权限。为了安全考虑,请尽量不要使用root用户来启用mysql。
2、应删除或锁定与数据库运行、维护等工作无关的账号
1、参考配置
(1)删除用户
mysql>DROP USER username;
DROP USER语句用于删除一个或多个MySQL账户。要使用该命令,必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
2、补充操作说明
(1)DROP USER不能自动关闭任何打开的用户对话。而且,如果用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。
3、禁止存在空密码用户
参考配置
(1)使用特权用户登录mysql,查看存在空密码的用户:
mysql> select user,host,password from mysql.user;
+------+----------------------+-------------------------------------------+
| user | host | password |
+------+----------------------+-------------------------------------------+
| root | test.com.cn | |
| root | 127.0.0.1 | |
| root | ::1 | |
+------+----------------------+-------------------------------------------+
3 rows in set (0.00 sec)
(2)根据实际应用情况,删除无用的host对应的user,或者针对user设置密码
删除方法:
delete from mysql.user where host='test.com.cn'
设置密码:
update mysql.user set password=password('password') where User='root';
请将password改为实际需要设置的密码
(3)重启mysql
4、禁止存在匿名帐户
参考配置
(1)使用特权用户(root)登录mysql,查询存在匿名用户:
mysql> select user,host from mysql.user where user='';select User from mysql.user where Grant_priv='Y' and User != 'root';
+------+----------------------+
| user | host |
+------+----------------------+
| | 1414.com.cn |
+------+----------------------+
1 rows in set (0.00 sec)
(2)删除匿名用户
mysql> delete from mysql.user where User = ''
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
5、配置日志功能
参考配置
(1)在/etc/my.cnf中设置:
log=/var/log/mysql.log
log-bin=mysql-bin
log-error=/var/log/mysql-error.log
log_queries_not_using_indexes
log-bin-trust-function-creators
log_slave_updates
log_slow_queries
(2)重启mysql
6、安装最新的安全补丁
参考配置
(1)下载并安装最新mysql安全补丁,参考网址:http://www.mysql.com。
7、存在对所有数据库上的表都具有delete权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有delete权限的用户:
mysql> select User from mysql.user where Delete_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的delete权限
mysql> revoke delete on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant delete on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表delete权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的delete权限
8、存在对所有数据库上的表都具有create权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有create权限的用户:
mysql> select User from mysql.user where Create_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的create权限
mysql> revoke create on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant create on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表create权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的create权限
9、存在对所有数据库上的表都具有drop权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有drop权限的用户:
mysql> select User from mysql.user where Drop_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的drop权限
mysql> revoke drop on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant drop on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表drop权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的drop权限
10、存在对指定的数据库上的所有表具有select权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有select权限的数据库对应关系:
mysql> select User,db from mysql.db where Select_priv='Y' and User != 'root' ;
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的select权限的用户
mysql> revoke select on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
11、存在对指定的数据库上的所有表具有insert权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有insert权限的数据库对应关系:
mysql> select User,db from mysql.db where Insert_priv='Y' and User != 'root';
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的insert权限的用户
mysql> revoke insert on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
12、存在对指定的数据库上的所有表具有 update 权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有update权限的数据库对应关系:
mysql> select User,db from mysql.db where Update_priv='Y' and User != 'root';
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的update权限的用户
mysql> revoke update on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
13、存在对指定的数据库上的所有表具有delete权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有delete权限的数据库对应关系:
mysql> select User,db from mysql.db where Delete_priv='Y' and User != 'root';
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的delete权限的用户
mysql> revoke delete on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
14、存在对指定的数据库上所有表具有create权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有create权限的数据库对应关系:
mysql> select User,db from mysql.db where Create_priv='Y' and User != 'root';
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的create权限的用户
mysql> revoke create on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
15、存在对指定数据库上的所有表具有drop 权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对非root用户与数据库所有表具有drop权限的数据库对应关系:
mysql> select User,db from mysql.db where Drop_priv='Y' and User != 'root' ;
+------+---------+
| User | db |
+------+---------+
| abc | aaa |
+------+---------+
1 rows in set (0.00 sec)
(2)去除具有指定数据库所有表的drop权限的用户
mysql> revoke drop on aaa.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
16、存在有shutdown权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询存在shutdown权限的非root用户:
mysql> select User from mysql.user where Shutdown_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 rows in set (0.00 sec)
(2)去除非root用户的shutdown权限
mysql> revoke shutdown on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
17、禁止网络连接
参考配置
(1)在/etc/my.cnf中设置:
[mysqld]]
skip-networking
(2)重启mysql
注:用户可选择执行此条基线,它可以禁止网络连接,防止猜解密码攻击,溢出攻击和嗅探攻击。(仅限于应用和数据库在同一台主机的情况)
18、存在有create user权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询存在create user权限的非root用户:
mysql> select User from mysql.user where Create_user_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 rows in set (0.00 sec)
(2)去除非root用户的create user权限
mysql> revoke create user on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
19、存在有reload权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询存在reload权限的非root用户:
mysql> select User from mysql.user where Reload_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 rows in set (0.00 sec)
(2)去除非root用户的reload权限
mysql> revoke reload on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
20、存在有grant权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询存在grant权限的非root用户:
mysql> select User from mysql.user where Grant_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 rows in set (0.00 sec)
(2)去除非root用户的grant权限
mysql> revoke grant option on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)更新数据库权限
mysql> flush privileges;
21、禁止have_merge_engine参数设置为enable
参考配置
(1)在/etc/my.cnf中设置(如不存在手动添加):
[mysqld]]
have_merge_engine = disable
(2)重启mysql
22、建议启用ssl安全链接
参考配置
(1)在/etc/my.cnf中设置(如不存在手动添加):
[mysqld]]
ssl
[mysqldump]
ssl
即开启ssl连接,请根据实际情况配置
(2)重启mysql
23、设置数据库连接数的上限
参考配置
根据机器性能和业务需求,设置连接数上限。
(1)在/etc/my.cnf中设置:
[mysqld]]
max_connections = 2000
(2)重启mysql
24、默认端口检查
参考配置
(1)在/etc/my.cnf中设置:
[client]
port = 8806
[mysqld]
prot = 8806
请将端口改为实际需要配置的值,保持mysqld与client下的port对应值需一致,如不一致会出现连接错误
(2)重启mysql
25、禁止存在test数据库
参考配置
(1)使用特权用户登录mysql,如test数据库为无用数据库请删除test数据库:
mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)
(2)test数据库为实际使用数据库,请将test数据库数据导出,重新创建新数据库,将test数据内数据导入新数据库
26、存在对所有数据库上的表都具有select权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有select权限的用户:
mysql> select User from mysql.user where Select_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的select权限
mysql> revoke select on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant select on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表select权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的select权限
27、存在对所有数据库上的表都具有insert权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有insert权限的用户:
mysql> select User from mysql.user where Insert_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的insert权限
mysql> revoke insert on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant insert on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表insert权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的insert权限
28、存在对所有数据库上的表都具有update权限的非root用户
参考配置
(1)使用特权用户(root)登录mysql,查询对所有数据库表具有update权限的用户:
mysql> select User from mysql.user where Update_priv='Y' and User != 'root';
+------+
| User |
+------+
| abc |
+------+
1 row in set (0.00 sec)
(2)去除此用户的所有数据库所有表的update权限
mysql> revoke update on *.* from 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(3)重复赋予此用户对应数据库的权限
mysql> grant update on abc_db.* to 'abc'@'%';
Query OK, 0 rows affected (0.04 sec)
(4)更新数据库权限
mysql> flush privileges;
补充操作说明
(1)abc为具有所有数据库所有表update权限的用户,请根据实际情况修改
(2)abc_db为数据库名,请根据实际需要设置
(3)请根据实际需要赋予用户的对用数据库的update权限
最后更新于
这有帮助吗?