MySQL資料庫安全基線(加固方法)
阿新 • • 發佈:2018-12-07
MySQL資料庫安全加固方法
基本安全原則
- 選擇穩定版本並及時更新、打補丁
- 嚴禁使用弱口令,定期更新口令
- 嚴格的許可權分配和訪問控制
具體安全配置
系統層面配置
-
系統安裝時,需要確認沒有其他⽤戶登入在伺服器上。
-
選擇穩定的版本,並及時更新到最新版本、打補丁
-
檢視系統防火牆或網路安全裝置,是否有限制對MySQL資料庫的訪問
-
不設定環境變數或確保MYSQL_PWD環境變數未設定敏感資訊
-
禁用MySQL命令歷史記錄
刪除現在的.mysql_history檔案 rm ~/.mysql_history 建立它的軟連線 ln -s /dev/null ~/.mysql_history 如果有特殊情況需要開啟,重新設定MYSQL_HISTFILE即可: 比如export MYSQL_HISTFILE=~/.mysql_history
-
系統安裝時執行mysql_secure_installation執行相關安全設定
執行mysql_secure_installation會執行幾個設定: a)為root使用者設定密碼 b)刪除匿名賬號 c)取消root使用者遠端登入 d)刪除test庫和對test庫的訪問許可權 e)重新整理授權表使修改生效
伺服器配置
- 3306埠及服務不允許暴露到公網。如有特殊業務需求需對外網開放,必須經雲安全部稽核通討後,才允許對外網開放。
- 伺服器不應該具備訪問外⽹的能⼒(如有必要,可單向訪問)。
- 新的伺服器正式投⼊使⽤前,必須經過安全加固。
⽤戶和密碼配置
-
使用專用的最小許可權賬號執行Mysql資料庫程序
-
嚴禁使用弱口令,嚴禁共享賬號
-
強密碼的設定,需要符合以下標準:
每個賬號必須要設密碼且密碼不能和使用者名稱相同;(必選) 不得出現使用者名稱、真實姓名為公司名稱;(必選) 使用者密碼長度不能低於8位;(必選) 不能使用常用單詞;(必選) 不能使用使用者相關資訊:例如生日、電話號碼等等;(可選) 至少由3種字元組成,包含字母、數字、特殊符號在內。(可選)
-
使用validate_password.so外掛,進行安全加固
安裝外掛:(預設安裝了外掛後,強度外掛就啟用了,關閉,需要在配置檔案假如相關關閉引數) mysql>INSTALL PLUGIN validate_password SONAME 'validate_password.so'; 配置檔案新增部分引數: [mysqld] plugin-load=validate_password.so validate_password_policy=2 validate-password=FORCE_PLUS_PERMANENT 3.以上處理後,就可以測試了: mysql> SET PASSWORD = PASSWORD('abc'); ERROR 1819 (HY000): Your password does not satisfy the current policy requirements mysql> SET PASSWORD = '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E'; Query OK, 0 rows affected (0.01 sec) 相關選項說明: validate-password=ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 決定是否使用該外掛(及強制/永久強制使用)。 validate_password_dictionary_file:外掛用於驗證密碼強度的字典檔案路徑。 validate_password_length:密碼最小長度。 validate_password_mixed_case_count:密碼至少要包含的小寫字母個數和大寫字母個數。 validate_password_number_count:密碼至少要包含的數字個數。 validate_password_policy:密碼強度檢查等級,0/LOW、1/MEDIUM、2/STRONG。 validate_password_special_char_count:密碼至少要包含的特殊字元數。 其中,關於validate_password_policy-密碼強度檢查等級: 0/LOW:只檢查長度。 1/MEDIUM:檢查長度、數字、大小寫、特殊字元。 2/STRONG:檢查長度、數字、大小寫、特殊字元字典檔案。
-
-
使用者密碼過期時間小於等於90天
配置檔案中設定 [mysqld] default_password_lifetime=90
-
重新命名root賬號
use mysql update user set user="新的使用者名稱" where user="root"; select user,host,password from mysql.user; #檢視結果
-
控制最高許可權只有管理員
使用如下sql語句: 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'); 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')); 確保返回結果只能是資料庫管理員賬號。
-
合理控制DML/DDL操作授權
DML/DDL語句包括建立或修改資料庫結構的許可權,例如insert、update、delete、create、drop和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'; 上述查詢到的使用者只能對特定的資料庫才有相關的許可權,使用如下命令進行相關許可權的回收: REVOKE SELECT ON <host>.<database> FROM <user>; REVOKE INSERT ON <host>.<database> FROM <user>; REVOKE UPDATE ON <host>.<database> FROM <user>; REVOKE DELETE ON <host>.<database> FROM <user>; REVOKE CREATE ON <host>.<database> FROM <user>; REVOKE DROP ON <host>.<database> FROM <user>; REVOKE ALTER ON <host>.<database> FROM <user>; 其中<user>為查詢到的未授權的使用者,host為相關主機,database為相關資料庫。 許可權說明: file_priv:表示是否允許使用者讀取資料庫所在主機的本地檔案; Process:表示是否允許使用者查詢所有使用者的命令執行資訊; Super_priv:表示使用者是否有設定全域性變數、管理員除錯等高級別許可權; Shutdown_priv:表示使用者是否可以關閉資料庫; Create_user_priv:表示使用者是否可以建立或刪除其他使用者; Grant_priv:表示使用者是否可以修改其他使用者的許可權;
-
歷史命令列密碼設定為不可見
(1)先輸入mysql -u admin -p (2)根據命令列提示輸入密碼; 而不要在一整條命令中輸入密碼。 另外要控制mysql配置檔案訪問許可權
-
刪除預設test資料庫,測試帳號,空密碼、匿名帳號
bash drop database if exists ${dbname}; #刪除冗餘資料庫, 如test bash drop user '' #清除無用使用者(沒有使用者名稱的使用者) select user,host from mysql.user #使用該命令查詢是否存在空賬號
-
禁止root遠端登入
use mysql; # 切換到mysql資料庫(這是MySQL自帶的一個數據庫,裡面存放著一些root的配置資訊); update user set host = "localhost" where user = "root" and host = "%"; # 修改root使用者的host屬性,確保其為localhost,這表示只能本地訪問(%表示可以遠端訪問); flush privileges; #重新整理
-
關閉Old_Passwords
mysql> show variables like ‘%password%’; +—————+——-+ | Variable_name | Value | +—————+——-+ | old_passwords | OFF | ####這裡表明已經關閉了舊密碼選項 +—————+——-+ 1 row in set (0.00 sec)
-
secure_auth選項設定
如果客戶端採用Old_passwords發起連線請求,如果伺服器端設定了secure_auth,則客戶端會拒絕連線請求,可以根據安全需求在配置檔案中做相應配置。
-
確保所有使用者都要求使用非空密碼登入
行如下語句查詢是否有使用者不需要密碼即可登入: SELECT User,host FROM mysql.user WHERE (plugin IN('mysql_native_password', 'mysql_old_password') AND (LENGTH(Password) = 0 OR Password IS NULL)) OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);
檔案許可權配置
- 禁止MySQL對本地檔案存取
在MySQL中,提供對本地檔案的讀取,使用的是load data local infile命令,預設在5.0版本中,該選項是預設開啟的,該操作令會利用MySQL把本地檔案讀到資料庫中,然後使用者就可以非法獲取敏感資訊了,如不需要讀取本地檔案,請關閉。
檢查方法
Less /etc/my.cnf
檢查[mysqld]部分是否存在local-infile=0。
或者ps –aux檢視啟動mysql程序是有local-infile=0
-
控制二進位制日誌檔案的許可權
mysql的執行會產生很多日誌,例如二進位制日誌、錯誤日誌、慢查詢日誌等等,Mysql命令列下執行如下命令: show variables like 'log_bin_basename'; Linux在終端命令列執行如下命令: ls <log_bin_basename>.* 對於發現的每一個檔案,執行如下命令: ls -l <log_bin_basename> # 根據輸出確認日誌檔案的許可權設定是否存在問題。 對於每個日誌檔案,修改其許可權和屬組如下: chmod 660 <log file> chown mysql:mysql <log file>
-
控制datadir、basedir的訪問許可權
資料目錄是mysql資料庫存放的位置,在mysql命令列介面下執行如下命令: show variables where variable_name = 'datadir'; 在終端命令列下執行如下命令: ls -l <datadir> 如果存在問題,linux環境下在終端執行如下命令進行加固: chmod 700 <datadir> #僅MySQL資料庫使用者有讀寫許可權 chown mysql:mysql <datadir> 同理控制basedir許可權,僅DBA和資料庫使用者可訪問
-
控制錯誤日誌檔案的許可權
Mysql命令列下執行如下命令: show variables like 'log_error'; 在終端命令列執行如下命令: ls <log_error>.* 對於發現的每一個檔案,執行如下命令: ls -l <log_error> # 根據輸出確認日誌檔案的許可權設定是否存在問題。 對於每個日誌檔案,修改其許可權和屬組如下: chmod 660 <log file> chown mysql:mysql <log file>
-
控制慢查詢日誌檔案的許可權
Mysql命令列下執行如下命令: show variables like 'slow_query_log_file'; 在終端命令列執行如下命令: ls <slow_query_log_file>.* 對於發現的每一個檔案,執行如下命令: ls -l <slow_query_log_file> 根據輸出確認日誌檔案的許可權設定是否存在問題。 對於每個日誌檔案,修改其許可權和屬組如下: chmod 660 <log file> chown mysql:mysql <log file>
-
控制通用日誌檔案的許可權
Mysql命令列下執行如下命令: show variables like 'general_log_file'; 在終端命令列執行如下命令: ls <general_log_file>.* 對於發現的每一個檔案,執行如下命令: ls -l <general_log_file> # 根據輸出確認日誌檔案的許可權設定是否存在問題。 對於每個日誌檔案,修改其許可權和屬組如下: chmod 660 <log file> chown mysql:mysql <log file>
-
控制審計日誌檔案的許可權
Mysql命令列下執行如下命令: show global variables where variable_name = 'audit_log_file'; 在終端執行如下命令: ls -l <audit_log_file> # 根據輸出確認日誌檔案的許可權設定是否存在問題。 對於每個日誌檔案,修改其許可權和屬組如下: chmod 660 <audit_log_file> chown mysql:mysql <audit_log_file>
審計和日誌
-
開啟審計功能
show variables like '%plugin%'; #檢視外掛存放位置 +-----------------+--------------------------+ | Variable_name | Value | +-----------------+--------------------------+ | plugin_dir | /usr/lib64/mysql/plugin/ | | plugin_maturity | unknown | +-----------------+--------------------------+ 注意:mysql上的審計外掛libaudit_plugin.so需要單獨下載後安裝,mariadb自帶審計外掛server_audit.so 執行安裝命令: install plugin server_audit SONAME 'server_audit.so'; flush privileges; 修改配置檔案: vim /etc/my.cnf 在[mysqld]下面新增 server_audit=FORCE_PLUS_PERMANENT --防止審計外掛被解除安裝 server_audit_logging=ON --開啟審計日誌 server_audit_excl_users='z' --不在審計內的使用者 server_audit_file_rotate_size=2000000 --審計日誌檔案輪替限制大小 server_audit_file_rotations=200 --審計輪替日誌限制數 server_audit_excl_users='root' --審計在內的使用者 server_audit_events='query_ddl,query_dml'; --審計日誌事件的操作指令內容 重啟資料庫使配置生效 錯誤日誌包括資料庫執行和停止過程中的一系列活動資訊,有助於分析資料庫執行過程中的一些異常活動,一般情況下需要開啟錯誤日誌記錄功能,使用如下命令查詢: SHOW variables LIKE 'log_error'; 確保返回結果為非空,如果為空,需要在mysql資料庫配置檔案中增加相關配置
-
確保資料存放在非系統區域
隨著資料庫的執行產生的資料會不斷增加,如果存放在系統區域,則會影響系統的正常執行,所以配置datadir時應避開:root('/'),"/var","/usr"
-
關閉原始日誌功能
原始日誌選項會決定一些敏感資訊是否會被明文寫進日誌中,例如查詢日誌、慢查詢日誌、二進位制日誌,確保資料庫配置檔案中存在如下配置項: Log-raw = OFF
備份與恢復
-
資料庫定期備份,並保證至少每週1次的完全備份
-
定期進行備份和恢復有效性的測試