Mysql数据库常用安全加固设置
数据库通常包含企业的核心业务数据和敏感信息。如果没有足够的安全措施,数据库可能会受到攻击者的攻击,导致数据泄露、篡改或破坏,从而给企业造成巨大的经济损失和信誉损害,因此要尽可能减少暴露面,增强安全防护,进行加固。
一、系统防护:
1、如不需要关闭访问外网,通过防火墙等进行网络拦截,只允许内网访问。 2、开启防火墙firewalld
# 启动防火墙服务
systemctl start firewalld
# 开机启动
systemctl enable firewalld
# 查看允许通过的端口
firewall-cmd --zone=public --list-ports
# 刷新防火墙状态
firewall-cmd --reload
3、指定监听端口或者修改数据库默认端口 默认配置文件在/etc/my.cnf,在[mysqld] 部分添加端口配置
[mysqld]
port = 3307
重启mysql-server服务。
systemctl restart mysqld
二、数据库配置防护:
1、使用mysql用户运行mysql,防止程序权限过高
2、数据库用户,拒绝远程登录,删除'用户@%'账号
mysql> SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| zabbix | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
mysql>
3、开启数据库日志审计 在my.cnf配置中添加log-error=/var/log/mysqld.log
4、配置最大连接数 在my.cnf添加设置
max_connections=<new_value> # 默认151
5、配置密码复杂度
# 安装插件
mysql -uroot -p
install plugin validate_password soname 'validate_password.so';
# 在my.cnf[mysqld]下添加如下配置
plugin-load = "validate_password.so"
validate-password = FORCE_PLUS_PERMANENT # 强制启用该插件,不能被卸载
validate_password_length = 12 # 密码位数,默认为8,按需修改
validate_password_policy = MEDIUM # 密码强度为medium或者1
validate_password_mixed_case_count = 1 # 至少有大小写字母
validate_password_number_count = 1 # 最少一个数字
validate_password_special_char_count = 1 # 最少一个符号
validate_password_check_user_name = OFF # 禁止设置密码和用户名一致
6、配置登录失败锁定策略
# 安装插件
mysql -uroot -p
install plugin connection_control soname 'connection_control.so';
# 在my.cnf[mysqld]中添加如下配置
plugin-load-add=connection_control.so
connection_control=FORCE # 强制启用
connection_control_min_connection_delay=300000 # 最大延迟登录时间,单位毫秒。
connection_control_failed_connections_threshold=5 # 登录失败次数,默认为3
7、禁用local-infile选项 local-infile选项允许读取本地sql文件,可能增加安全隐患。
mysql -uroot -p
# 查看设置
show variables like 'local_infile';
# 若返回结果不为OFF,则在/etc/my.cnf配置文件中修改
local_infile = 0
8、禁止符号链接
# 在my.cnf中添加
skip_symbolic_links=yes
my.cnf配置示例:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 数据库日志
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 最大连接数设置
max_connections= 100
plugin-load = "validate_password.so"
validate-password = FORCE_PLUS_PERMANENT # 强制启用该插件,不能被卸载
validate_password_length = 12 # 密码位数,默认为8,按需修改
validate_password_policy = MEDIUM # 密码强度为medium或者1
validate_password_mixed_case_count = 1 # 至少有大小写字母
validate_password_number_count = 1 # 最少一个数字
validate_password_special_char_count = 1 # 最少一个符号
validate_password_check_user_name = OFF # 禁止设置密码和用户名一致
plugin-load-add=connection_control.so
connection_control=FORCE # 强制启用
connection_control_min_connection_delay=300000 # 最大延迟登录时间,单位毫秒。
connection_control_failed_connections_threshold=5 # 登录失败次数,默认为3
local_infile = 0 # 禁止local_infile
skip_symbolic_links=yes # 禁止符号连接
数据安全防护:
定期备份,使用定期备份脚本进行数据库备份,配合定时任务执行。 示例:
#!/bin/bash
# MySQL 连接信息
USER="root"
PASSWORD="password"
HOST="localhost"
DATABASE="mydatabase"
# 备份文件保存路径和名称
BACKUP_DIR="/path/to/backup/dir"
BACKUP_FILE="$BACKUP_DIR/mydatabase_$(date +%Y%m%d%H%M%S).sql"
# 创建备份文件夹
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$USER -p$PASSWORD -h$HOST $DATABASE > $BACKUP_FILE
# 输出备份结果
echo "Backup completed: $BACKUP_FILE"
定时任务,这将在每天凌晨 1 点自动执行备份操作。
0 1 * * * /path/to/backup/mysql.sh
本文由 mdnice 多平台发布