0x00 MySQL应用介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL 最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。
0x01 为什么要做安全配置
MySQL数据库安全不仅仅是及时安装补丁进行升级就能保证数据库的安全。如果一个最新版本的MySQL存在空密码或匿名账号,无需密码就能够登录,会更加容易被攻击。因此做好MySQL的安全配置同样十分的重要。
0x02 如何进行安全配置
1.禁止mysql以管理员账号权限运行
MySQL应该使用非管理员账号运行,以普通帐户安全运行mysqld
加固方法:在MySQL my.cnf配置文件中应配置user=mysql
2.配置日志功能
MySQL应该配置日志功能,其中包含错误日志、二进制日志、置慢查询日志、通用查询日志、更新日志。
加固方法:编辑my.cnf文件,设置log_error=/home/mysql.err、log_bin =mysql-bin、slow_query_log= 1、general_log =1、log_slave_updates=1
3.不存在匿名账户
数据库用户应不存在匿名账户,匿名帐户是具有空用户名的用户。 匿名帐户没有密码,所以任何人都可以使用它们连接到MySQL服务器。
加固方法:使用查询语句,查找数据库中的匿名用户,为每个匿名用户分配一个名字,或删除此用户。
4.不存在空密码
数据库中所有用户应都配置密码,空密码允许用户在不使用密码的情况下登录。
加固方法:使用以下语句为用户设置一个密码(示例):
5.配置合适的密码复杂度
数据库用户密码复杂性包括密码特征,如长度,大小写,长度和字符集。
加固方法:添加以下配置到全局配置
plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=14
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_special_char_count=1
validate_password_policy=MEDIUM
并更改密码与用户名相同的用户密码
6.删除测试安装的test库
默认的MySQL安装包含一个名为test的未使用数据库。建议删除test数据库。
加固方法:执行以下SQL语句删除test数据库:
7.禁止MySQL对本地文件存取
应禁止MySQL对本地文件存取,local_infile参数决定MySQL客户端计算机上的文件是否可以通过LOAD DATA INFILE或SELECT加载或查询。
加固方法:在数据库my.cnf文件中应配置local-infile=0
8.MySQL用户禁用交互式登录
创建时,MySQL用户可以交互访问操作系统,这意味着MySQL用户可以像任何其他用户那样登录主机。应禁用MySQL用户交互式登录
加固方法:执行以下命令:
9.安装最新的安全补丁
MySQL应安装最新补丁进行升级,以防止漏洞被攻击者利用。
加固方法:升级MySQL到最新版
10.'mysqld'启动没有配置'--skip-grant-tables'
MySQL配置文件中skip-grant-tables选项会导致MySQL在不使用权限系统的情况下启动。
加固方法:MySQL配置文件中skip-grant-tables应设置为:FALSE,并且启动参数不包含--skip-grant-tables
11.用户密码过期时间小于等于90天
数据库提供了配置配置数据库密码的过期时间,用户密码过期时间应设置小于等于90天。
加固方法:配置MySQL RDBMS:
全局策略:SET GLOBAL default_password_lifetime=90
并配置:default_password_lifetime=90
12.数据库位于非系统分区
通常情况下,主机操作系统应该包含不同的文件系统分区以用于不同的目的。一组文件系统通常称为"系统分区",通常用于主机系统/应用程序操作。另一组文件系统被称为"非系统分区",一般用于存储数据。MySQL数据库的datadir挂载点应不为:root('/'),"/var" 和 "/usr"。
加固方法:
1) 为MySQL数据选择一个非系统分区的新位置
2) 执行如下命令停止mysqld:servicemysql stop
3) 执行如下命令复制数据:cp-rp
在MySQL配置文件中将datadir设置为新位置
执行如下命令启动mysqld:servicemysql start
13.只有管理用户具有完整的数据库访问权限
MySQL数据库中mysql.user和mysql.db表列出了可以授予(或拒绝)给MySQL用户的各种权限。一些关注的特权包括:Select_priv,Insert_priv,Update_priv,Delete_priv,Drop_priv等等。通常,这些特权不应该对每个MySQL用户都可用,而且通常只保留给管理员使用。
加固方法:列举审计程序结果统计的非管理员用户,对于每个非管理用户,使用REVOKE语句来适当删除权限。
14.禁用MySQL命令历史记录
在Linux/UNIX系统中,MySQL客户端将交互式执行的语句记录到历史文件中。默认情况下,该文件在用户的主目录中被命名为.mysql_history。在MySQL客户端应用程序中运行的大多数交互式命令都被保存到历史文件中。应该禁用MySQL命令历史记录。
加固方法:
1) 删除.mysql_history(如果存在)。
2) 使用方法防止再次创建:
将MYSQL_HISTFILE环境变量设置为/dev/null。需要放在shell启动脚本中。
创建软链接。> ln -s /dev/null $HOME/.mysql_history
15.所有远程用户的'ssl_type'应设置为'ANY', 'X509', 'SPECIFIED'
所有网络流量在不受信任的网络上传输时必须使用SSL/TLS。对于通过网络进入系统的用户,每个必须强制使用SSL/TLS。
加固方法:使用GRANT语句配置使用SSL:
0x03 总结
对MySQL进行安全配置可以有效的防范一些常见安全问题,按照基线标准做好安全配置能够减少安全事件的发生。国内常见的基线标准有中国信息安全等级保护、工信部基线配置要求,美国CIS基线也有详细的MySQL基线标准,不同的企业也可以根据自身企业业务制定符合自己企业的安全基线标准。
0x04 参考链接
国家信息安全等级保护制度要求
CIS_Oracle_MySQL_Community_Server_5.7_Benchmark_v1.0.0
YDT 2700-2014 电信网和互联网安全防护基线配置要求及检测要求 数据库
领取专属 10元无门槛券
私享最新 技术干货