MySQL密碼安全

cdrcsy發表於2024-07-04
主要是涉及,賬號密碼安全策略方面
valitdate_password、connect-control、密碼過期等。
(1)MySQL資源限制:
透過設定全域性變數max_user_connections可以限制單個使用者在同一時間連線MySQL例項的數量,但此引數無法對每個使用者區別對待,所以MySQL提供了對每個使用者的資源限制管理。max_connections是所有使用者的連線數量
  MAX_QUERIES_PER_HOUR:一個使用者在一個小時內可以執行查詢的次數(基本包含所有語句)
  MAX_UPDATES_PER_HOUR:一個使用者在一個小時內可以執行修改的次數(僅包含修改資料庫或表的語句)
  MAX_CONNECTIONS_PER_HOUR:一個使用者在一個小時內可以連線MySQL的時間
  MAX_USER_CONNECTIONS:一個使用者可以在同一時間連線MySQL例項的數量
使用方法:
CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank'
WITH MAX_QUERIES_PER_HOUR 200
MAX_UPDATES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 20
MAX_USER_CONNECTIONS 20;
如果只修改某一個限制:
CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' WITH MAX_QUERIES_PER_HOUR 200;
該語句僅修改指定的限額值,其餘部分保持不變。若要刪除限制,請將其值設定為零。
(2)MySQL使用者密碼過期策略
設定系統引數default_password_lifetime作用於所有的使用者賬戶。
  default_password_lifetime=180 設定180天過期
  default_password_lifetime=0 設定密碼不過期
如果為每個使用者設定了密碼過期策略,則會覆蓋上述系統引數
  ALTER USER 'xxx'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;設定90天過期
  ALTER USER 'xxx'@'localhost' PASSWORD EXPIRE NEVER; 密碼不過期
  ALTER USER 'xxx'@'localhost' PASSWORD EXPIRE DEFAULT; 預設過期策略
  
手動強制某個使用者密碼過期
ALTER USER 'xxx'@'localhost' PASSWORD EXPIRE;
手動讓使用者賬號鎖定,無法登陸:
alter user xxx@'localhost' account lock;
alter user xxx@'localhost' account unlock;
(3)自定義密碼策略
MySQL 5.7版本以及MySQL 8.0版本 支援透過validate_password外掛修改資料庫賬號的密碼複雜度校驗規則:
  密碼和賬號名是否可以一致。
  密碼的長度。
  密碼中需包含的大小寫字母個數。
  密碼中需包含的數字個數。
  密碼中需包含的特殊字元個數。
  密碼檢測強度。
檢查是否安裝
SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'validate_password';
線上安裝:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
UNINSTALL PLUGIN validate_password;
安裝元件(8.0)
INSTALL COMPONENT 'file://component_validate_password';
UNINSTALL COMPONENT 'file://component_validate_password';
在引數檔案my.cnf中新增引數。
[mysqld]
plugin-load-add=validate_password.so
#ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 是否使用該外掛(及強制/永久強制使用)
validate-password=FORCE_PLUS_PERMANENT #引數FORCE_PLUS_PERMANENT是為了防止外掛在MySQL執行時的時候被解除安裝
檢視外掛相關的系統變數,如下所示:
mysql> show variables like 'validate_password%';
+---------------------------------------------------------+--------+
| Variable_name        | Value |
+---------------------------------------------------------+--------+
| validate_password_check_user_name   | ON |
| validate_password_dictionary_file      | |
| validate_password_length      | 8 |
| validate_password_mixed_case_count    | 1 |
| validate_password_number_count     | 1 |
| validate_password_policy      | MEDIUM |
| validate_password_special_char_count   | 1 |
+--------------------------------------------------------+--------+
7 rows in set (0.00 sec)
選項                   預設值     引數描述
validate_password_check_user_name     ON     設定為ON的時候表示能將密碼設定成當前使用者名稱。
validate_password_dictionary_file             用於檢查密碼的字典檔案的路徑名,預設為空
validate_password_length           8      密碼的最小長度,也就是說密碼長度必須大於或等於8
validate_password_mixed_case_count     1      如果密碼策略是中等或更強的,validate_password要求密碼具有的小寫和大寫字元的最小數量。
validate_password_number_count       1      密碼必須包含的數字個數
validate_password_policy         MEDIUM    密碼強度檢驗等級,可以使用數值0、1、2或相應的符號值LOW、MEDIUM、STRONG來指定。
                            0/LOW:只檢查長度。
                            1/MEDIUM:檢查長度、數字、大小寫、特殊字元。
                            2/STRONG:檢查長度、數字、大小寫、特殊字元、字典檔案。
validate_password_special_char_count     1      密碼必須包含的特殊字元個數
修改密碼強度。#注意,如果是外掛的話,SQL為set global validate_password_policy=LOW
  SET GLOBAL validate_password_policy=LOW;
  SET GLOBAL validate_password.policy=LOW;
函式元件去檢測密碼是否滿足條件: 0-100,當評估在100時就是說明使用上了最基本的規則:大寫+小寫+特殊字元+數字組成的8位以上密碼
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('medium');
+--------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('medium') |
+--------------------------------------+
|   25 |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('K354*45jKd5');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('K354*45jKd5') |
+-------------------------------------------+
|    100 |
+-------------------------------------------+
1 row in set (0.00 sec)
如果想要使用字典過濾弱口令的話,系統變數validate_password.policy必須為STRONG
狀態
如果是外掛的話,是沒有相對應的狀態變數,只有元件有對應的系統變數。
mysql> show status like 'validate_pass%';
+-----------------------------------------------+---------------------+
| Variable_name | Value |
+-----------------------------------------------+---------------------+
| validate_password_dictionary_file_last_parsed | 2020-08-13 11:33:47 |
| validate_password_dictionary_file_words_count | 0 |
+-----------------------------------------------+---------------------+
2 rows in set (0.00 sec)
(4)CONNECTION_CONTROL連線控制
MySQL 5.7.17 以後提供了Connection-Control外掛用來控制客戶端在登入操作連續失敗一定次數後的響應的延遲。
該外掛可有效的防止客戶端暴力登入的風險(攻擊)。該外掛包含以下2個元件:
CONNECTION_CONTROL:用來控制登入失敗的次數及延遲響應時間
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:該表將登入失敗的操作記錄至IS庫中
-- 外掛動態安裝啟用
mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
-- 驗證是否正常安裝
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'connection%';
mysql> SHOW PLUGINS;
-- 配置檔案增加以下配置
[mysqld]
plugin-load-add = connection_control.so
connection-control = FORCE
connection-control-failed-login-attempts = FORCE
connection_control_min_connection_delay = 1000
connection_control_max_connection_delay = 86400
connection_control_failed_connections_threshold = 3
connection_control_failed_connections_threshold 失敗嘗試的次數,預設為3,表示當連線失敗3次後啟用連線控制,0表示不開啟
connection_control_max_connection_delay 響應延遲的最大時間,預設約25天
connection_control_min_connection_delay 響應延遲的最小時間,預設1000毫秒,1秒
-- 定製化配置
mysql> SET GLOBAL connection_control_failed_connections_threshold = 3;
mysql> SET GLOBAL connection_control_min_connection_delay = 1000;
mysql> SET GLOBAL connection_control_max_connection_delay = 86400;
select * from information_schema.connection_control_failed_login_attempts;
-- 該表記錄登入失敗的使用者及失敗次數,當使用者登入成功後,登入失敗的記錄則會被刪除。
-- 重新配置connection_control_failed_connections_threshold變數,該表記錄會被刪除(重置)
-- 如果使用不存在的使用者登入,則該表記錄使用者名稱為空,但會記錄具體登入的IP
-- 連線控制的使用次數(可使用者判斷是否存在暴力登入嘗試)
mysql> show global status like 'Connection_control_delay_generated';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 5 |
+------------------------------------+-------+

相關文章