MySQL許可權詳解
本文為joshua317原創文章,轉載請註明:轉載自joshua317部落格https://www.joshua317.com/article/55
MySQL提供了哪些許可權
MySQL提供的許可權列表如圖所示(其中,All或者Allprivileges代表權限列表中除Grant option許可權之外的所有許可權)。
在上圖所示的許可權列表中,Context欄位顯示了該許可權的使用環境(或者叫許可權的作用域)。根據Context欄位內容的不同,許可權分為如下三類。
按照系統許可權劃分
1、管理許可權
用於管理MySQL伺服器的操作。這些許可權是全域性性的,授權範圍不能是特定的資料庫或資料庫物件(只能使用*.*方式授予,不能使用db.*或db.tb方式)。
● Create user
● Event
● Process
● Proxy
● Reload
● Replication client
● Replication slave
● Show databases
● Shutdown
● Super
● Create tablespace
● Usage
● Grant option
2、資料庫級別許可權
授權範圍可以是某資料庫或某資料庫中的所有物件,也可以是所有資料庫(可以使用*.*代表全域性物件;也可以使用db.*代表某庫下的所有物件)。
● Create
● Create routine
● Create temporary tables
● Drop
● Lock tables
● References
3、資料庫物件級別許可權
授權範圍可以為資料庫中的特定物件、資料庫內給定型別的物件,也可以是所有資料庫(*.*代表全域性物件,db.*代表某庫下的所有物件,db.tb代表某庫下的某物件)。
● Alter
● Alter routine
● Create view
● Delete
● Execute
● File
● Index
● Insert
● Select
● Show view
● Trigger
● Update
按照使用經驗劃分
1、開發許可權
● Delete
● Insert
● Select
● Update
● Alter
● Create temporary tables
● Trigger
● Create view
● Show view
● Alter routine
● Create routine● Execute● Index● Event
2、管理許可權——表級別(這裡把帶表級別的管理命令都歸類為表級別)
● Create
● File
● Drop
● Lock tables
3、管理許可權——伺服器級別
● Grant option
● Create tablespace
● Create user
● Process
● Proxy
● Reload
● Replication client
● Replication slave
● Show databases
● Shutdown
● Super
● Usage
● All [privileges]
許可權作用
● All或All privileges:除Grant option之外,代表其他所有許可權。
● Alter:該許可權用於使用ALTER TABLE語句來更改表的結構(除該許可權之外,使用ALTER TABLE語句還需要有Create和Insert許可權,使用ALTER TABLE RENAME語句需要有舊錶上的Alter和Drop許可權,新表上的Create和Insert許可權)。
● Alter routine:該許可權用於修改或刪除儲存過程或儲存函式。
● Create:該許可權用於建立庫和表。
● Create routine:該許可權用於建立儲存過程或儲存函式。
● Create tablespace:該許可權用於建立、修改、刪除表空間檔案和日誌組檔案。
● Create temporary tables:該許可權用於建立臨時表。使用CREATE TEMPORARY TABLE語句建立臨時表,一旦某會話建立臨時表成功後,伺服器不會在該表上執行許可權檢查(因為其他會話看不見此表,建立此表的會話一旦斷開,臨時表就會自動刪除)。即,建立臨時表的會話可以對該臨時表執行任何操作,例如DROP TABLE、INSERT、UPDATE、SELECT等操作。
● Create user:該許可權用於使用ALTER USER、CREATEUSER、DROP USER、RENAME USER、REVOKE ALLPRIVILEGES語句。
● Create view:該許可權用於使用CREATE VIEW語句。
● Delete:該許可權用於從資料庫表中刪除資料記錄。
● Delete:該許可權用於從資料庫表中刪除資料記錄。
● Drop:該許可權用於刪除現有庫、表、檢視等物件。另外,如果在分割槽表上使用ALTER TABLE ... DROPPARTITION語句,則必須要有表的Drop許可權,執行TRUNCATE TABLE也需要有Drop許可權(但要注意,如果將MySQL資料庫的Drop許可權授予使用者,則該使用者可以刪除儲存MySQL訪問許可權記錄的資料庫mysql)。
● Event:該許可權用於建立、更改、刪除或檢視EventScheduler事件。
● Execute:該許可權用於執行儲存過程或儲存函式。
● File:該許可權用於執行LOAD DATA INFILE和SELECT ...INTO OUTFILE語句以及LOAD_FILE()函式來讀寫伺服器主機上的檔案。具有File許可權的使用者可以讀取伺服器主機上的任何可讀檔案或MySQL伺服器可讀檔案。(即,使用者可讀取datadir目錄中的任何檔案),File許可權還使使用者能夠在MySQL伺服器有寫入許可權的任何目錄下建立新檔案。所以,作為安全保護措施,伺服器不會覆蓋現有檔案(即,在執行匯出資料到文字時,如果檔名重複,則匯出語句無法成功執行)。在MySQL 5.7版本中,可以使用secure_file_priv系統變數限制File許可權的讀寫目錄。
● Grant option:該許可權用於授予或回收其他使用者或自己擁有的許可權。
● Index:該許可權用於建立或刪除索引。Index許可權適用於在已存在的表上使用CREATE INDEX語句,如果使用者具有Create許可權,則可以在CREATE TABLE語句中包含索引定義語句。
● Insert:該許可權用於向表中插入資料記錄行。對於ANALYZE TABLE、OPTIMIZE TABLE和REPAIR TABLE表維護語句也需要Insert許可權。
● Lock tables:該許可權用於使用LOCK TABLES語句對錶顯式加鎖,持有表鎖的使用者對該表有讀寫許可權,未持有表鎖的使用者對該表的讀寫訪問會被阻塞。
● Process:該許可權用於顯示有關在伺服器上執行的執行緒資訊(即,關於會話正在執行的語句相關狀態資訊)。擁有該許可權的使用者在使用SHOW PROCESSLIST語句或mysqladmin processlist命令檢視有關執行緒資訊時,除可以看到自己的執行緒資訊之外還可以檢視到屬於其他賬號的執行緒資訊。另外,使用SHOW ENGINE語句以及檢視information_schema系統庫中的相當一部分表也需要該許可權。
● Proxy:該許可權使使用者能夠模仿(偽裝、代理)另一個使用者。
● References:在建立外來鍵約束時,該許可權需要使用者具有父表的References許可權。
● Reload:該許可權允許使用者使用FLUSH語句。擁有該許可權的使用者還可以使用與FLUSH操作等效的mysqladmin子命令——flush-hosts、flush-logs、flush-privileges、flush-status、flush-tables、flush-threads、refresh和reload。其中,reload子命令會通知伺服器將許可權表重新載入到記憶體中;flush-privileges子命令的作用與reload相同;refresh子命令會通知伺服器關閉並重新開啟日誌檔案且重新整理所有表。其他flush-xxx子命令也會執行類似於重新整理的功能,這些子命令重新整理的物件更具體。例如,只想重新整理日誌檔案,則使用flush-logs子命令。
● Replication client:該許可權用於使用SHOW MASTERSTATUS、SHOW SLAVE STATUS和SHOW BINARYLOGS語句。
● Replication slave:該許可權用於從從庫伺服器連線到主庫伺服器並請求主庫的binlog日誌。如果沒有此許可權,從庫將無法請求主庫資料庫變更的binlog日誌。
● Select:該許可權用於從資料庫表中查詢資料行記錄。使用SELECT語句只有實際從表中檢索行記錄時才需要Select許可權。但某些SELECT語句不需要訪問表,並且可以在沒有任何資料庫許可權的情況下執行。例如,使用SELECT語句拼接的常量表達式:SELECT 1 + 1; SELECT PI()* 2;。另外,使用UPDATE或DELETE語句,當使用WHERE子句指定了某欄位的條件值時,也需要該欄位的SELECT許可權;否則,你會發現可以使用UPDATE不帶WHERE子句更新全表,卻不能使用WHERE語句指定更新某些行記錄。對基表或檢視使用EXPLAIN語句,也需要使用者對錶或檢視具有該許可權。
● Show databases:該許可權用於執行SHOW DATABASE語句,對於沒有此許可權的使用者,則只能看到其具有對應訪問許可權的資料庫列表。如果伺服器使用了--skip-show-database選項啟動,則沒有該許可權的使用者即使對某庫有其他訪問許可權,也不能使用SHOW DATABASES語句檢視任何資料庫列表(會報錯:ERROR 1227(42000):Accessdenied; you need(at least one of)the SHOWDATABASES privilege(s)for this operation)。
● Show view:該許可權用於執行SHOW CREATE VIEW語句。對檢視使用EXPLAIN語句也需要此許可權。
● Shutdown:該許可權用於執行SHUTDOWN語句、mysqladmin shutdown命令和mysql_shutdown()CAPI函式。
● Super:該許可權用於進行如下操作和伺服器行為。
■ 修改全域性系統配置變數需要此許可權。對於某些系統變數,修改會話級別的系統配置變數也需要Super許可權(如果修改會話級別的系統配置變數需要Super許可權,在變數的解釋文件中會進行說明,例如binlog_format、sql_log_bin和sql_log_off)。
■ 對全域性事務特徵的更改(START TRANSACTION語句)。
■ 從庫伺服器用於執行啟動和停止複製的語句,包括組複製。
■ 從庫伺服器用於執行CHANGE MASTER TO和CHANGE REPLICATION FILTER語句。
■ 執行PURGE BINARY LOGS和BINLOG語句。
■ 如果檢視或儲存程式定義了DEFINER屬性,則擁有Super許可權的使用者就算不是該檢視或儲存程式的建立者,也仍然可以執行該檢視或儲存程式。
■ 執行CREATE SERVER、ALTER SERVER和DROPSERVER語句。
■ 執行mysqladmin debug命令。
■ 用於InnoDB key自旋。
■ 通過執行DES_ENCRYPT()函式啟用讀取DES金鑰檔案。
■ 執行使用者自定義函式時啟用版本令牌。
■ 超過了最大連線數之後,具有Super許可權的賬戶還可以執行的操作有:
➢ 使用KILL語句或mysqladmin kill命令來終止屬於其他賬戶的執行緒(注意:無論是否擁有Super許可權,使用者總是可以kill自己的執行緒)。➢ 即使伺服器總連線數達到max_connections系統變數定義的值,伺服器也會接受來自具有Super許可權的使用者的一個額外連線。➢ 即使伺服器啟用了read_only系統變數,具有Super許可權的使用者也仍然可以執行資料更新,包括顯式的操作更新和隱式的操作更新(賬戶管理語句GRANT和REVOKE等觸發的表更新)。
➢ 具有Super許可權的使用者連線伺服器時,伺服器不執行init_connect系統變數指定的內容。➢ 處於離線模式(已啟用offline_mode系統變數)的伺服器不會中斷具有Super許可權的使用者的連線,且仍然接受具有Super許可權的使用者的新連線請求。
■ 如果啟用了二進位制日誌記錄功能,則使用者可能還需要Super許可權才能建立或更改儲存的功能。
● Trigger:該許可權用於觸發器的操作。使用者必須擁有某表的該許可權才能針對該表建立、刪除、執行或檢視其觸發器。
● Update:該許可權用於執行對資料庫表中的資料行更新操作。
● Usage:該許可權代表使用者“無任何許可權”。全域性級別許可權,擁有該許可權的使用者可以登入到資料庫伺服器中,但在預設配置下除能夠執行部分show命令之外,其他任何資料變更和資料庫查詢操作都無法執行。
提示:只向用戶授予其需要的許可權,不要授予額外的多餘的許可權,特別是管理許可權,例如File、Grant option、Alter、Shutdown、Process、Super等。
本文為joshua317原創文章,轉載請註明:轉載自joshua317部落格https://www.joshua317.com/article/55