在Linux系统下对MySQL进行安全设置是保护数据库免受未授权访问和攻击的重要步骤。以下是一个全面的安全设置指南:
1. 密码复杂度策略
- 设置最小密码长度:例如至少8个字符。
- 要求密码包含:大写字母、小写字母、数字以及特殊字符。
- 不允许使用历史记录中的旧密码。
示例配置(/etc/login.defs):
PASS_MAX_DAYS 90 # 密码有效期 PASS_MIN_DAYS 0 # 密码修改间隔 PASS_MIN_LEN 8 # 密码最小长度 PASS_WARN_AGE 7 # 密码到期前警告
示例配置(/etc/pam.d/system-auth):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
2. 登录失败策略
- 限制非法尝试登录的次数:例如配置3次锁定、锁定时长60分钟。
示例配置(/etc/pam.d/sshd):
auth required pam_tally2.so onerr=fail deny=3 unlock_time=1800 even_deny_root root_unlock_time=300
3. 登录超时策略
- 设置合理的会话超时时间:例如30分钟。
示例配置(/etc/profile):
TMOUT=1800
4. MySQL权限和访问控制
- 查看所有账户:
select user,host from mysql.user;
- 禁止空账户/空密码:
select user,password from mysql.user where user=''; select user,password from mysql.user where password='';
- 修改root用户名:
update user set user='xxxxx' where user='root';
- 查看账号权限:
show grants for '用户名'@'主机域';
- 为账号赋予全局/库/表/字段各层级权限:
grant 权限1 权限2 权限3... on 数据库名称.表名称 to '用户名'@'用户地址';
- 禁止远程root登录:
update user set host='localhost' where user='root';
- 为远程连接账号限定ip地址/网段:
update user set host='ip地址' where user='xxx';
- 关闭MySQL远程连接:
[mysqld] bind_address=127.0.0.1 skip_networking=1
5. 使用SSL加密连接
- 配置MySQL使用SSL加密连接:在客户端和服务器端都进行相应的配置。
示例配置(/etc/my.cnf):
[mysqld] ssl-ca=/path/to/ca.pem ssl-cert=/path/to/server-cert.pem ssl-key=/path/to/server-key.pem
6. 监控和日志记录
- 启用auditd/rsyslog:
service auditd status service rsyslog status
- 记录特定用户登录认证、操作数据库的行为。
- 控制MySQL命令历史记录、.mysql_history、.bash_history文件的权限。
7. 账户策略
- 合理分配不同的管理角色:创建系统管理员、安全管理员和审计管理员等角色,并为每个角色设定相应的权限。
示例:
groupadd sysgroup useradd -g sysgroup sys passwd sys mkdir /vartest chown -R sys:sysgroup /vartest chmod 741 /vartest
8. 定期更新和打补丁
- 定期更新MySQL及其相关组件:确保已应用最新的安全补丁。
示例:
yum update mysql-server
9. 使用防火墙限制访问
- 使用Linux防火墙(如iptables或ufw)限制对MySQL服务器的访问:只允许特定的端口和IP地址访问。
示例配置(iptables):
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT iptables -A INPUT -j DROP
10. 配置最小权限原则
- 为用户分配尽可能低的权限:仅授予完成其任务所需的最小权限。
示例:
revoke all on *.* from 'username'@'host'; grant select on database.* to 'username'@'host';
通过以上步骤,可以显著提高Linux下MySQL数据库的安全性,保护数据免受未授权访问和潜在的安全威胁。