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
權限會影響以下操作:
帳戶操作。
帳戶操作包括建立和刪除帳戶、授予和撤銷權限、變更帳戶身份驗證特性(如憑證或身份驗證外掛程式),以及變更其他帳戶特性(如密碼到期策略)。
使用帳戶管理語句(例如
CREATE USER
和GRANT
)來操作系統帳戶時,需要SYSTEM_USER
權限。為了防止帳戶以這種方式修改系統帳戶,請不要授予它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
schema 權限則會阻止帳戶修改系統帳戶以及一般帳戶。這應該不會有問題,因為如前所述,不鼓勵直接修改授權表。
假設您要建立一個使用者 u1
,該使用者在所有 schema 上都具有所有權限,但 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
系統 schema,請撤銷其在 mysql
schema 上的所有權限,如剛才所示。也可以允許部分 mysql
schema 存取,例如唯讀存取。以下範例建立一個帳戶,該帳戶在所有 schema 上具有全域 SELECT
、INSERT
、UPDATE
和 DELETE
權限,但對於 mysql
schema 僅具有 SELECT
權限。
CREATE USER u2 IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u2;
REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM u2;
另一種可能性是撤銷所有 mysql
schema 權限,但允許存取特定的 mysql
表格或欄位。即使對 mysql
進行部分撤銷,也可以這樣做。以下陳述式啟用 u1
在 mysql
schema 內的唯讀存取權限,但僅限於 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;