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數據庫是否存在 |
參考值 |
|
實施步驟 |
刪除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; 如果有返回行則需要修改 |
參考值 |
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.*$" 如果沒有返回行,則權限存在問題 |
參考值 |
存在返回行 |
實施步驟 |
創建一個僅用於運行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]$" 如果沒有返回行則說明存在安全隱患。 |
參考值 |
|
實施步驟 |
執行下列語句禁止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%'; 2. 檢查日志文件的權限是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,所屬mysql:mysql |
3.2 log-err錯誤日志
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%'; 2. 檢查日志文件的權限是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'; 2. 檢查日志文件的權限是660並且屬於mysql:mysql |
參考值 |
|
實施步驟 |
chmod 660 <file_name> chown mysql:mysql <file_name> |
回退步驟 |
將文件權限還原為之前的權限 |
3.5 general query log查詢日志
3.6 server-key.pem密鑰文件
名稱 |
查詢日志 |
描述 |
限制密鑰文件的權限將有益於保護數據信息不泄露,或被惡意修改。 |
檢查方法 |
1. 執行sql查詢密鑰文件狀態及相關配置 mysql> show variables where variable_name = 'ssl_key'; 2. 檢查日志文件的權限是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'; 2. 檢查日志文件的權限是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則需要修復 |
參考值 |
|
實施步驟 |
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
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'; |
參考值 |
local_infile=0 //默認值為OFF,0代表OFF |
實施步驟 |
1. 修改配置文件vi /etc/my.cnf,添加以下安全參數 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. |
參考值 |
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'; 如果有返回行數說明有插件,需要刪除 |
參考值 |
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 <>''; 如果有返回內容說明安全,否則需要修復 |
參考值 |
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 |
備注 |
實施效果: |
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 說明安全,否則需要修復 |
||||||
參考值 |
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模式:
|
5.8 disconnect_on_expired_password
5.9 master_info_repository
名稱 |
master_info_repository |
描述 |
master_info_repository設置成table,客戶端使用的密碼存儲在表中 相較於文件系統表中更為安全 |
檢查方法 |
mysql> SHOW GLOBAL VARIABLES LIKE 'master_info_repository'; 如果有返回的是table說明安全,否則需要修復 |
參考值 |
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 確保只有管理員賬號有所有數據庫的訪問權限
6.2 非管理員賬號File_priv不應該設置成Y
名稱 |
非管理員賬號File_priv不應該設置成Y |
說明 |
File_priv權限允許MySQL用戶對磁盤進行讀寫操作 |
問題影響 |
黑客很可能利用這一點盜取數據庫中敏感數據。 |
檢查方法 |
mysql> select user, host from mysql.user where File_priv = 'Y'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
|
回退步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
mysql> REVOKE CREATE USER ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶 |
回退步驟 |
mysql> GRANT CREATE USER ON *.* TO user@localhost; //user為需要增加權限的用戶 |
6.7 非管理員賬號Grant_priv不應該設置成Y
名稱 |
|
說明 |
Grant_priv權限允許委托賬號對其他用戶賦權,可能會被黑客利用造成一定安全隱患。 |
問題影響 |
使用超越當前用戶權限的權利。可以被攻擊者所利用。 |
檢查方法 |
mysql> select user, host from mysql.user where Grant_priv= 'Y'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
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'; 如果返回的都是管理員賬號說明安全,否則需要對用戶清除權限 |
參考值 |
返回的都是管理員賬號 |
實施步驟 |
mysql> REVOKE XXX ON *.* FROM '<user>’; //<user>為需要撤銷權限的用戶 |
回退步驟 |
mysql> GRANT XXX ON *.* TO user@localhost; //user為需要增加權限的用戶 |
7. 口令策略
7.1 口令復雜度
7.2 口令生存周期
7.3 確保無空口令用戶
名稱 |
確認無空口令用戶 |
問題影響 |
如果密碼被設置成空密碼,入侵者只要知道密碼和主機允許列表,就可以繞過身份驗證隨意登錄數據庫,進行違規操作。 |
檢查方法 |
mysql> SELECT User,host FROM mysql.user WHERE authentication_string=''; 沒有行數返回說明安全,否則需要配置 |
參考值 |
|
實施步驟 |
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 = '%'; 結果集為空說明不存在問題,否則需要修復 |
參考值 |
|
實施步驟 |
刪除匿名用戶 |
首次整理編寫博客,如有不足之處,江湖大佬多擔待;
如果正文的內容存在錯誤或不合理之處,期待你的指正!