【史上最全】MySQL数据库安全加固方案

数据库版本:MySQL8.0.22
按照本安全加固方案进行的数据库加固,一般安全扫描工具扫描出来几乎无漏洞。

1.2 帐号安全

1.2.1 避免不同用户间共享帐号

参考以下步骤。
A. 创建用户。

mysql>CREATE USER ‘用户名’@‘用户 host’ IDENTIFIED BY ‘密码’;

执行以上命令可以创建一个用户。
B. 使用以下命令登录 MySQL 服务。

mysql –u 用户名 -p

1.2.2 删除无关帐号

DELETE FROM mysql.user WHERE user=”用户名” and host=”ip/子网掩码” 语句可用于删除一个或多个 MySQL 账户。使用 DELETE 命令时,必须确保当前账号拥有 MySQL 数据库的全局 CREATE USER权限或 DELETE 权限。账户名称的用户和主机部分分别与用户表记录的 User 和 Host 列值相对应。
执行 DELETE FROM mysql.user WHERE user=”用户名” and host=”ip/子网掩码”语句,您可以取消一个账户和其权限,并删除来自所有授权表的帐户权限记录。

1.2.3 修改 root 账号名

输入命令 update mysql.user set user=“[user_name]” where user="root"修改 root 账号名。

1.2.4 禁止重用数据库用户名

使用 sql 命令 select user,count() from mysql.user group by user having count() > 1 查看是否有重用数据库用户名。若有,则删除。

1.2.5 防暴力破解

A. 限制密码输错次数。使用命令 create user ‘用户’@‘host’ identified by ‘密码’ failed_login_attempts 3 password_lock_time 1 限制用户输入密码错误 3 次就锁定账号 1 天。
B. 在 mysqld.cnf 文件里添加如下命令:
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
connection-control-failed-connections-threshold=3
connection-control-min-connection-delay=86400000
connection-control-max-connection-delay=86400000

1.3 口令

A. 检查账户默认密码和弱密码。
B. 口令长度需要至少 14 位,并需要包括数字、英文字母和特殊符号。执行以下命令可对密码类型进行限制。

mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password_check_user_name | ON |
| validate_password_dictionary_file | | #规则文件保存路径
| validate_password_length | 8 | #密码长度
| validate_password_mixed_case_count | 1 | #整个密码中至少要包含大/小写字母的总个数;
| validate_password_number_count | 1 | #整个密码中至少要包含阿拉伯数字的个数;
| validate_password_policy | MEDIUM | #密码的验证强度等级
| validate_password_special_char_count | 1 | #密码中特殊字符至少的个数
+--------------------------------------+--------+
7 rows in set (0.00 sec

C. 密码应至少每 90 天进行一次更换。

  1. 在 mysqld.cnf 文件中添加配置 default_password_lifetime=90,并重启 mysql。
  2. 使用命令 alter user ‘账号名’@‘host 地址’ password expire interval 90 day 将账号设置为 90 天更换一次。
    D. 您可以通过执行以下命令修改密码。必须要修改 mysql 安装后给的 root 超级管理员的随机密码。
mysql> update user set password=password('密码') where user='root';
mysql> flush privilege

E. 在 mysqld.cnf 文件中添加配置 validate_password_policy=STRONG 将密码强度更改为强
F. 在 mysqld.cnf 文件中添加配置 validate_password_length=14,设置密码长度最小为 14。
G. 禁止数据库用户密码为空。输入命令 SELECT User,host FROM mysql.user WHERE LENGTH(authentication_string) = 0 检查是否有密码为空的用户。
H. 禁止在 mysqld.cnf 中配置密码。执行命令 cat mysqld.cnf 2>/dev/null | grep -i ‘[a-zA-Z0-9#]*password’,若返回结果不为空,则在 mysqld.cnf 配置文件中清除[client]中的 password 信息.

1.4 授权

在数据库权限配置能力范围内,根据用户的业务需要,配置其所需的最小权限。
A. 查看数据库授权情况。

mysql> use mysql;
mysql> select * from user;
mysql>select * from db;
mysql>select * from host;
mysql>select * from tables_priv;
mysql>select * from columns_priv;

B. 通过 revoke 命令回收不必要的或危险的

mysql> help revoke
Name: 'REVOKE' 
Description:
Syntax:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ... ON [object_type]
{
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
FROM user [, user] ...

1.5 开启日志审计功能

数据库应配置日志功能,便于记录运行状况和操作行为。
MySQL 服务有以下几种日志类型: 错误日志: -log-err
查询日志: -log (可选)
慢查询日志: -log-slow-queries (可选)
更新日志: -log-slave-updates
二进制日志: -log-bin
A. 添加错误日志。在 mysqld.cnf 文件中如果没有 log-error,则添加
log-error=/var/log/mysqld.log。
B. 添加二进制日志和更新日志。在 mysqld.cnf 文件中添加以下内容。

log-bin=/var/lib/mysql/文件名
server-id=字符串 #随机指定一个不能和其他集群中机器重名的字符串
log-slave-updates=11

C. 使用命令 set global slow_query_log=ON 添加慢查询日志。使用 set global long_query_time=5;
设置慢查询时间。
D. 修改配置后,要重启 mysql。
日志查询操作说明
执行 show variables like ‘log_%’;命令可查看所有的 log。
执行 show variables like ‘log_bin’;命令可查看具体的 log。

1.6 安装最新补丁

确保系统安装了最新的安全补丁。
注意: 在保证业务及网络安全的前提下,并经过兼容性测试后,安装更新补丁。

1.7 设置可信 IP 访问控制

通过数据库所在操作系统的防火墙限制,实现只有信任的 IP 才能通过监听器访问数据库。

mysql> GRANT 权限 ON db.* TO 用户名@'IP 子

1.8 连接数设置

根据您的机器性能和业务需求,设置最大、最小连接数。
在 MySQL 配置文件(mysqld.cnf)的 [mysqld] 配置段中添加 max_connections = 3000,保存配置文件,重启 MySQL 服务后即可生效。

1.9 设置证书撤销列表

在 mysqld.cnf 文件添加 ssl_crl=file_name。

1.10 删除不使用的客户端程序

删除不使用的客户端程序、头文件、测试文件和 debug 文件。
步骤 1 以默认安装路径说明,执行如下命令删除/usr/bin 路径下除了 mysql、mysqlbinlog 和
mysqldump 外的其它 mysql 客户端程序:
rm -rf /usr/bin/mysqladmin
rm -rf /usr/bin/mysqlcheck
rm -rf /usr/bin/mysql_config
rm -rf /usr/bin/mysql_config-64
rm -rf /usr/bin/mysql_config_editor
rm -rf /usr/bin/mysqld_pre_systemd
rm -rf /usr/bin/mysqldumpslow
rm -rf /usr/bin/mysqlimport
rm -rf /usr/bin/mysql_install_db
rm -rf /usr/bin/mysql_plugin
rm -rf /usr/bin/mysqlpump
rm -rf /usr/bin/mysql_secure_installation
rm -rf /usr/bin/mysqlshow
rm -rf /usr/bin/mysqlslap
rm -rf /usr/bin/mysql_ssl_rsa_setup
rm -rf /usr/bin/mysql_tzinfo_to_sql
rm -rf /usr/bin/mysql_upgrade
步骤 2 执行如下命令删除/usr/share/man/man1/目录下除了/usr/share/man/man1/mysql.1.gz 外的其它 mysql 相关帮助文档:
ls /usr/share/man/man1/mysql |grep -w -v mysql.1 |xargs rm
步骤 3 执行如下命令检查客户端程序是否已删除:
ls -al /usr/bin/mysqladmin
ls -al /usr/bin/mysqlcheck
ls -al /usr/bin/mysql_config
ls -al /usr/bin/mysql_config-64
ls -al /usr/bin/mysql_config_editor
ls -al /usr/bin/mysqld_pre_systemd
ls -al /usr/bin/mysqldumpslow
ls -al /usr/bin/mysqlimport
ls -al /usr/bin/mysql_install_db
ls -al /usr/bin/mysql_plugin
ls -al /usr/bin/mysqlpump
ls -al /usr/bin/mysql_secure_installation
ls -al /usr/bin/mysqlshow
ls -al /usr/bin/mysqlslap
ls -al /usr/bin/mysql_ssl_rsa_setup
ls -al /usr/bin/mysql_tzinfo_to_sql
ls -al /usr/bin/mysql_upgrade
步骤 4 执行如下命令检查相关帮助文档是否已删除:
ls /usr/share/man/man1/mysql |grep -w -v mysql.1 |wc –l

1.11 禁止设置 SKIP-SECURE-AUTH

skip-secure-auth 会关闭 secure_auth,将允许使用 mysql_old_password 插件存储密码的用户连接数据库,因此禁止设置 skip-secure-auth。
步骤 1 执行如下 SQL 语句检查是否设置 skip-secure-auth:
show variables like ‘secure_auth’;
步骤 2 若返回结果不为 ON,则在 mysqld.cnf 配置文件中删除[mysqld] skip-secure-auth。
步骤 3 重启数据库

1.12LOCAL_INFILE 配置为 0

步骤 1 执行如下 SQL 语句:
show variables like ‘local_infile’;
步骤 2 若返回结果不为 OFF,则在 mysqld.cnf 配置文件中修改[mysqld] local_infile=0。
步骤 3 重启数据库。

1.13 设置 MASTER_INFO_REPOSITORY、RELAY-LOG-INFO-REPOSITORY

Master_info_repository 用于指定 master 状态信息和连接信息记录位置,会保存明文密码。
步骤 1 分别执行如下 SQL 语句:
show global variables like ‘master_info_repository’;
show global variables like ‘relay_log_info_repository’;
步骤 2 若返回值不为 TABLE,则在/etc/mysqld.cnf 配置文件中修改[mysqld]
master_info_repository=TABLE 和 relay-log-info-repository=TABLE。
步骤 3 重启数据库。

1.14 禁止使用 MYSQL_PWD 环境变量

步骤 1 执行如下命令:
ps auxe | grep MYSQL_PWD | grep -v grep
grep MYSQL_PWD /proc//environ
grep MYSQL_PWD /home/
/.{bashrc,profile,bash_profile}
步骤 2 若返回结果不为空,则清除 MYSQL_PWD 环境变量。
步骤 3 重启数据库。

1.15 限制安装文件属主和权限

步骤 1 执行 SQL 语句:
show variables where variable_name = ‘plugin_dir’;
预期结果,输出插件路径:
plugin_dir /usr/lib64/mysql/plugin/
步骤 2 在系统中执行以下命令检查 mysql 库的文件权限是否满足 500
ls -l /usr/lib64/mysql
预期结果为返回值为*.so.*的非软链接库文件,权限需为 500

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sophiasofia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值