文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  帳戶類別

8.2.11 帳戶類別

MySQL 納入了使用者帳戶類別的概念,這是根據 SYSTEM_USER 權限而定。

系統和一般帳戶

MySQL 納入了使用者帳戶類別的概念,系統使用者和一般使用者根據他們是否具有 SYSTEM_USER 權限來區分

  • 具有 SYSTEM_USER 權限的使用者是系統使用者。

  • 不具有 SYSTEM_USER 權限的使用者是一般使用者。

SYSTEM_USER 權限會影響指定使用者可以對其應用其他權限的帳戶,以及使用者是否受到其他帳戶保護

  • 系統使用者可以修改系統和一般帳戶。也就是說,具有適當權限可對一般帳戶執行指定操作的使用者,因為擁有 SYSTEM_USER 而也被允許對系統帳戶執行操作。系統帳戶只能由具有適當權限的系統使用者修改,不能由一般使用者修改。

  • 具有適當權限的一般使用者可以修改一般帳戶,但不能修改系統帳戶。一般帳戶可以由具有適當權限的系統使用者和一般使用者修改。

如果使用者具有適當權限可對一般帳戶執行指定操作,則 SYSTEM_USER 會允許使用者也對系統帳戶執行操作。SYSTEM_USER 不表示任何其他權限,因此執行指定帳戶操作的能力仍然取決於是否擁有任何其他必要的權限。例如,如果使用者可以將 SELECTUPDATE 權限授予一般帳戶,那麼透過 SYSTEM_USER,使用者也可以將 SELECTUPDATE 授予系統帳戶。

系統帳戶和一般帳戶之間的區別,藉由保護擁有 SYSTEM_USER 權限的帳戶,使其不受不具備此權限的帳戶影響,可以更好地控制某些帳戶管理問題。例如,CREATE USER 權限不僅可以建立新帳戶,還可以修改和移除現有帳戶。若沒有系統使用者概念,擁有 CREATE USER 權限的使用者可以修改或刪除任何現有帳戶,包括 root 帳戶。系統使用者概念允許限制對 root 帳戶(本身是系統帳戶)的修改,使其只能由系統使用者進行。擁有 CREATE USER 權限的一般使用者仍然可以修改或刪除現有帳戶,但僅限於一般帳戶。

受 SYSTEM_USER 權限影響的操作

SYSTEM_USER 權限會影響以下操作:

  • 帳戶操作。

    帳戶操作包括建立和刪除帳戶、授予和撤銷權限、變更帳戶身份驗證特性(如憑證或身份驗證外掛程式),以及變更其他帳戶特性(如密碼到期策略)。

    使用帳戶管理語句(例如 CREATE USERGRANT)來操作系統帳戶時,需要 SYSTEM_USER 權限。為了防止帳戶以這種方式修改系統帳戶,請不要授予它 SYSTEM_USER 權限,使其成為一般帳戶。(但是,為了完全保護系統帳戶免受一般帳戶影響,您還必須禁止一般帳戶修改 mysql 系統綱要的權限。請參閱保護系統帳戶免受一般帳戶操作)。

  • 終止目前的工作階段和在其中執行的語句。

    若要終止擁有 SYSTEM_USER 權限的工作階段或語句,您自己的工作階段必須擁有 SYSTEM_USER 權限,以及任何其他需要的權限(CONNECTION_ADMIN 或已棄用的 SUPER 權限)。

    如果將伺服器設為離線模式的使用者沒有 SYSTEM_USER 權限,則擁有 SYSTEM_USER 權限的連線用戶端使用者也不會被斷開連線。但是,這些使用者無法在伺服器處於離線模式時發起與伺服器的新連線,除非他們也擁有 CONNECTION_ADMINSUPER 權限。只有他們現有的連線不會被終止,因為終止連線需要 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 USERGRANT。這是較佳的方法。

  • 使用 INSERTUPDATE 等語句直接修改授權表。不建議使用這種方法,但對於在包含授權表的 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 上具有全域 SELECTINSERTUPDATEDELETE 權限,但對於 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 進行部分撤銷,也可以這樣做。以下陳述式啟用 u1mysql schema 內的唯讀存取權限,但僅限於 db 表格以及 user 表格的 HostUser 欄位。

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;