MySQL學習筆記(24):許可權與安全
阿新 • • 發佈:2020-07-23
本文更新於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 |
許可權的存取有以下兩個階段:
- 先從user表的host、user和password欄位判斷是否通過身份驗證。
- 按照以下許可權表的順序檢視是否取得許可權:user->db->tables_priv->columns_priv,如果有許可權表相應的值為
Y
,則取得該許可權。在這幾個許可權表中,許可權範圍依次遞減,全域性許可權覆蓋區域性許可權。
安全
作業系統相關的安全問題
- 嚴格控制作業系統賬號(通常為mysql)和許可權。
- 儘量避免以root(通常使用mysql)許可權執行MySQL。
- 防止DNS欺騙:建立賬號時host可指定域名,但若域名對應的IP地址被惡意修改,則資料庫就會被惡意的IP地址訪問。
資料庫相關的安全問題
- 刪除匿名賬號。
- 給root賬號設定密碼。
- 設定安全密碼。使用密碼有以下幾種方式,也需注意安全問題:直接將密碼寫在命令列中;互動式輸入密碼;將賬號和密碼寫在配置檔案中,如寫在/etc/my.cnf的client組中。
- 只授予賬號必需的許可權。
- 除root外,任何賬號不應有mysql庫user表的存取許可權。
- 不要把
FILE
、PROCESS
、SUPER
許可權授予管理員以外的賬號。 - 注意
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
許可權的使用者才能執行且顯示所有庫名;不使用該選項,則所有使用者都能執行,但只顯示有許可權的庫名。