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';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章