【安全基線】-MySQL安全配置規范


1. 概述

1.1 博客背景

苦惱於當前互聯網上現擁有的基線資源不具備實時性,適用的版本比較老舊,甚至已逐步被企業淘汰。

文檔中的眾多配置項在現使用版本的MySQL已不復存在,或是檢查加固的命令由於系統的升級已不再適用。

博主本着學習實驗的心態,充當互聯網優秀資源的搬運者、整合者、二次加工者,寫下這篇博客,希望能給那些同我有着相同困擾的安全從業者、DBA、安全運維工程師捎去一絲便利。

1.2 基線目標

通過在系統生命周期不同階段對目標系統展開各類安全檢查,找出不符合基線定義的安全配置項並選擇和實施安全措施來控制安全風險,並通過對歷史數據的分析獲得系統安全狀態和變化趨勢。

1.3 適用版本

本安全基線的適用版本為:MySQL 5.7 Community Server 社區版本。

MySQL 5.7 Enterprise版本存在額外獨有的附加配置項待進一步配置,包括但不限於:

  • 確保audit_log_connection_policy被設置成ERRORS或ALL
  • 確保audit_log_exclude_accounts中設置的內容不會讓某些用戶的行為逃避審計
  • 確保audit_log_include_accounts中設置為空
  • 確保audit_log_policy設置為LOGINS或更高級別
  • 確保audit_log_statement_policy中設置為ALL
  • 確保audit_log_strategy設置為SYNCHRONOUS或SEMISYNCHRONOUS

1.4 參考標准  

  • 《ISO/IEC 27001:2013 信息技術 安全技術 信息安全管理體系 要求》;
  • 《GB/T 22080-2016 信息技術 安全技術 信息安全管理體系 要求》;
  • 《GB/T 22239-2008信息安全技術 信息系統安全等級保護基本要求》;
  • 《CIS MySQL 5.7 benchmark》

2. 基本安全配置

2.1 安裝補丁

名稱

補丁安裝

實施目的

確保數據庫版本為最新並修復已知的安全漏洞

問題影響

系統存在嚴重的安全漏洞,容易被黑客攻擊利用

升級MySQL版本要求重啟服務器

系統當前狀態

顯示當前的數據庫版本

mysql> SHOW VARIABLES WHERE Variable_name LIKE "version";

判斷依據

查看MySQL官網,比較補丁修復情況

實施步驟

請慎重對數據庫系統打補丁,補丁安裝應當先在測試機上完成。補丁安裝可能導致系統或某些服務無法工作正常。在下載補丁包時,一定要對簽名進行核實,防止執行特洛伊木馬。

2.2 刪除默認安裝數據庫test

名稱

刪除默認安裝數據庫test

說明

MySQL安裝時默認創建一個測試數據庫test,完全的空數據庫,沒有任何表,可以刪除。

問題影響

測試數據庫可以被所有用戶訪問,並且可以用來消耗系統資源。 刪除測試數據庫將減少MySQL服務器的攻擊面。

檢查方法

執行以下SQL語句以檢查test數據庫是否存在

mysql> SHOW DATABASES LIKE 'test';

參考值

clip_image002[18]

實施步驟

刪除test數據庫:

mysql>DROP DATABASE "test";

回退方案

備注

5.7及以上版本默認情況下不存在test數據庫

2.3 修改root用戶名

名稱

修改root用戶名

說明

MySQL默認用戶root應該修改名稱,以減小攻擊面。

問題影響

防止黑客針對用戶名進行密碼猜測攻擊。

檢查方法

執行sql檢查數據庫是否有默認用戶root:

mysql> SELECT user from mysql.user where user='root;

如果有返回行則需要修改

clip_image002[22]

參考值

Empty set (0.00 sec)

實施步驟

mysql> update user set name='newname' where name='oldname';

mysql> flush privileges;

回退方案

2.4 MySQL操作系統賬號權限最小化

名稱

MySQL操作系統賬號權限最小化

說明

MySQL在操作系統上的賬號權限最小化有助於減小MySQL數據庫漏洞造成的影響。

問題影響

防止黑客利用MySQL漏洞入侵操作系統,造成更大損失。

檢查方法

假設MySQL賬號為mysql,執行命令

ps -ef | egrep "^mysql.*$"

如果沒有返回行,則權限存在問題

參考值

存在返回行

clip_image002[24]

實施步驟

創建一個僅用於運行MySQL和直接相關進程的用戶

回退方案

2.5 禁止MySQL鏈接歷史記錄

名稱

禁止MySQL鏈接歷史記錄

說明

MySQL會把客戶端登陸的交互執行記錄保存在.mysql_history文件中。

問題影響

該記錄有可能會暴露登陸過程中的敏感信息。建議刪除該記錄

檢查方法

檢查.mysql_history文件是否存在(默認在home下):

find /home -name ".mysql_history"

如果有返回行說明存在.mysql_history文件,建議刪除。

參考值

無返回行

實施步驟

1. 如果存在.mysql_history,則刪除

rm –f . mysql_history

2. 創建鏈接,防止.mysql_history再次生成

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

或采用修改mysql_history的環境變量讓他的值等於 /dev/null

2.6 禁止MYSQL_PWD的使用

名稱

禁止MYSQL_PWD的使用

說明

MYSQL_PWD是一種用於存儲mysql密碼的環境變量。

問題影響

以明文形式存儲mysql密碼,存在安全隱患。

檢查方法

檢查MYSQL_PWD環境變量是否存在於某個進程中:

grep MYSQL_PWD /proc/*/environ

如果有返回行說明那個進程使用了MYSQL_PWD環境變量。

參考值

無返回行

實施步驟

對使用MYSQL_PWD環境變量變量的腳本和進程,建議不在使用該環境變量。

2.7 禁止MySQL操作系統賬號登陸

名稱

禁止MySQL操作系統賬號登陸

說明

MySQL做系統賬號在安裝完數據庫后,不應該有其他用途。建議禁止該賬號登陸操作系統。

問題影響

此舉在防止黑客利用MySQL數據庫漏洞反射shell有極佳效果。

檢查方法

假設MySQL數據庫操作系統賬號就是mysql,執行下列命令:

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

如果沒有返回行則說明存在安全隱患。

參考值

clip_image004[4]

實施步驟

執行下列語句禁止mysql登陸:

usermod -s /sbin/nologin mysql

回退步驟

usermod -s /bin/bash mysql

2.8 更改MySQL默認端口

名稱

更改MySQL默認端口

說明

使用默認端口,會更容易被黑客在網絡中發現數據庫

問題影響

改成其他端口有助於隱藏數據庫,防止被黑客入侵。

檢查方法

show global variables like 'port';

如果返回是3306,則說明需要修改端口

參考值

除3306以外的任何端口

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

port=XXXX (除3306以外的任何端口)

2. 重啟mysql服務

systemctl restart mysqld

回退步驟

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

3. 文件系統權限

3.1 log-bin二進制日志

名稱

log-bin二進制日志

說明

log-bin就是binary log,二進制日志文件,這個文件記錄了mysql所有的dml操作。

問題影響

限制二進制日志文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查看log-bin日志文件狀態及相關配置

    mysql> show variables like 'log_bin%';

clip_image002[26]

2. 檢查日志文件的權限是660並且屬於mysql:mysql

參考值

  • log_bin=ON
  • log_bin_basename=/var/lib/mysql/mysql-bin
  • log_bin_index=/var/lib/mysql/mysql-bin.index
  • 文件權限=660
  • 文件所屬mysql:mysql

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

log_bin= /var/lib/mysql/mysql-bin   // 5.7默認未開啟binlog

server-id=1 //隨機指定不和其他集群中機器重名的字符串,如果只有一台機器,那就可以隨便指定了

2. 重啟mysql服務

systemctl restart mysqld

3. chmod 660 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

備注

備注:自動設置log_bin_index文件為你指定的文件名后跟.index

5.7版本若不添加server-id,重啟mysql服務會報錯

8.0版本默認情況下已開啟binlog,文件權限為640,所屬mysqlmysql

3.2 log-err錯誤日志

名稱

log-err錯誤日志

說明

錯誤日志記錄了MySQL Server每次啟動和關閉的詳細信息以及運行過程中所有較為嚴重的警告和錯誤信息

問題影響

限制日志文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查看log-err日志文件狀態及相關配置

mysql> show global variables like 'log_error';

clip_image004[6]

2. 檢查日志文件的權限是660並且屬於mysql:mysql

參考值

  • log_error=/var/log/mysqld.log //默認開啟log_error,默認徑/var/log/mysqld.log
  • 文件權限=660
  • 文件所屬mysql:mysql

實施步驟

chmod 660 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

3.3 log-slow-queries慢查詢日志

名稱

log-slow-queries慢查詢日志

說明

它用來記錄在MySQL中響應時間超過閥值(long_query_time)的語句

問題影響

限制日志文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查看log-slow-queries慢查詢日志文件狀態及相關配置

mysql> show variables like '%slow_query_log_file%';

clip_image006[4]

2. 檢查日志文件的權限是660並且屬於mysql:mysql

參考值

  • slow_query_log=ON //默認為OFF
  • log-slow-queries= /var/lib/mysql/localhost-slow.log //默認路徑
  • 文件權限=660
  • 文件所屬mysql:mysql

實施步驟

1. 執行SQL語句:mysql> set global slow_query_log = on; //開啟慢查詢日志

2. chmod 660 <file_name>

3. chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

3.4 relay-log中繼日志

名稱

relay-log中繼日志

說明

MySQL進行主主復制或主從復制的時候會在home目錄下面產生相應的relay log

問題影響

限制日志文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查看中繼日志文件狀態及相關配置

mysql> show variables like 'relay_log_basename';

clip_image008[4]

2. 檢查日志文件的權限是660並且屬於mysql:mysql

參考值

  • relay_log_basename = /var/lib/mysql/localhost-relay-bin //默認路徑
  • 文件權限=660
  • 文件所屬mysql:mysql

實施步驟

chmod 660 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

3.5 general query log查詢日志

名稱

查詢日志

說明

記錄建立的客戶端連接和執行的語句。

問題影響

限制日志文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查看查詢日志文件狀態及相關配置

mysql> show variables like '%general_log%';

clip_image010

2. 檢查日志文件的權限是660並且屬於mysql:mysql

參考值

  • general_log=on //默認為off
  • general_log_file = /var/lib/mysql/localhost.log //默認關閉,文件名為主名.log
  • 文件權限=660
  • 文件所屬mysql:mysql

實施步驟

1. 執行SQL語句:mysql> set global general_log = on; //開啟慢查詢日志

2. chmod 660 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

3.6 server-key.pem密鑰文件

名稱

查詢日志

描述

限制密鑰文件的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查詢密鑰文件狀態及相關配置

mysql> show variables where variable_name = 'ssl_key';

clip_image012

2. 檢查日志文件的權限是400並且屬於mysql:mysql

參考值

  • ssl_key = server-key.pem //默認路徑
  • 文件權限=400
  • 文件所屬mysql:mysql

實施步驟

chmod 400 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

3.7 plugin插件目錄

名稱

plugin插件目錄

描述

限制插件目錄的權限將有益於保護數據信息不泄露,或被惡意修改。

檢查方法

1. 執行sql查詢插件目錄狀態及相關配置

mysql> show variables where variable_name = 'plugin_dir';

clip_image014

2. 檢查日志文件的權限是755,並且屬於mysql:mysql

參考值

  • plugin-dir=/usr/lib64/mysql/plugin //默認路徑
  • 文件權限=755
  • 文件所屬mysql:mysql

實施步驟

chmod 755 <file_name>

chown mysql:mysql <file_name>

回退步驟

將文件權限還原為之前的權限

4. 日志審計

4.1 確保log_raw被設置成off

名稱

確保log_raw被設置成off

說明

語句中的密碼在寫入一般查詢日志時會被服務器重寫,不會以明文方式記錄。

問題影響

如果log-raw被設置成ture,則會記成明文。

檢查方法

打開數據庫配置文件 /etc/my.cnf,確定log_raw被設置成off

如果是off是安全的,但如果是on則需要修復

參考值

log_raw=OFF

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

log_raw=OFF

2. 重啟mysql服務

systemctl restart mysqld

回退步驟

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

4.2 確保log_warnings被設置成2

名稱

確保log_warnings被設置成2

說明

log_warnings適用於決定日志中記錄的內容的。

問題影響

隨着級別的調整會記錄更多信息,調整到2有助於通過日志追查安全問題。

檢查方法

mysql> SHOW GLOBAL VARIABLES LIKE 'log_warnings';

如果返回值是1需要調整到2

clip_image002[32]

參考值

log_warning=2 //默認為2

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

log_warning=2

2. 重啟mysql服務

systemctl restart mysqld

回退步驟

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

MySQL 8.0新特性:

log_warnings 參數調整為log_error_verbosity

5. 安全參數設定

5.1 allow-suspicious-udfs

名稱

allow-suspicious-udfs參數設定

描述

該選項控制是否可以載入主函數只有 xxx 符的用戶定義函數。默認情況下,該選項被關閉,並且只能載入至少有輔助符的 UDF。

問題影響

關閉allow-suspicious-udfs,可以防止通過共享對象文件加載存在威脅的UDFs函數。

檢查方法

查看MySQL配置文件allow-suspicious-udfs參數的設定:cat /etc/my.cnf

確認allow-suspicious-udfs不等於TRUE

參考值

allow-suspicious-udfs=FALSE //默認值為FALSE

實施步驟

1. 修改配置文件vi /etc/my.cnf,刪除以下安全參數

allow-suspicious-udfs=TRUE (或者將TRUE改為FALSE,具體效果一樣)

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

5.2 local_infile

名稱

local_infile參數設定

描述

mysql對本地文件的存取是通過SQL語句來實現,主要是通過LOAD DATA LOCAL INFILE來實現,由local_infile參數決定是否支持LOAD DATA LOCAL INFILE

問題影響

禁用local_infile可以阻止黑客利用sql注入來讀取數據庫文件,減小黑客給數據庫帶來的安全損失。

檢查方法

l 方法一:

查看MySQL配置文件local_infile參數的設定:cat /etc/my.cnf

確認local_infile不等於ON

l 方法二:

mysql> SHOW VARIABLES WHERE Variable_name = 'local_infile';

clip_image002[39]

參考值

local_infile=0 //默認值為OFF,0代表OFF

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

local_infile=0 // 0代表OFF

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

5.3 skip-grant-tables

名稱

skip-grant-tables參數設定

描述

數據庫啟動的時候 跳躍權限表的限制,不用驗證密碼,直接登錄

問題影響

如果不關閉此參數,所有賬號可以不受限制的/免密訪問任意數據庫。會導敏感數據外泄。

檢查方法

查看MySQL配置文件skip-grant-tables參數的設定:cat /etc/my.cnf

確認skip-grant-tables不等於TRUE

參考值

skip-grant-tables=FALSE //默認值為FALSE

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

skip-grant-tables=FALSE

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

這種情況只有在忘記root密碼 不得已重啟數據庫的情況下使用的。現網環境慎用,需要重啟數據庫,並且安全性也比較難以保證。

5.4 skip-symbolic-links

名稱

skip-symbolic-links參數設定

描述

開啟skip-symbolic-links可以禁止數據庫用戶刪除或重名數據文件目錄之外的文件。

問題影響

多個客戶可能會訪問同一個數據庫,若使用鏈接文件可能會導致外部客戶鎖定 MySQL 服務器。

檢查方法

l 方法一:

查看MySQL配置文件參數的設定:cat /etc/my.cnf

確認skip_symbolic_links等於YES

l 方法二:

mysql> SHOW variables LIKE 'have_symlink';

確認返回的值為DISABLED.

clip_image004[8]

參考值

skip-symbolic-links=yes //默認值為no

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下安全參數

skip-grant-tables=FALSE

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

5.5 daemon_memcached

名稱

daemon_memcached參數設定

描述

InnoDB memcached插件允許用戶使用memcached協議訪問存儲在InnoDB中的數據

問題影響

默認情況下,插件未開啟認證,任何人可以利用daemon_memcached來訪問或修改一部分數據,給數據庫造成信息泄漏的隱患。

檢查方法

mysql>SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME='daemon_memcached';

如果有返回行數說明有插件,需要刪除

clip_image002[41]

參考值

Empty set (0.00 sec) //默認情況下是禁用的

實施步驟

mysql> uninstall plugin daemon_memcached;

回退方案

5.6 secure_file_priv

名稱

secure_file_priv參數設定

描述

secure-file-priv參數用來限制LOAD DATA INFILE or SELECT LOCAL_FILE傳到指定目錄。

問題影響

secure_file_priv限制客戶端可以讀取數據文件的路徑。secure_file_priv設置合理的值可以有效降低sql注入后黑客讀取數據庫數據的可能性。

檢查方法

mysql> SHOW GLOBAL VARIABLES WHERE Variable_name = 'secure_file_priv' AND Value <>'';

如果有返回內容說明安全,否則需要修復

clip_image002[43]

參考值

secure_file_priv=<path_to_load_directory>

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下參數

secure_file_priv=<path_to_load_directory>

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

  • sure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
  • 當secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
  • 當secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制

實施效果:

clip_image004[10]

5.7 sql_mode

名稱

Sql_mode參數設定

描述

sql_mode模式有三種,STRICT_TRANS_TABLES是其中一種模式。當執行數據更新操作(如INSERT,UPDATE),MySQL依據是否啟用嚴格的SQL_mode處理非法與丟失的數值。

問題影響

STRICT_TRANS_TABLES模式會檢查所有更新的數據,在一定程度可以給入侵者規避檢測帶來阻礙。

NO_AUTO_CREATE_USER是sql_mode的一個選項,可以阻止grant語句在特定情況下自動創建用戶,給數據庫帶來安全隱患。

檢查方法

mysql> SHOW VARIABLES LIKE 'sql_mode';

如果返回的列表中包含STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER 說明安全,否則需要修復

clip_image002[45]

參考值

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下參數

sql_mode=STRICT_ALL_TABLES,NO_AUTO_CREATE_USER

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

mysql5.0以上版本支持三種sql_mode模式:

ANSI模式

寬松模式,對插入數據進行校驗,如果不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。

TRADITIONAL模式

嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。用於事物時,會進行事物的回滾。

STRICT_TRANS_TABLES模式

嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。

5.8 disconnect_on_expired_password

名稱

disconnect_on_expired_password參數設定

描述

disconnect_on_expired_password是用來控制客戶端用失效密碼來訪問數據庫的。

問題影響

關閉這個參數會給數據庫帶來安全風險。

檢查方法

mysql> SHOW GLOBAL VARIABLES like 'disconnect_on_expired_password';

如果有返回的是ON說明安全,否則需要修復

clip_image002[47]

參考值

disconnect_on_expired_password =ON //默認為ON

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下參數

disconnect_on_expired_password =ON

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

5.9 master_info_repository

名稱

master_info_repository

描述

master_info_repository設置成table,客戶端使用的密碼存儲在表中

相較於文件系統表中更為安全

檢查方法

mysql> SHOW GLOBAL VARIABLES LIKE 'master_info_repository';

如果有返回的是table說明安全,否則需要修復

clip_image002[51]

參考值

master_info_repository=table

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加以下參數

master_info_repository=table

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

mysql 8.0版本級以上默認為table

6. MySQL權限安全

6.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');

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') 45 | Page OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

參考值

返回的都是管理員賬號

實施步驟

清除非管理員賬號的過高部分權限

6.2 非管理員賬號File_priv不應該設置成Y

名稱

非管理員賬號File_priv不應該設置成Y

說明

File_priv權限允許MySQL用戶對磁盤進行讀寫操作

問題影響

黑客很可能利用這一點盜取數據庫中敏感數據。

檢查方法

mysql> select user, host from mysql.user where File_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image004[12]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE FILE ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT FILE ON *.* TO user@localhost; //<user>為需要增加權限的用戶

6.3 非管理員賬號Process_priv不應該設置成Y

名稱

非管理員賬號Process_priv不應該設置成Y

說明

Process_priv權限允許委托賬號查看當前正在執行的sql語句

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Process_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image006[8]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE PROCESS ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT PROCESS ON *.* TO user@localhost; //user為需要增加權限的用戶

6.4 非管理員賬號Super_priv不應該設置成Y

名稱

非管理員賬號Super_priv不應該設置成Y

說明

super_priv權限允許委托賬號執行任意語句,非管理員不應該具備該權限。

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Super_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image008[8]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE SUPER ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT SUPER ON *.* TO user@localhost; //user為需要增加權限的用戶

備注

‘mysql.session‘@’localhost’:

插件內部使用來訪問服務器。該用戶已被鎖定,客戶端無法連接。

6.5 非管理員賬號Shutdown_priv不應該設置成Y

名稱

非管理員賬號Shutdown_priv不應該設置成Y

說明

Shutdown_priv權限允許委托賬號關閉數據庫,會造成一定安全隱患。

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Shutdown_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image010[7]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE SHUTDOWN ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT SHUTDOWN ON *.* TO user@localhost; //user為需要增加權限的用戶

6.6 非管理員賬號Create_user_priv不應該設置成Y

名稱

非管理員賬號Create_user_priv不應該設置成Y

說明

Create_user_priv權限允許委托賬號創建任意用戶,會造成一定安全隱患。

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Create_user_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image012[8]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE CREATE USER ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT CREATE USER ON *.* TO user@localhost; //user為需要增加權限的用戶

6.7 非管理員賬號Grant_priv不應該設置成Y

名稱

非管理員賬號Grant_priv不應該設置成Y

說明

Grant_priv權限允許委托賬號對其他用戶賦權,可能會被黑客利用造成一定安全隱患。

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Grant_priv= 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image014[7]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE GRANT ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT GRANT ON *.* TO user@localhost; //user為需要增加權限的用戶

6.8 非管理員賬號Reload_priv不應該設置成Y

名稱

非管理員賬號Reload_priv不應該設置成Y

說明

Reload_priv權限可以對本地文件進行操作,可能會被黑客利用造成一定安全隱患

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where Reload_priv= 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image016[4]

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE RELOAD ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT RELOAD ON *.* TO user@localhost; //user為需要增加權限的用戶

6.9 非管理員賬號repl_slave_priv不應該設置成Y

名稱

非管理員賬號repl_slave_priv不應該設置成Y

說明

repl_slave_priv用於從主服務器上獲得更新的數據。

問題影響

使用超越當前用戶權限的權利。可以被攻擊者所利用。

檢查方法

mysql> select user, host from mysql.user where repl_slave_priv = 'Y';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image018

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE REPLICATION ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT REPLICATION ON *.* TO user@localhost; //user為需要增加權限的用戶

6.10 確保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';

如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限

clip_image020

參考值

返回的都是管理員賬號

實施步驟

mysql> REVOKE XXX ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶

回退步驟

mysql> GRANT XXX ON *.* TO user@localhost; //user為需要增加權限的用戶

7. 口令策略

7.1 口令復雜度

名稱

口令復雜度設置

說明

口令應符合口令策略,要求包含數字、字符、大小寫和特殊字符,且長度大於等於8位

問題影響

弱口令容易被惡意攻擊者爆破,導致口令被猜解

檢查方法

通過msyql環境變量可以查看密碼策略的相關參數

mysql> show variables like '%password%';

clip_image002[55]

參考值

  • validate_password.policy=MEDIUM //密碼策略,默認為MEDIUM策略
  • validate_password.length=8 //密碼最少長度為8位
  • validate_password.mixed_case_count=1 //大小寫字符長度,至少1個
  • validate_password.number_count=1 //數字至少1個
  • validate_password.pecial_char_count=1 //特殊字符至少1個

實施步驟

1. 修改配置文件vi /etc/my.cnf,添加安全參數

[mysqld]

plugin-load=validate_password.so

validate_password.policy=1 //密碼強度檢查級別為MEDIUM

validate-password=FORCE_PLUS_PERMANENT //永久強制使用插件,為阻止該插件在運行時被刪除

clip_image004[14]

2. 重啟mysql服務

systemctl restart mysqld

回退方案

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

備注

mysql5.7默認安裝了密碼安全檢查插件(validate_password),默認密碼檢查策略要求密碼必須包含:大小寫字母、數字和特殊符號,並且長度不能少於8位。否則會提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements錯誤

7.2 口令生存周期

名稱

口令生存周期設置(因數據庫可用性要求高,不強制啟用)

描述

推薦口令最長不超過3個月更改一次口令

問題影響

密碼永不過期,無法保證口令的安全性

檢查方法

1. 查看全局密碼過期的參數設定

mysql> show variables like 'default_password_lifetime';

clip_image006[10]

5.7.11版本后都已經把默認值從360變成了0也就是永不過期了;

2. 查看未設定密碼過期策略的用戶

select user,host,password_lifetime,password_last_changed,password_expired from mysql.user;

clip_image008[10]

參考值

default_password_lifetime=90 //密碼90天過期

實施步驟

l 全局參數設定(因數據庫可用性要求高,不強制啟用):

1. 修改配置文件vi /etc/my.cnf,添加安全參數

[mysqld]

default_password_lifetime=90

clip_image010[9]

2. 重啟mysql服務

systemctl restart mysqld

l 特定用戶口令過期設定

mysql> ALTER USER 'XXXX'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

回退方案

l 全局設定:

修改配置前使用以下命令備份配置文件

cp /etc/my.cnf /etc/my.cnf.bak

回退操作:

cp /etc/my.cnf.bak /etc/my.cnf

l 特定用戶口令過期設定

mysql> ALTER USER 'XXXX'@'localhost' PASSWORD EXPIRE DEFAULT;

7.3 確保無空口令用戶

名稱

確認無空口令用戶

問題影響

如果密碼被設置成空密碼,入侵者只要知道密碼和主機允許列表,就可以繞過身份驗證隨意登錄數據庫,進行違規操作。

檢查方法

mysql> SELECT User,host FROM mysql.user WHERE authentication_string='';

沒有行數返回說明安全,否則需要配置

參考值

clip_image012[10]

實施步驟

mysql> SET PASSWORD FOR 'user'@'host' = PASSWORD("XXXXXXX");

7.4 確保無匿名賬戶

名稱

確認無匿名賬戶

問題影響

匿名用戶是空的,也沒有密碼。安全性很差,任意人員都可以利用匿名用戶訪問數據庫。

檢查方法

mysql> SELECT user,host FROM mysql.user WHERE user = '';

沒有行數返回說明安全,否則需要修復

參考值

Empty set (0.00 sec)

實施步驟

刪除匿名用戶

7.5 確保用戶不允許所有ip訪問

名稱

確保用戶不允許所有ip訪問

問題影響

某一數據庫用戶支持所有ip訪問,一旦賬號密碼泄露,數據庫就變得很不安全

檢查方法

mysql> SELECT user, host FROM mysql.user WHERE host = '%';

結果集為空說明不存在問題,否則需要修復

參考值

clip_image014[9]

實施步驟

刪除匿名用戶

 

首次整理編寫博客,如有不足之處,江湖大佬多擔待;

如果正文的內容存在錯誤或不合理之處,期待你的指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM