MySQL安全配置之认证
1. 禁止在全局配置中存储密码
安全说明
MySQL配置文件的[client]部分允许设置要使用的用户和密码。在全局配置中使用密码参数可能会造成用户密码的泄漏。
检查方法
打开MySQL配置文件my.cnf,检查[client]部分,确保未使用密码。
配置方法
使用mysql_config_editor以加密形式在.mylogin.cnf中存储身份验证凭据。
2. 设置“sql_mode”包含“NO_AUTO_CREATE_USER”
安全说明
sql_mode模式有三种,STRICT_TRANS_TABLES是其中一种模式。当执行数据更新操作(如INSERT、UPDATE),MySQL依据是否启用严格的SQL_MODE处理非法与丢失的数据。NO_AUTO_CREATE_USER是sql_mode的一个选项,可以阻止grant语句在特定情况下自动创建用户,给数据库带来安全隐患。
检查方法
mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@session.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
确保每个结果包含NO_AUTO_CREATE_USER。
配置方法
打开MySQL配置文件my.cnf,在[mysqld]区域中找到sql_mode设置,将NO_AUTO_CREATE_USER添加到sql_mode设置。
备注
从MySQL8.0.11版本开始,sql_mode模式的NO_AUTO_CREATE_USER选项已经被删除。
3. 确保无空口令用户
安全说明
空口令允许用户在不使用密码的情况下登录。入侵者只要知道用户名和主机允许列表,就可以绕过身份验证随意登录数据库,进行违规操作。
检查方法
mysql> SELECT User,host FROM mysql.user WHERE authentication_string='';
Empty set (0.00 sec)
如果所有帐号都设置了密码,则不会返回任何行。
配置方法
SET PASSWORD FOR 'user'@'host' = ‘<clear password>’;
4. 设置“default_password_lifetime”小于或等于90
安全说明
default_password_lifetime用于设置口令(即密码)的生存周期(因数据库可用性要求高,不强制启用),推荐口令最长不超过3个月更改一次,密码永不过期,无法保证口令的安全性。
检查方法
- 查看全局密码过期的参数设置
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| default_password_lifetime | 0 |
+---------------------------+-------+
1 row in set (0.00 sec)
- 查看未设置密码过期策略的用户
mysql> select user,host,password_lifetime,password_last_changed,password_expired from mysql.user where password_lifetime is NULL;
+------------------+-----------+-------------------+-----------------------+------------------+
| user | host | password_lifetime | password_last_changed | password_expired |
+------------------+-----------+-------------------+-----------------------+------------------+
| airflow | % | NULL | 2019-07-24 14:56:45 | N |
| hive | % | NULL | 2019-06-01 16:03:34 | N |
| root | % | NULL | 2019-07-03 10:02:42 | N |
| mysql.infoschema | localhost | NULL | 2019-06-01 14:31:44 | N |
| mysql.session | localhost | NULL | 2019-06-01 14:31:44 | N |
| mysql.sys | localhost | NULL | 2019-06-01 14:31:44 | N |
| root | localhost | NULL | 2019-07-03 09:41:06 | N |
| airflow | master | NULL | 2019-07-24 15:28:29 | N |
| hive | master2 | NULL | 2019-06-01 15:55:56 | N |
+------------------+-----------+-------------------+-----------------------+------------------+
9 rows in set (0.00 sec)
配置方法
全局参数设置(因数据库可用性要求高,不强制启用)
- 打开MySQL配置文件my.cnf,添加安全参数
[mysqld]
default_password_lifetime=90
- 重启mysql服务
特定用户口令过期设置
ALTER USER 'XXXX'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
5. 设置口令复杂度
安全说明
口令应符合口令策略,要求包含数字、字符、大小写和特殊字符,且长度大于等于8位。弱口令容易被恶意攻击者爆破。
检查方法
mysql> show global variables like ‘%password%’;
±---------------------------------------------±----------------+
| Variable_name | Value |
±---------------------------------------------±----------------+
| caching_sha2_password_auto_generate_rsa_keys | ON |
| caching_sha2_password_private_key_path | private_key.pem |
| caching_sha2_password_public_key_path | public_key.pem |
| default_password_lifetime | 0 |
| disconnect_on_expired_password | ON |
| mysql_native_password_proxy_users | OFF |
| password_history | 0 |
| password_require_current | OFF |
| password_reuse_interval | 0 |
| report_password | |
| sha256_password_auto_generate_rsa_keys | ON |
| sha256_password_private_key_path | private_key.pem |
| sha256_password_proxy_users | OFF |
| sha256_password_public_key_path | public_key.pem |
±---------------------------------------------±----------------+
14 rows in set (0.00 sec)
配置方法
从MySQL8.0开始,安全策略有了重大加强,采用了新的密码插件,增加历史密码限制、双密码、密码强度约束等新特性。从MySQL 8.0开始将caching_sha2_password作为默认的身份验证插件,而不再使用mysql_native_password插件。caching_sha2_password提供了更好的性能和更高的密码安全性。
6. 禁用用户的通配符主机名
安全说明
确保用户不允许所有IP访问,若某一数据库用户支持所有IP访问,一旦账号密码泄漏,数据库就变得很不安全。
检查方法
mysql> SELECT user, host FROM mysql.user WHERE host = '%';
+---------+------+
| user | host |
+---------+------+
| airflow | % |
| hive | % |
| root | % |
+---------+------+
3 rows in set (0.00 sec)
配置方法
将用户的IP改为指定IP或IP网段可访问。如:
use mysql;
update user set user.host='10.60.151.%' where user.user='root' and user.host='%';
7. 确保无匿名帐户
安全说明
匿名用户是空的,也没有密码,安全性很差,任意人员都可以利用匿名用户访问数据库。
检查方法
mysql> select user,host from mysql.user where user='';
Empty set (0.00 sec)
没有行数返回证明安全,否则需要修复。
配置方法
删除匿名帐户。
版权声明:
作者:SE_Ning
链接:https://www.cnesa.cn/915.html
来源:CNESA
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论