Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

6.2.11 アカウントカテゴリ

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 権限の影響を受ける操作

SYSTEM_USER 権限は、次の操作に影響します:

  • アカウント操作。

    アカウント操作には、アカウントの作成と削除、権限の付与と取消し、資格証明や認証プラグインなどのアカウント認証特性の変更、およびパスワード有効期限ポリシーなどの他のアカウント特性の変更が含まれます。

    CREATE USERGRANT などのアカウント管理ステートメントを使用してシステムアカウントを操作するには、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 USERGRANT などのアカウント管理ステートメントを使用します。 これが推奨される方法です。

  • INSERTUPDATE などのステートメントを使用して権限テーブルを直接変更します。 この方法はお薦めしませんが、付与テーブルを含む 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;