MySQL网络安全&容灾备份
网络安全主要三个方面。一般云厂商都提供网络相关的安全:白名单、私有网络、SSL加密等。
网络:
MySQL服务器与客户端连接安全 SSL(TLS)加密传输。
账户使用较弱的密码或不使用密码,账号安全。valited_password。
账号权限,最小化原则。
网络访问控制,云厂商使用白名单,私有网络隔离。自建主要涉及防火墙,网络隔离。禁止内网里面进行公网IP私用。
操作系统
服务器存在额外的账户会增加MySQL的脆弱性。
账号密码安全。
防火墙。
文件系统
文件夹、数据文件、日志文件可以被其他用户访问
防火墙:指定配置的IP和端口进行访问。一般设置为办公场地固定IP,端口改为非默认端口。设定访问频率和协议。
网络隔离:就算是内网访问,也可以进行网络分区,普通网络无法直接访问数据库。需要单独配置访问策略。
SSL加密。一般MySQL本身支持。同时很多时候都有代理,需要代理支持常见的SSL。
数据库:
1. 数据库版本及运行要求
使用稳定的解决了已知漏洞的版本,如5.7.20,8.0.2等。
my.cnf配置 --skip-symbolic-links选项启动数据库:禁止在创建索引和创建表的时候,将索引文件和数据文件链接到其他文件。
2. 通用加固项
删除冗余数据库, 如test。drop database if exists ${dbname};
清除无用用户(没有用户名的用户)。 drop user ''
修改超级用户的密码。 ALTER USER 'root'@'localhost' IDENTIFIED WITH sha256_password BY 'pwd';
配置密码复杂度,使用validate_password.so插件。
以上可以使用mysql_secure_installation 来完成。
3. 用户权限
实际应用中,有修改mysql.user的用户都算超级用户,都禁止远程连接数据库。
避免以管理员用户创建存储过程和函数。
以下权限属于高级权限,避免授权给普通用户。
All/All Privileges权限代表全局或者全数据库对象级别的所有权限,不包括with option以及proxy权限。
Alter 权限代表允许修改表结构的权限。
Alter routine 权限代表允许修改或者删除存储过程、函数的权限
create 权限代表允许创建新的数据库和表的权限
Create routine权限代表允许创建存储过程、函数的权限
Create tablespace权限代表允许创建、修改、删除表空间和日志组的权限
Create temporary tables 权限代表允许创建临时表的权限
Create user权限代表允许创建、修改、删除、重命名user的权限
Drop权限代表允许删除数据库、表、视图的权限,包括truncate table命令
Event权限代表允许查询,创建,修改,删除MySQL事件
Execute权限代表允许执行存储过程和函数的权限
File权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用的命令包括load data infile,select … into outfile,load file()函数
Grant option权限代表是否允许此用户授权或者收回给其他用户你给予的权限,重新付给管理员的时候需要加上这个权限
Index权限代表是否允许创建和删除索引
Lock权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写。
Process权限代表允许查看MySQL中的进程信息,比如执行show processlist, mysqladmin processlist, show engine等命令
Reference权限是在5.7.6版本之后引入,代表是否允许创建外键。
Reload权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表
Replication client权限代表允许执行show master status,show slave status,show binary logs命令
Replication slave权限代表允许slave主机通过此用户连接master以便建立主从复制关系。
Show databases权限代表通过执行show databases命令查看所有的数据库名
Shutdown权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdown
Super权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接命令, change master to创建复制关系命令,以及create/alter/drop server等命令
Trigger权限代表允许创建,删除,执行,显示触发器的权限
普通权限:
Insert权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限
Update权限代表允许修改表中的数据的权限
Select权限代表允许从表中查看数据,某些不查询表数据的select执行则不需要此权限,如Select 1+1, Select PI()+2;而且select权限在执行update/delete语句中含有where条件的情况下也是需要的
Delete权限代表允许删除行数据的权限
Create view权限代表允许创建视图的权限
Show view权限代表通过执行show create view命令查看视图创建的语句
Usage权限是创建一个用户之后的默认权限,其本身代表连接登录权限
更改MySQL root用户的名字
update mysql.user set user='<your_account>' where user='root'
flush privileges
4. 连接设置
监听地址不允许包含*,0.0.0.0,:: [mysqld] bind-address=<’ServerIP’>
用户主机名不使用通配符%
超级管理员只能本地登录
更改MySQL默认监听3306端口
如果数据库不允许网络连接,仅支持本地通过socket连接。可以my.cnf中配置:
skip-networking
或者强制只监听本机:bind-address=127.0.0.1
禁用LOCAL INFILE命令,可以my.cnf中配置
set-variable=local-infile=0
限制数据库连接闲置等待时间
[mysqld] wait_timeout、interactive_timeout、slave-net-timeout
MySQL 5.7.17 以后提供了Connection-Control插件用来控制客户端在登录操作连续失败一定次数后的响应的延迟。该插件可有效的防止客户端暴力登录的风险(攻击),修改my.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=1000
connection-control-max-connection-delay=2147483647
5. ssl安全认证
确保对所有远端用户均需要使用SSL连接
GRANT USAGE ON *.* TO <my_user>@<host> REQUIRE SSL;
5.2确保 secure_file_priv 不是空:
secure_file_priv 限制客户端可以读取数据文件的路径,secure_file_priv设置合理的值可以有效降低 sql 注入后黑客读取数据库数据的可能性。SHOW VARIABLES like '%secure_file_priv%'
5.3复制安全
MASTER_SSL_VERIFY_SERVER_CERT指示从属设备是否应该验证主服务器的证书。此配置项可以设置为“是”或“否”,除非在从节点上启用了SSL,否则将忽略该值。 在mysql.slave_master_info表中
确保 master_info_repository 设置成 table,相对更安全。
6. 操作系统相关配置
6.1 禁止数据库启动用户交互式登录
/etc/passwd文件,在mysql用户对应行添加/sbin/nologin或/bin/false.
usermod -s /sbin/nologin mysql
6.2 文件权限
1. 禁止mysql_history文件记录信息
rm <your_path>/.mysql_history
ln -s /dev/null <your_path>/.mysql_history
sed -i '$a readonly MYSQL_HISTFILE=/dev/null' /etc/profile
2. 限制安装文件属主和权限
MySQL安装目录和文件属主要求为MySQL运行用户,目录权限要求为700,二进制文件为500,库文件为500,启动文件(一般位于/etc/init.d目录下)为500。
3. 限制数据库数据文件属主和权限
数据目录和文件属主为mysql用户,数据目录为700,数据文件为600。
chmod 700 <data_dir Value>
chown -R mysql:mysql <data_dir Value>
chmod 600 <data_dir Value>/*
4. 限制日志文件(含binlog)属主(mysql)和权限(600)
MySQL数据库中常见日志文件有:
- **错误日志**(log_error):
记录了MySQL的启停和运行过程。 log_error=/opt/mysql/data/aaa.err'
- **二进制日志**(log_bin):
记录了对数据库执行更改的所有操作。作用:数据恢复、复制、日志审计(如判断有无注入攻击)。
备注:bin_log.00001即是二进制日志,bin_log.index为索引文件。二进制日志可使用自带的**mysqlbinlog**工具查看。
- 慢查询日志(slow_query_log_file):
记录运行慢的sql,帮助进行sql优化。
slow_query_log=1 # 默认关闭,1启用,0禁用 [log_slow_queries]
slow_query_log_file=slow.log # 指定文件路径和名字;默认值是'主机名-slow.log',位于datadir目录
long_query_time=3 # 执行时间超过设置阈值(s)的sql语句会被记录在slow_query_log_file中
log_output=FILE,TABLE # 指定慢查询的输出方式,动态参数。 FILE:慢查询日志;TABLE:mysql.slow_log表
Tips: 可以借助**mysqldumpslow**命令帮助分析慢查询日志。
- 查询日志(general_log_file)
记录了所有对数据库请求的信息。
general_log=1 # 默认关闭,配置此参数开启查询日志。
general_log_file=/opt/mysql/data/general.log
mysql>set global general_log_file='/tmp/general.log';
mysql>set global general_log=on;
mysql>set global general_log=off;
与slow_log一样,可以将查询日志放入mysql.general_log表中。
5. 限制my.cnf文件属主和权限
chmod 600 /xxx/my.cnf
chown mysql:mysql /xxx/my.cnf
6. 限制Plugin目录及其文件权限
show variables where variable_name = 'plugin_dir';
chmod 500 <plugin_dir Value>
chown -R mysql:mysql <plugin_dir Value>
chmod 400 <plugin_dir Value>/*
7. 限制SSLfile文件权限
数据库运行用户,权限是否为400。
show variables like 'ssl%';
8、chroot
Unix操作系统中的chroot可以改变当前正在运行的进程及其子进程的root目录。重新获得另一个目录root权限的程序无法访问或命名此目录之外的文件。
9、mysql脚本安全mysql_config_editor
mysql_config_editor set --login-path=local --host=localhost --user=db_user --password
多实例:
mysql_config_editor set --login-path=local3306 --host=localhost --user=db_user --socket="/tmp/mysql.sock" --password
用户/密码将被保存在你的密码中。home/system_username/.mylogin.cnf 加密了的。看不到密码。
使用方法;
mysql --login-path=local -e "statement"
删除:
mysql_config_editor remove --login-path=local3306
输出:
mysql_config_editor print --login-path=local3306
修改:
mysql_config_editor reset --login-path=local3306 --host=localhost --user=db_user --socket="/tmp/mysql.sock" --password
7、程序相关
防止SQL注入攻击:SQL注入攻击是最常见和最具破坏力的MySQL攻击之一。
GreenSQL,具有数据库防火墙(Database Firewall)、数据库入侵检测系统(Database IDS),甚至数据库的入侵防御(Database IPS)、数据库虚拟补丁(Virtual Patching)的特性。已全面支持MS SQL、MySQL、PostgreSQL。
*访问敏感表(用户,帐户,信用卡信息)
*一个空密码字符串
*一个'或'查询标记内
*SQL表达式,它总是返回true(同义反复的SQL)
========================== 备份 恢复 =====================
容灾:同城容灾(多可用区实例)、异地容灾(两地多中心)。
1、使用高可用或集群架构,基于MGR。
2、可以让备节点处于其他可用区,或者机房。
3、可以进行异地容灾备份,备份数据。脚本定时任务自动备份。
4、备份方式,快照备份,物理备份xtrabackup,逻辑备份mysqldump,mysqlpump等,binlog备份多种备份结合。在slave上备份。
binlog备份。(备份恢复目录)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix