文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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 權限會影響這些操作

  • 帳戶操縱。

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

    需要 SYSTEM_USER 權限才能使用帳戶管理語句(例如 CREATE USERGRANT)操作系統帳戶。為了防止帳戶以這種方式修改系統帳戶,請使其成為一般帳戶,不要授予它 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 權限授予或撤銷給帳戶,則該帳戶的現有連線不會在一般連線和系統連線之間變更。授予或撤銷操作僅影響該帳戶後續連線的連線。

  • 由在連線中叫用的儲存物件執行的語句會以父連線的系統或一般狀態執行,即使物件 DEFINER 屬性指定了系統帳戶。

因為角色啟用只影響連線而不影響帳戶,所以授予具有 SYSTEM_USER 權限的角色給一般帳戶無法保護該帳戶免受一般使用者的侵害。該角色僅保護已啟用該角色的帳戶的連線,且僅保護連線免受一般連線的終止。

保護系統帳戶免受一般帳戶操作

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

帳戶操作可以透過兩種方式完成

  • 透過使用帳戶管理語句,例如 CREATE USERGRANT。這是偏好的方法。

  • 透過使用語句(例如 INSERTUPDATE)直接修改授權表。不建議使用此方法,但對於具有包含授權表的 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 綱要存取權,例如唯讀存取權。下列範例建立一個帳戶,該帳戶在所有綱要上全域具有 SELECTINSERTUPDATEDELETE 權限,但在 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 表格的 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;