1. 程式人生 > >MySQL資料庫安全基線(加固方法)

MySQL資料庫安全基線(加固方法)

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次的完全備份

  • 定期進行備份和恢復有效性的測試