MySQL 結合了使用者帳戶類別的概念,其根據 SYSTEM_USER
權限。
MySQL 結合了使用者帳戶類別的概念,系統使用者和一般使用者會根據他們是否具有 SYSTEM_USER
權限來區分
具有
SYSTEM_USER
權限的使用者是系統使用者。不具有
SYSTEM_USER
權限的使用者是一般使用者。
SYSTEM_USER
權限會影響給定使用者可以將其其他權限應用於哪些帳戶,以及使用者是否受到其他帳戶的保護
系統使用者可以修改系統帳戶和一般帳戶。也就是說,如果使用者具有在一般帳戶上執行給定操作的適當權限,則擁有
SYSTEM_USER
權限即可在系統帳戶上執行該操作。只有具有適當權限的系統使用者才能修改系統帳戶,而一般使用者則不能。具有適當權限的一般使用者可以修改一般帳戶,但不能修改系統帳戶。具有適當權限的系統使用者和一般使用者都可以修改一般帳戶。
如果使用者具有在一般帳戶上執行給定操作的適當權限,則 SYSTEM_USER
會讓使用者也可以在系統帳戶上執行該操作。SYSTEM_USER
不意味著任何其他權限,因此執行給定帳戶操作的能力仍然以擁有任何其他必要權限為前提。例如,如果使用者可以將 SELECT
和 UPDATE
權限授予一般帳戶,則有了 SYSTEM_USER
,使用者也可以將 SELECT
和 UPDATE
授予系統帳戶。
系統帳戶和一般帳戶之間的區別可透過保護具有 SYSTEM_USER
權限的帳戶,使其免受沒有該權限的帳戶影響,從而更好地控制某些帳戶管理問題。例如,CREATE USER
權限不僅可以建立新的帳戶,還可以修改和刪除現有帳戶。如果沒有系統使用者的概念,具有 CREATE USER
權限的使用者可以修改或刪除任何現有帳戶,包括 root
帳戶。系統使用者概念可以限制對 root
帳戶 (其本身是一個系統帳戶) 的修改,使其只能由系統使用者進行。具有 CREATE USER
權限的一般使用者仍然可以修改或刪除現有帳戶,但只能修改一般帳戶。
SYSTEM_USER
權限會影響這些操作
帳戶操縱。
帳戶操作包括建立和刪除帳戶、授予和撤銷權限、變更帳戶驗證特性(例如憑證或驗證外掛程式),以及變更其他帳戶特性(例如密碼過期原則)。
需要
SYSTEM_USER
權限才能使用帳戶管理語句(例如CREATE USER
和GRANT
)操作系統帳戶。為了防止帳戶以這種方式修改系統帳戶,請使其成為一般帳戶,不要授予它SYSTEM_USER
權限。(然而,為了充分保護系統帳戶免受一般帳戶的侵害,您還必須禁止一般帳戶修改mysql
系統綱要的權限。請參閱保護系統帳戶免受一般帳戶操作。)終止當前連線和其中執行的語句。
要終止具有
SYSTEM_USER
權限執行的連線或語句,您自己的連線必須具有SYSTEM_USER
權限,以及任何其他需要的權限(CONNECTION_ADMIN
或已棄用的SUPER
權限)。如果將伺服器設定為離線模式的使用者沒有
SYSTEM_USER
權限,則具有SYSTEM_USER
權限的已連線用戶端使用者也不會斷開連線。但是,這些使用者在伺服器處於離線模式時無法啟動與伺服器的新連線,除非他們也具有CONNECTION_ADMIN
或SUPER
權限。只有他們現有的連線不會被終止,因為需要SYSTEM_USER
權限才能執行此操作。設定儲存物件的
DEFINER
屬性。若要將儲存物件的
DEFINER
屬性設定為具有SYSTEM_USER
權限的帳戶,您必須具有SYSTEM_USER
權限,以及任何其他需要的權限。指定強制角色。
具有
SYSTEM_USER
權限的角色不能列在mandatory_roles
系統變數的值中。覆寫 MySQL Enterprise Audit 的稽核記錄篩選器中的 「中止」項目。
具有
SYSTEM_USER
權限的帳戶會自動被指派AUDIT_ABORT_EXEMPT
權限,因此即使稽核記錄篩選器中的 「中止」項目會封鎖查詢,仍會始終執行來自該帳戶的查詢。因此,具有SYSTEM_USER
權限的帳戶可用於在稽核設定錯誤後重新取得系統的存取權。請參閱第 8.4.5 節「MySQL Enterprise Audit」。
在伺服器中執行的連線會區分為系統連線或一般連線,類似於系統使用者和一般使用者之間的區別
具有
SYSTEM_USER
權限的連線是系統連線。不具有
SYSTEM_USER
權限的連線是一般連線。
一般連線只能執行允許一般使用者執行的操作。系統連線還可以執行僅允許系統使用者執行的操作。
連線所擁有的權限是直接授予其基礎帳戶的權限,加上授予連線中目前所有使用中的角色的權限。因此,連線可能是系統連線,因為其帳戶已直接被授予 SYSTEM_USER
權限,或者因為連線已啟用具有 SYSTEM_USER
權限的角色。授予帳戶但未在連線中啟用的角色不會影響連線權限。
因為啟用和停用角色可能會變更連線所擁有的權限,所以連線可能會從一般連線變更為系統連線,反之亦然。如果連線啟用或停用具有 SYSTEM_USER
權限的角色,則會立即對該連線進行一般連線和系統連線之間的適當變更
如果一般連線啟用具有
SYSTEM_USER
權限的角色,則連線會變成系統連線。如果系統連線停用具有
SYSTEM_USER
權限的角色,則連線會變成一般連線,除非另一個具有SYSTEM_USER
權限的角色仍然處於使用中狀態。
這些操作對現有連線沒有任何影響
如果將
SYSTEM_USER
權限授予或撤銷給帳戶,則該帳戶的現有連線不會在一般連線和系統連線之間變更。授予或撤銷操作僅影響該帳戶後續連線的連線。由在連線中叫用的儲存物件執行的語句會以父連線的系統或一般狀態執行,即使物件
DEFINER
屬性指定了系統帳戶。
因為角色啟用只影響連線而不影響帳戶,所以授予具有 SYSTEM_USER
權限的角色給一般帳戶無法保護該帳戶免受一般使用者的侵害。該角色僅保護已啟用該角色的帳戶的連線,且僅保護連線免受一般連線的終止。
帳戶操作包括建立和刪除帳戶、授予和撤銷權限、變更帳戶驗證特性(例如憑證或驗證外掛程式),以及變更其他帳戶特性(例如密碼過期原則)。
帳戶操作可以透過兩種方式完成
透過使用帳戶管理語句,例如
CREATE USER
和GRANT
。這是偏好的方法。透過使用語句(例如
INSERT
和UPDATE
)直接修改授權表。不建議使用此方法,但對於具有包含授權表的mysql
系統綱要之適當權限的使用者而言,此方法是可行的。
若要完全保護系統帳戶免受給定帳戶的修改,請將其設為一般帳戶,且不要授予其修改 mysql
綱要的權限
需要
SYSTEM_USER
權限才能使用帳戶管理語句操作系統帳戶。若要防止帳戶以這種方式修改系統帳戶,請使其成為一般帳戶,不要授予它SYSTEM_USER
。這包括不授予任何授予該帳戶的角色的SYSTEM_USER
。mysql
綱要的權限可透過直接修改授權表來操作系統帳戶,即使修改帳戶是一般帳戶。若要限制一般帳戶未經授權直接修改系統帳戶,請不要授予該帳戶(或任何授予該帳戶的角色)修改mysql
綱要的權限。如果一般帳戶必須具有適用於所有綱要的全域權限,則可以使用使用部分撤銷施加的權限限制來防止mysql
綱要修改。請參閱第 8.2.12 節「使用部分撤銷的權限限制」。
與不授予 SYSTEM_USER
權限不同,後者會阻止帳戶修改系統帳戶,但不會阻止其修改一般帳戶;不授予 mysql
綱要權限會阻止帳戶修改系統帳戶以及一般帳戶。這不應該是個問題,因為如前所述,不建議直接修改授權表。
假設您想要建立一個使用者 u1
,該使用者在所有綱要上具有所有權限,但 u1
應為一般使用者,沒有修改系統帳戶的能力。假設已啟用 partial_revokes
系統變數,請將 u1
設定如下
CREATE USER u1 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u1 WITH GRANT OPTION;
-- GRANT ALL includes SYSTEM_USER, so at this point
-- u1 can manipulate system or regular accounts
REVOKE SYSTEM_USER ON *.* FROM u1;
-- Revoking SYSTEM_USER makes u1 a regular user;
-- now u1 can use account-management statements
-- to manipulate only regular accounts
REVOKE ALL ON mysql.* FROM u1;
-- This partial revoke prevents u1 from directly
-- modifying grant tables to manipulate accounts
若要阻止帳戶的所有 mysql
系統綱要存取權,請撤銷其在 mysql
綱要上的所有權限,如剛才所示。也可以允許部分 mysql
綱要存取權,例如唯讀存取權。下列範例建立一個帳戶,該帳戶在所有綱要上全域具有 SELECT
、INSERT
、UPDATE
和 DELETE
權限,但在 mysql
綱要上僅具有 SELECT
權限
CREATE USER u2 IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u2;
REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM u2;
另一種可能性是撤銷所有 mysql
綱要權限,但允許存取特定的 mysql
表格或欄。即使部分撤銷 mysql
也可以執行此操作。下列語句可在 mysql
綱要中啟用對 u1
的唯讀存取,但僅限於 db
表格和 user
表格的 Host
和 User
欄
CREATE USER u3 IDENTIFIED BY 'password';
GRANT ALL ON *.* TO u3;
REVOKE ALL ON mysql.* FROM u3;
GRANT SELECT ON mysql.db TO u3;
GRANT SELECT(Host,User) ON mysql.user TO u3;