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个月更改一次,密码永不过期,无法保证口令的安全性。
检查方法

  1. 查看全局密码过期的参数设置
mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 0     |
+---------------------------+-------+
1 row in set (0.00 sec)
  1. 查看未设置密码过期策略的用户
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)

配置方法
全局参数设置(因数据库可用性要求高,不强制启用)

  1. 打开MySQL配置文件my.cnf,添加安全参数
[mysqld]
default_password_lifetime=90
  1. 重启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)

没有行数返回证明安全,否则需要修复。
配置方法
删除匿名帐户。

版权声明:
作者:youlijiang
链接:https://www.cnesa.cn/915.html
来源:正群欣世
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>