本文更新於2020-05-03,使用MySQL 5.7,操作系統為Deepin 15.4。 許可權 許可權存取需要用到mysql庫中user、db、host、tables_priv、columns_prvi這幾個許可權表。列分為4個部分:用戶列、許可權列、安全列、資源控制列。許可權列又分為普通許可權和管理許可權。 ...
本文更新於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
許可權的用戶才能執行且顯示所有庫名;不使用該選項,則所有用戶都能執行,但只顯示有許可權的庫名。