MySql安全配置

文章目录

操作系统级配置

2.1.3禁用MySQL命令历史记录

安全说明
在linux /UNIX上,mysql客户机将交互式执行的语句记录到一个历史文件中。默认情况下,该文件在用户的主目录中名为.mysql_history。大多数在mysql客户机应用程序中运行的交互式命令都保存到历史文件中。应该禁用mysql命令历史记录。
配置方法

  1. 如果存在.mysql_history,则删除它。
  2. 使用下面两种方法来防止它再次被创建:

a. 将mysql_histfile环境变量设置为/dev/null.这将需要放在shell的启动脚本中。
配置环境变量

vi ~/.bashrc

添加如下配置:

export MYSQL_HISTFILE=/dev/null

修改完后,保存退出,执行如下命令,使更改生效

source ~/.bashrc

b. 创建$HOME/mysql_history作为/dev/null的链接。

ln -s /dev/null $HOME/.mysql_history

2.1.4禁用MYSQL_PWD环境变量

安全说明
MYSQL_PWD是一种用于存储mysql密码的环境变量,以明文形式存储mysql密码,存在安全隐患。
检查方法
检查MYSQL_PWD环境变量是否存在于某个进程中:

grep MYSQL_PWD /proc/*/environ

如果有返回行说明那个进程使用了MYSQL_PWD环境变量。
配置方法
不设置环境变量或确保MYSQL_PWD环境变量未设置敏感信息,对使用MYSQL_PWD环境变量变量的脚本和进程,建议不再使用该环境变量。

2.1.5禁止MySQL操作系统账号登陆 *

安全说明
MySQL系统账号在安装完数据库后,不应该有其他用途。建议禁止该账号登陆操作系统。此举在防止黑客利用MySQL数据库漏洞反射shell有极佳效果。
检查方法
假设MySQL数据库操作系统账号就是mysql,执行下列命令:

getent passwd mysql | egrep "^.*[ \ /bin\ / false| \ / sbin \ / nologin]$"

如果没有返回行则说明存在安全隐患。
配置方法
执行下列语句禁止mysql用户(如hadoop)登陆:

usermod -s /sbin/nologin hadoop

回退步骤

usermod -s /bin/bash hadoop

文件系统权限

2.3.1设置“datadir”的权限

安全说明
如果允许MySQL用户以外的其他用户从数据目录中读取文件,那么该用户可能能够从包含密码的mysql.user表中读取数据。
配置方法
使用如下命令

chmod 700 <datadir>
chown mysql:mysql <datadir>

回退步骤

chmod 775 <datadir>

2.3.2设置“log-bin”二进制日志文件的权限

安全说明
log-bin就是binary log,即二进制日志文件,这个文件记录了mysql所有的dml操作。限制二进制日志文件的权限将有益于保护数据信息不泄漏,或被恶意修改。
检查方法

  1. 执行sql查看log-bin日志文件状态及相关配置
mysql> show variables like "log_bin%";
+---------------------------------+-------------------------------+
| Variable_name                   | Value                         |
+---------------------------------+-------------------------------+
| log_bin                         | ON                            |
| log_bin_basename                | /data/mysql/data/binlog       |
| log_bin_index                   | /data/mysql/data/binlog.index |
| log_bin_trust_function_creators | OFF                           |
| log_bin_use_v1_row_events       | OFF                           |
+---------------------------------+-------------------------------+
  1. 检查日志文件的权限是660并且属于mysql:mysql

配置方法

chmod 660 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下已开启binlog,文件权限为640,所属mysql:mysql

2.3.3设置“log_error”错误日志文件的权限

安全说明
错误日志记录了MySQL Server每次启动和关闭的详细信息以及运行过程中所有较为严重的告警和错误信息。限制错误日志文件的权限将有益于保护数据信息不泄漏,或被恶意修改。
检查方法

  1. 执行sql查看log-err日志文件状态及相关配置
mysql> show global variables like "log_error";
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| log_error     | /data/mysql/logs/mysqld.log |
+---------------+-----------------------------+
  1. 检查日志文件的权限是660并且属于mysql:mysql

配置方法

chmod 660 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下,错误日志文件权限为640,所属mysql:mysql

2.3.4设置“slow_query_log”慢查询日志文件的权限

安全说明
慢查询日志用来记录在MySQL中响应时间超过阀值(long_query_time)的语句。限制慢查询日志文件的权限将有益于保护数据信息不泄漏,或被恶意修改。
检查方法

  1. 执行sql查看slow_query_log慢查询日志文件状态及相关配置
mysql> show variables like "%slow_query_log%";
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log      | OFF                               |
| slow_query_log_file | /data/mysql/data/master2-slow.log |
+---------------------+-----------------------------------+
  1. 检查日志文件的权限是660并且属于mysql:mysql

配置方法

  1. 执行SQL语句,开启慢查询日志
mysql> set global slow_query_log = on;
Query OK, 0 rows affected (0.00 sec)
  1. 执行如下命令
chmod 660 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下,慢查询日志文件权限为640,所属mysql:mysql

2.3.5设置“relay_log_basename”中继日志文件的权限

安全说明
MySQL在进行主主复制或主从复制的时候会在home目录下面产生相应的relay log。限制中继日志文件的权限将有益于保护数据信息不泄漏,或被恶意修改。
检查方法

  1. 执行sql查看中继日志文件状态及相关配置
mysql> show variables like "relay_log_basename";
+--------------------+------------------------------------+
| Variable_name      | Value                              |
+--------------------+------------------------------------+
| relay_log_basename | /data/mysql/data/master2-relay-bin |
+--------------------+------------------------------------+
  1. 检查日志文件的权限是660并且属于mysql:mysql

配置方法

chmod 660 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下,中继日志文件权限为640,所属mysql:mysql

2.3.6设置“general_log”普通日志文件的权限

安全说明
记录建立的客户端连接和执行的语句。限制普通日志文件的权限将有益于保护数据信息不泄漏,或被恶意修改。
检查方法

  1. 执行sql查看普通日志文件状态及相关配置
mysql> show variables like "%general_log%";
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | OFF                          |
| general_log_file | /data/mysql/data/master2.log |
+------------------+------------------------------+
  1. 检查日志文件的权限是660并且属于mysql:mysql

配置方法

  1. 执行SQL语句,开启普通日志
mysql> set global general_log = on;
Query OK, 0 rows affected (0.00 sec)
  1. 执行如下命令
chmod 660 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下,普通日志文件权限为640,所属mysql:mysql

2.3.7设置SSL密钥文件的权限 *

安全说明
限制密钥文件的权限将有益于保护数据信息不泄露,或被恶意修改。
检查方法

  1. 执行sql查询密钥文件状态及相关配置
mysql> show variables where variable_name='ssl_key';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| ssl_key       | server-key.pem |
+---------------+----------------+
  1. 检查日志文件的权限是400并且属于mysql:mysql

配置方法
使用如下命令

chmod 400 <file_name>
chown mysql:mysql <file_name>

2.3.8设置plugin插件目录的权限

安全说明
限制插件目录的权限将有益于保护数据信息不泄露,或被恶意修改。
检查方法

  1. 执行sql查询插件目录状态及相关配置
mysql> show variables where variable_name='plugin_dir';
+---------------+-------------------------------------+
| Variable_name | Value                               |
+---------------+-------------------------------------+
| plugin_dir    | /usr/local/hadoop/mysql/lib/plugin/ |
+---------------+-------------------------------------+
  1. 检查日志文件的权限是755,并且属于mysql:mysql

配置方法
使用如下命令

chmod 755 <file_name>
chown mysql:mysql <file_name>

备注
8.0版本默认情况下,plugin插件目录的权限为755,所属mysql:mysql

MySQL权限安全

2.4.1设置仅管理员用户具有所有数据库的访问权限

安全说明
除了管理员账号,其他用户没必要有所有数据库的访问权限。过高的权限会导致安全问题。
检查方法

mysql> SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| root             | localhost |
+------------------+-----------+
mysql> SELECT user, host FROM mysql.db WHERE db = 'mysql' AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
Empty set (0.00 sec)

如果返回的都是管理员账号说明安全,否则需要对用户清除权限
配置方法
清除非管理员账号的过高部分权限

2.4.2禁用非管理员用户的“File_priv”

安全说明
File_priv权限用于允许或禁止MySQL用户在服务器主机上读写文件。黑客很可能利用这一点盗取数据库中敏感数据。
检查方法

mysql> select user, host from mysql.user where File_priv = 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限
配置方法

mysql> REVOKE FILE ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT FILE ON *.* TO user@localhost; //<user>为需要增加权限的用户

备注
8.0版本默认情况下,只有管理员账号拥有File_priv权限

2.4.3禁用非管理员用户的“Process_priv”

安全说明
Process_priv权限用于允许或禁止给定用户是否可以查看当前正在执行的sql语句。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where Process_priv = 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限
配置方法

mysql> REVOKE PROCESS ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT PROCESS ON *.* TO user@localhost; //user为需要增加权限的用户

备注
8.0版本默认情况下,只有管理员账号拥有Process_priv权限。

2.4.4禁用非管理员用户的“Super_priv”

安全说明
Super_priv权限用于允许或禁止给定用户是否可以执行任意语句,非管理员不应该具备该权限。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where Super_priv = 'Y';
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| root          | localhost |
+---------------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限
配置方法

mysql> REVOKE SUPER ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT SUPER ON *.* TO user@localhost; //user为需要增加权限的用户

备注
mysql.session‘@’localhost’:插件内部使用来访问服务器。该用户已被锁定,客户端无法连接。

2.4.5禁用非管理员用户的“Shutdown_priv”

安全说明
Shutdown_priv权限用于允许或禁止给定用户是否可以关闭数据库,会造成一定安全隐患。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where Shutdown_priv = 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限
配置方法

mysql> REVOKE SHUTDOWN ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT SHUTDOWN ON *.* TO user@localhost; //user为需要增加权限的用户

备注
8.0版本默认情况下,只有管理员账号拥有Process_priv权限。

2.4.6禁用非管理员用户的“Create_user_priv”

安全说明
Create_user_priv权限用于允许或禁止给定用户是否可以创建任意用户,会造成一定安全隐患。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where Create_user_priv = 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限。
配置方法

mysql> REVOKE CREATE USER ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT CREATE USER ON *.* TO user@localhost; //user为需要增加权限的用户

2.4.7禁用非管理员用户的“Grant_priv”

安全说明
Grant_priv权限用于允许或禁止给定用户是否可以对其他用户赋权,可能会被黑客利用造成一定安全隐患。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where Grant_priv= 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限。
配置方法

mysql> REVOKE GRANT ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT GRANT ON *.* TO user@localhost; //user为需要增加权限的用户

2.4.8禁用“Non-slave”用户的“repl_slave_priv”

安全说明
repl_slave_priv权限用于控制给定用户是否可以从主服务器上获取更新的数据。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user, host from mysql.user where repl_slave_priv = 'Y';
+------+-----------+
| user | host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

如果返回的都是管理员账号说明安全,否则需要对用户清除权限。
配置方法

mysql> REVOKE REPLICATION ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT REPLICATION ON *.* TO user@localhost; //user为需要增加权限的用户

2.4.9设置DML/DDL授权仅限于特定数据库和用户

安全说明
DML/DDL包括用于修改或创建数据结构的一组权限。这包括INSERT,SELECT,UPDATE,DELETE,DROP,CREATE和ALTER权限。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y' OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y' OR Drop_priv='Y' OR Alter_priv='Y';
+---------------+-----------+--------------------+
| User          | Host      | Db                 |
+---------------+-----------+--------------------+
| airflow       | %         | airflow            |
| hive          | %         | hive               |
| mysql.session | localhost | performance_schema |
| airflow       | master    | airflow            |
| hive          | master2   | hive               |
+---------------+-----------+--------------------+

确保返回的所有用户都应在指定的数据库上具有这些权限。
配置方法

mysql> REVOKE XXX ON *.* FROM '<user>; //<user>为需要撤销权限的用户

回退步骤

mysql> GRANT XXX ON *.* TO user@localhost; //user为需要增加权限的用户

审计和记录安全配置

2.5.1启用错误日志“log_error”

安全说明
错误日志包含有关事件的信息,例如mysqld启动和停止,何时需要检查和修复表,以及mysqld失败时堆栈跟踪。启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,如果没有启用错误日志,那么连接错误可能会被忽略。
检查方法

mysql> show variables like 'log_error';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| log_error     | /data/mysql/logs/mysqld.log |
+---------------+-----------------------------+

确保返回值不为空。
配置方法

  1. 打开MySQL配置文件my.cnf
  2. 将log-error选项设置为错误日志的路径。

2.5.2设置日志文件存储在非系统分区上

安全说明
MySQL日志文件可以在MySQL配置中设置,以存储在文件系统的任何位置。通常应将日志文件存放在非系统分区上。
检查方法

mysql> select @@global.log_bin_basename;
+---------------------------+
| @@global.log_bin_basename |
+---------------------------+
| /data/mysql/data/binlog   |
+---------------------------+

确保返回的值不为root(‘/’)、/var或/usr。
配置方法

  1. 打开MySQL配置文件my.cnf
  2. 将log-bin选项设置为不在root(‘/’)、/var或/usr上的目录上。

2.5.3确保“log_error_verbosity”被设置为2或3

安全说明
log_error_verbosity系统变量决定MySQL日志中记录的内容。值为1表示仅记录错误消息,值为2表示记录错误和警告消息,值为3表示记录错误、警告和注释消息。随着级别的调整会记录更多信息,调整到2有助于通过日志追查安全问题。
检查方法

mysql> show global variables like 'log_error_verbosity';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| log_error_verbosity | 2     |
+---------------------+-------+

如果返回值是1需要调整到2。
配置方法
打开MySQL配置文件my.cnf,在mysqld部分中添加如下参数

log_error_verbosity=2

备注
8.0版本默认情况下,log_error_verbosity参数的值为2。

2.5.4启动审计日志记录 *

2.5.5设置“log_raw”为OFF

安全说明
log-raw选项决定服务器是否重写密码,以便不以纯文本形式显示在日志文件中。如果启用了log-raw,则密码将以明文形式写入各种日志文件(普通查询日志、慢查询日志和二进制日志)
检查方法
打开MySQL配置文件my.cnf,确定log-raw被设置为OFF
配置方法
1、打开MySQL配置文件my.cnf,在mysqld部分中添加如下参数

log-raw=OFF

2、重启mysql服务
备注
8.0版本默认情况下,log-raw选项的默认值为OFF。

认证

2.6.1禁止在全局配置中存储密码

安全说明
MySQL配置文件的[client]部分允许设置要使用的用户和密码。在全局配置中使用密码参数可能会造成用户密码的泄漏。
检查方法
打开MySQL配置文件my.cnf,检查[client]部分,确保未使用密码。
配置方法
使用mysql_config_editor以加密形式在.mylogin.cnf中存储身份验证凭据。

2.6.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选项已经被删除。

2.6.3确保无空口令用户

安全说明
空口令允许用户在不使用密码的情况下登录。入侵者只要知道用户名和主机允许列表,就可以绕过身份验证随意登录数据库,进行违规操作。
检查方法

mysql> SELECT User,host FROM mysql.user WHERE authentication_string='';
Empty set (0.00 sec)

如果所有帐号都设置了密码,则不会返回任何行。
配置方法

SET PASSWORD FOR 'user'@'host' =<clear password>;

2.6.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;

2.6.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提供了更好的性能和更高的密码安全性。

2.6.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='%';

2.6.7确保无匿名帐户

安全说明
匿名用户是空的,也没有密码,安全性很差,任意人员都可以利用匿名用户访问数据库。
检查方法

mysql> select user,host from mysql.user where user='';
Empty set (0.00 sec)

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

网络设置

2.7.1设置“have_ssl”为YES

安全说明
在不受信任的网络上传输时,所有网络流量都必须使用ssl/tls。受SSL/TLS协议保护的MySQL有助于防止窃听和中间人攻击。
检查方法

mysql> show variables where variable_name='have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   |
+---------------+-------+
1 row in set (0.00 sec)

查看返回值是否为YES。
配置方法
可参考:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html

2.7.2设置远程用户的“ssl_type” *

安全说明
在不受信任的网络上传输时,所有网络流量都必须使用ssl/tls。对于通过网络进入系统的用户,应该基于每个用户强制执行SSL/TLS。受SSL/TLS协议保护的MySQL有助于防止窃听和中间人攻击。
检查方法

mysql> select user,host,ssl_type from mysql.user where not host in('::1','127.0.0.1','localhost');
+---------+-------------+----------+
| user    | host        | ssl_type |
+---------+-------------+----------+
| airflow | 10.20.71.%  |          |
| hive    | 10.20.71.%  |          |
| root    | 10.20.71.%  |          |
| airflow | 10.27.141.% |          |
| hive    | 10.27.141.% |          |
| root    | 10.27.141.% |          |
+---------+-------------+----------+
6 rows in set (0.01 sec)

验证返回的每个用户的ssl_type是否等于ANY,X509或SPECIFIED。
配置方法

grant usage on airflow.* to 'airflow'@'10.20.71.%' require ssl;

基本安全配置

2.8.1安装最新的安全补丁

安全说明
确保数据库版本为最新并修复已知的安全漏洞。攻击者可能会利用已知的漏洞对MySQL服务器进行攻击。
检查方法

mysql> show variables where variable_name like 'version';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| version       | 8.0.16 |
+---------------+--------+
1 row in set (0.00 sec)

显示当前的数据库版本,查看MySQL官网,比较补丁修复情况。
配置方法
安装最新版本的补丁或升级到最新版本。

2.8.2删除默认安装数据库test

安全说明
MySQL安装时默认创建一个测试数据库test,完全的空数据库,没有任何表,可以删除。测试数据库可以被所有用户访问,并且可以用来消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。
检查方法

mysql> show databases like 'test';
Empty set (0.00 sec)

检查test数据库是否存在。
配置方法

mysql> drop database test;

2.8.3设置“allow-suspicious-udfs”为“FALSE”

安全说明
该选项控制是否可以载入主函数只有 xxx 符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的 UDF。关闭allow-suspicious-udfs,可以防止通过共享对象文件加载存在威胁的UDFs函数。
检查方法
查看MySQL配置文件allow-suspicious-udfs参数的设定:cat /etc/my.cnf
确认allow-suspicious-udfs不等于TRUE
配置方法

  1. 修改MySQL配置文件my.cnf,删除以下安全参数
    allow-suspicious-udfs=TRUE (或者将TRUE改为FALSE,具体效果一样)
  2. 重启mysql服务。

2.8.4禁用“local_infile”

安全说明
local_infile参数决定是否可以通过LOAD DATA LOCAL INFILE来实现加载或或选择位于MySQL客户端计算机上的文件。禁用local_infile可以阻止黑客利用sql注入来读取数据库文件,减小黑客给数据库带来的安全损失。
检查方法

mysql> show variables where variable_name='local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

确认local_infile不等于ON。
配置方法

  1. 修改MySQL配置文件my.cnf,在配置文件的[mysqld]部分添加如下配置参数
local_infile=0 // 0代表OFF
  1. 重启MySQL服务。

2.8.5禁用“skip-grant-tables”

安全说明
数据库启动的时候 跳过权限表的限制,不用验证密码,直接登录。如果不关闭此参数,所有账号可以不受限制的/免密访问任意数据库。会导敏感数据外泄。
检查方法
查看MySQL配置文件skip-grant-tables参数的设定:cat /etc/my.cnf
确认skip-grant-tables不等于TRUE。
配置方法

  1. 修改MySQL配置文件my.cnf,在配置文件的[mysqld]部分添加如下配置参数
skip-grant-tables=FALSE //默认值为FALSE
  1. 重启MySQL服务。

备注
这种情况只有在忘记root密码 不得已重启数据库的情况下使用的。现网环境慎用,需要重启数据库,并且安全性也比较难以保证。

2.8.6开启“skip-symbolic-links”

安全说明
开启skip-symbolic-links可以禁止数据库用户删除或重名数据文件目录之外的文件。多个客户可能会访问同一个数据库,若使用链接文件可能会导致外部客户锁定 MySQL 服务器。
检查方法

mysql> show variables like 'have_symlink';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_symlink  | DISABLED |
+---------------+----------+
1 row in set (0.00 sec)

确认返回的值为DISABLED.
配置方法

  1. 修改MySQL配置文件my.cnf,在配置文件的[mysqld]部分添加如下配置参数
skip-symbolic-links=yes //默认值为no
  1. 重启MySQL服务。
    备注
    后续版本–symbolic-links, --skip-symbolic-links会被删除,系统变量have_symlink也会被删除。

2.8.7禁用“daemon_memcached”插件

安全说明
InnoDB memcached插件允许用户使用memcached协议访问存储在InnoDB中的数据。默认情况下,插件未开启认证,任何人可以利用daemon_memcached来访问或修改一部分数据,给数据库造成信息泄漏的隐患。
检查方法

mysql> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME='daemon_memcached';
Empty set (0.00 sec)

如果有返回行数说明有插件,需要删除。默认情况下是禁用的。
配置方法
运行如下命令删除插件。

mysql> uninstall plugin daemon_memcached;

2.8.8设置“sql_mode”包含“STRICT_TRANS_TABLES”

安全说明
sql_mode模式有三种,STRICT_TRANS_TABLES是其中一种模式。当执行数据更新操作(如INSERT,UPDATE),MySQL依据是否启用严格的SQL_mode处理非法与丢失的数值。STRICT_TRANS_TABLES模式会检查所有更新的数据,在一定程度可以给入侵者规避检测带来阻碍。
检查方法

mysql> show variables like 'sql_mode';
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                 |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| 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.01 sec)

如果返回的列表中包含STRICT_TRANS_TABLES说明安全,否则需要修复。
配置方法

  1. 修改MySQL配置文件my.cnf,添加如下配置参数
sql_mode=STRICT_ALL_TABLES //默认为STRICT_TRANS_TABLES模式
  1. 重启MySQL服务。

2.8.9设置“MASTER_SSL_VERIFY_SERVER_CERT”为YES或1 *

安全说明
MASTER_SSL_VERIFY_SERVER_CERT指示从属设备是否应该验证主服务器的证书。此配置项可以设置为“是”或“否”,除非在从节点上启用了SSL,否则将忽略该值。使用SSL时,证书验证对于正在建立验证连接的一方非常重要。这种情况下,客户端应验证服务器的证书。
检查方法

mysql> select ssl_verify_server_cert from mysql.slave_master_info;
Empty set (0.00 sec)

检查返回值是否为1,如果不为1,需要配置。
配置方法
执行如下sql语句。

stop slave;
change master to MASTER_SSL_VERIFY_SERVER_CERT=1;
start slave;

2.8.10设置复制用户的“super_priv” *

安全说明
mysql.user表中的super权限控制着各种mysql功能的使用,这些功能包括:change master to, kill, mysqladmin kill选项,purge binary logs,set global,mysqladmin调试选项,日志记录控制等。super_priv权限允许委托账号执行任意语句,非管理员不应该具备该权限。使用超越当前用户权限的权利。可以被攻击者所利用。
检查方法

mysql> select user,host from mysql.user where Super_priv='Y';
+---------------+-------------+
| user          | host        |
+---------------+-------------+
| root          | 10.64.73.%  |
| root          | 10.62.151.% |
| mysql.session | localhost   |
| root          | localhost   |
+---------------+-------------+
4 rows in set (0.00 sec)

确保返回的没有复制用户。如果有,需要修改。
配置方法
对每个复制用户,执行如下sql语句(将“repl”替换为复制用户的名称)

revoke super on *.* from 'repl';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章