1. 程式人生 > 實用技巧 >MySQL學習筆記(24):許可權與安全

MySQL學習筆記(24):許可權與安全

本文更新於2020-05-03,使用MySQL 5.7,作業系統為Deepin 15.4。

目錄

許可權

許可權存取需要用到mysql庫中user、db、host、tables_priv、columns_prvi這幾個許可權表。列分為4個部分:使用者列、許可權列、安全列、資源控制列。許可權列又分為普通許可權和管理許可權。

表名 user db host 說明
使用者列 host host host
使用者列 user db db
使用者列 password user
許可權列 select_priv select_priv select_priv 查詢記錄
許可權列 insert_priv insert_priv insert_priv 插入記錄
許可權列 update_priv insert_priv insert_priv 更新記錄
許可權列 delete_priv delete_priv delete_priv 刪除記錄
許可權列 index_priv index_priv index_priv 維護索引
許可權列 alter_priv alter_priv alter_priv 修改資料庫或表
許可權列 create_priv create_priv create_priv 建立資料庫或表
許可權列 drop_priv drop_priv drop_priv 刪除資料庫或表
許可權列 grant_priv grant_priv grant_priv 授予許可權
許可權列 create_view_priv create_view_priv create_view_priv 建立檢視
許可權列 show_view_priv show_view_priv show_view_priv 展示檢視
許可權列 create_routine_priv create_routine_priv 建立儲存過程或函式
許可權列 alter_routine_priv alter_routine_priv 修改儲存過程或函式
許可權列 references_priv references_priv references_priv ?
許可權列 reload_priv 重新載入MySQL
許可權列 shutdown_priv 關閉MySQL
許可權列 process_priv 檢視所有執行緒
許可權列 file_priv 匯出匯入檔案
許可權列 show_db_priv 展示所有庫
許可權列 super_priv 超級許可權
許可權列 create_tmp_table_priv create_tmp_table_priv create_tmp_table_priv 建立臨時表
許可權列 lock_tables_priv lock_tables_priv lock_tables_priv 鎖表
許可權列 execute_priv 執行儲存過程或函式
許可權列 repl_slave_priv 與複製有關
許可權列 repl_client_priv 與複製有關
安全列 ssl_type
安全列 ssl_cipher
安全列 x509_issuer
安全列 x509_subject
資源控制列 max_questions
資源控制列 max_updates
資源控制列 max_connections
資源控制列 max_user_connections

許可權的存取有以下兩個階段:

  1. 先從user表的host、user和password欄位判斷是否通過身份驗證。
  2. 按照以下許可權表的順序檢視是否取得許可權:user->db->tables_priv->columns_priv,如果有許可權表相應的值為Y,則取得該許可權。在這幾個許可權表中,許可權範圍依次遞減,全域性許可權覆蓋區域性許可權。

安全

作業系統相關的安全問題

  • 嚴格控制作業系統賬號(通常為mysql)和許可權。
  • 儘量避免以root(通常使用mysql)許可權執行MySQL。
  • 防止DNS欺騙:建立賬號時host可指定域名,但若域名對應的IP地址被惡意修改,則資料庫就會被惡意的IP地址訪問。

資料庫相關的安全問題

  • 刪除匿名賬號。
  • 給root賬號設定密碼。
  • 設定安全密碼。使用密碼有以下幾種方式,也需注意安全問題:直接將密碼寫在命令列中;互動式輸入密碼;將賬號和密碼寫在配置檔案中,如寫在/etc/my.cnf的client組中。
  • 只授予賬號必需的許可權。
  • 除root外,任何賬號不應有mysql庫user表的存取許可權。
  • 不要把FILEPROCESSSUPER許可權授予管理員以外的賬號。
  • 注意LOAD DATA LOCAL從客戶端本地讀取檔案帶來的安全問題。
  • 使用MERGE儲存引擎潛藏的安全漏洞:通過MERGE表還可以訪問已被回收許可權的子表。
  • DROP TABLE並不回收相關許可權,導致重新建立同名表時,此前其他使用者對此表的許可權會自動賦予。
  • 使用SSL。
  • 如果可能,給所有使用者加上訪問host限制。
  • REVOKE的漏洞:在一個數據庫上多次賦予許可權,許可權會自動合併;但是在多個數據庫上多次賦予許可權,每個資料庫上都會認為是單獨的一組許可權,必須在此資料庫上用REVOKE單獨進行許可權回收,而REVOKE ALL ON *.*並不會自動完成這個過程。

資料庫安全設定選項

  • --old-passwords:該引數只是為了支援4.1版本前的客戶端,這將使得新建或修改的密碼全部變成舊格式,降低了系統安全性。
  • --safe-user-create:使使用者不能用GRANT建立新賬號,除非使用者有mysql.user表的INSERT許可權。
  • --secure-auth:使4.1版本前的客戶端無法進行使用者認證,即使使用了--old-passwords也不行。
  • --skip-grant-tables:令伺服器不使用許可權系統。
  • --skip-networking:不允許TCP/IP連線,所有連線必須經命名管道(Named Pipes)、共享記憶體(Shared Memory)、UNIX套接字(Socket)檔案進行。
  • --skip-show-database:使用該選項,只有賦予SHOW DATABASES許可權的使用者才能執行且顯示所有庫名;不使用該選項,則所有使用者都能執行,但只顯示有許可權的庫名。