MySQL 8.0.16 では、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
権限で実行されているセッションまたはステートメントを強制終了するには、他の必要な権限 (CONNECTION_ADMIN
または非推奨のSUPER
権限) に加えて、自分のセッションにSYSTEM_USER
権限が必要です。MySQL 8.0.16 より前は、セッションまたはステートメントを強制終了するには
CONNECTION_ADMIN
権限 (または非推奨のSUPER
権限) で十分です。 -
ストアドオブジェクトの
DEFINER
属性を設定します。ストアドオブジェクトの
DEFINER
属性をSYSTEM_USER
権限を持つアカウントに設定するには、他の必要な権限 (SET_USER_ID
または非推奨のSUPER
権限) に加えて、SYSTEM_USER
権限が必要です。MySQL 8.0.16 より前は、
SET_USER_ID
権限 (または非推奨のSUPER
権限) を使用して、ストアドオブジェクトのDEFINER
値を指定するだけで十分です。 -
必須ロールの指定。
SYSTEM_USER
権限を持つロールは、mandatory_roles
システム変数の値にリストできません。MySQL 8.0.16 より前は、
mandatory_roles
に任意のロールをリストできます。
サーバー内で実行されているセッションは、システムユーザーと通常のユーザーの区別と同様に、システムセッションまたは通常のセッションと区別されます:
SYSTEM_USER
権限を持つセッションはシステムセッションです。SYSTEM_USER
権限を持たないセッションは通常のセッションです。
通常のセッションは、通常のユーザーに許可されている操作のみを実行できます。 システムセッションは、システムユーザーにのみ許可される操作を追加で実行できます。
セッションによって所有される権限は、基礎となるアカウントに直接付与される権限と、セッション内で現在アクティブなすべてのロールに付与される権限です。 したがって、そのアカウントに SYSTEM_USER
権限が直接付与されているか、セッションで SYSTEM_USER
権限を持つロールがアクティブ化されているため、セッションはシステムセッションである可能性があります。 セッション内でアクティブでないアカウントに付与されたロールは、セッション権限には影響しません。
ロールをアクティブ化および非アクティブ化すると、セッションが所有する権限が変更される可能性があるため、セッションは通常のセッションからシステムセッションに、またはその逆に変更される可能性があります。 セッションが SYSTEM_USER
権限を持つロールをアクティブ化または非アクティブ化すると、通常のセッションとシステムセッションの間の適切な変更は、そのセッションに対してのみ即時に行われます:
通常のセッションが
SYSTEM_USER
権限を持つロールをアクティブ化すると、そのセッションはシステムセッションになります。システムセッションが
SYSTEM_USER
権限を持つロールを非アクティブ化した場合、SYSTEM_USER
権限を持つ他のロールがアクティブなままでないかぎり、そのセッションは通常のセッションになります。
これらの操作は、既存のセッションには影響しません:
SYSTEM_USER
権限がアカウントに対して付与または取り消された場合、そのアカウントの既存のセッションは通常のセッションとシステムセッションの間で変更されません。 付与または取消し操作は、アカウントによる後続の接続のセッションにのみ影響します。セッション内で呼び出されたストアドオブジェクトによって実行されるステートメントは、オブジェクトの
DEFINER
属性がシステムアカウントを指定している場合でも、親セッションのシステムステータスまたは通常のステータスで実行されます。
ロールのアクティブ化はセッションにのみ影響し、アカウントには影響しないため、SYSTEM_USER
権限を持つロールを通常のアカウントに付与しても、そのアカウントは通常のユーザーから保護されません。 このロールは、ロールがアクティブ化されているアカウントのセッションのみを保護し、通常のセッションによる強制終了からのみセッションを保護します。
アカウント操作には、アカウントの作成と削除、権限の付与と取消し、資格証明や認証プラグインなどのアカウント認証特性の変更、およびパスワード有効期限ポリシーなどの他のアカウント特性の変更が含まれます。
アカウント操作は、次の 2 つの方法で実行できます:
CREATE USER
やGRANT
などのアカウント管理ステートメントを使用します。 これが推奨される方法です。INSERT
やUPDATE
などのステートメントを使用して権限テーブルを直接変更します。 この方法はお薦めしませんが、付与テーブルを含むmysql
システムスキーマに対する適切な権限を持つユーザーにはお薦めします。
特定のアカウントによる変更からシステムアカウントを完全に保護するには、通常のアカウントにし、mysql
スキーマに対する変更権限を付与しないでください:
account-management ステートメントを使用してシステムアカウントを操作するには、
SYSTEM_USER
権限が必要です。 この方法でアカウントがシステムアカウントを変更できないようにするには、SYSTEM_USER
を付与しないで、通常のアカウントにします。 これには、アカウントに付与されたロールへのSYSTEM_USER
の付与は含まれません。mysql
スキーマの権限を使用すると、変更するアカウントが通常のアカウントであっても、権限付与テーブルを直接変更することでシステムアカウントを操作できます。 通常のアカウントによるシステムアカウントの不正な直接変更を制限するには、mysql
スキーマの変更権限をアカウント (またはアカウントに付与されたロール) に付与しないでください。 通常のアカウントに、すべてのスキーマに適用されるグローバル権限が必要な場合は、部分的な取消しを使用して課される権限制限を使用して、mysql
スキーマの変更を防止できます。 セクション6.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
への読取り専用アクセスを有効にしますが、user
テーブルの db
テーブル、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;