はじめに
アクセス制御とユーザー管理は、システム内のユーザー数とさまざまなデータベースエンティティが増えるにつれて、すぐに複雑になる可能性がある2つの領域です。さまざまなデータベースオブジェクトに対するさまざまな特権を管理し、同じ責任を持つユーザーが同じレベルのアクセス権を持つようにし、アクセスの監査と絞り込みはすべて時間の経過とともに難しくなります。
これに対処するために、MySQLには「ロール」と呼ばれる概念があります。これにより、特権のバンドルを特定の名前でグループ化し、設定をまとめて割り当てたり変更したりできます。このガイドでは、MySQL内でロールがどのように機能するか、およびロールを使用してユーザーのデータアクセスを管理しやすくする方法について説明します。
コマンド
MySQLの役割の管理に関連して説明する主なSQLコマンドは次のとおりです。
-
CREATE ROLE
:CREATE ROLE
コマンドは、データベースシステム内の新しい役割を定義します。 -
DROP ROLE
:DROP ROLE
コマンドは反対のことを行い、既存の役割を削除します。 -
GRANT
:GRANT
コマンドには、役割に関連する2つの明確な目的があります。役割に特権を追加することと、役割のメンバーとしてユーザーアカウントを追加することです。 -
REVOKE
:役割のコンテキストでは、REVOKE
コマンドは、ロールから特権を削除し、ユーザーアカウントからロールメンバーシップも削除します。 SHOW GRANTS
:SHOW GRANTS
コマンドは、指定されたユーザーアカウントまたはロールの特権を表示します。-
SET ROLE
:SET ROLE
コマンドは、ユーザーアカウントがアクティブに使用している役割を変更します。これにより、セッションのアカウントに適用する権限のセットを指定できます。 -
SET DEFAULT ROLE
:SET DEFAULT ROLE
コマンドは、クライアントが特定のユーザーアカウントとしてログインしたときに自動的に適用される役割を定義します。
必要な権限
このガイドに従うには、次の権限が必要です。
-
CREATE ROLE
GRANT OPTION
-
CREATE USER
(別のユーザーのデフォルトの役割を設定するため) -
ROLE_ADMIN
(役割の動作を変更するシステム変数を設定するため) -
SYSTEM_VARIABLES_ADMIN
(役割の動作を変更するシステム変数を設定するため)
CREATE ROLE
特権は、CREATE USER
の下位バージョンです。 特権。ロールを作成および管理できます。すでにCREATE USER
を持っているアカウント 特権には、役割の管理に必要なすべての機能が自動的に含まれます。
GRANT OPTION
ロールに特権を割り当てるには、特権が必要です。 GRANT OPTION
が必要です ロールに割り当てたい特権に対して有効になっています。
役割とは何ですか?
MySQLでは、ロールは、特権のコンテナーまたはコレクションとして機能するエンティティです。管理者は、ユーザーアカウントに特権を割り当てるのと同じ方法で、ロールに特権を割り当てることができます。次に、ユーザーアカウントをロールのメンバーとして追加し、それらのアカウントがロールに関連付けられた特権にアクセスできるようにします。
基本的に、ロールは、特権管理を容易にするために、関連するさまざまな特権をバンドルする方法として機能します。個々の特権を割り当てることで、各ユーザーが必要なレベルのアクセス権を持っていることを確認する代わりに、名前付きの特権グループを使用すると、管理する割り当ての数を減らし、理解しやすくすることができます。
developer
を割り当てる方が簡単なので、アクセスレベルを割り当てるときにこれには明らかな利点があります。 、sysadmin
、またはfinanceteam
数十の特権を個別に管理するよりも、ユーザーに対する役割。また、一度に複数のアカウントへのアクセスをすばやく調整できます。営業チーム用の新しいデータベースを作成する場合は、salesteam
を指定できます。 アクセスする必要のあるすべてのアカウントを追跡するのではなく、それにアクセスする役割を果たします。
ロールの作成
CREATE ROLE
のアカウントをお持ちの場合 特権、CREATE ROLE
を使用して役割を管理できます コマンド。
MySQLの役割の構文は何ですか?
ロール名は、MySQLが有効であると見なすために、特定の形式に従う必要があります。多くの点で、MySQLユーザーアカウントの定義に使用される形式を反映していますが、いくつかの重要な違いがあります。
役割は次の形式に従います:
'<role>'@'<host>'
ユーザーと同様に、ロールには2つのコンポーネントがあります。ロール名とクライアントの接続元のホストです。ただし、MySQLがこれらのコンポーネントを解釈する方法は異なります。
ロールの場合、'<role>'
名前の一部を空白にすることはできません。ユーザーの場合のように、役割が「匿名」であるという概念はありません。一方、'<host>'
を省略します 部分は 引き続き許可され、MySQLは%
を使用します ホストとして。ただし、%
このコンテキストでは、ワイルドカードではなく、リテラル文字として解釈されます。
事実上、これは、役割名は表面的にはユーザーアカウント名の形式を共有しますが、ユーザーアカウントのように評価を受けることはなく、2つのコンポーネントを持つ単なるラベルであることを意味します。彼らがする理由 名前には2つの部分があり、ユーザーとロールの両方として機能できるユーザーアカウントを作成できます。ユーザーとして使用する場合、コンポーネントはユーザー管理の記事で説明されている特別な評価ルールの対象となり、ロールとして使用する場合、名前は文字通りのコンポーネント名を使用して直接照合されます。
これらのルールのため、多くの場合、管理者は'<role>'
のみを使用してロールを定義することを選択します 成分。これにより、MySQLはリテラルの%
に置き換えられます '<host>'
の文字 コンポーネント、名前のその部分を効果的に見えなくし、取るに足らないものにします。名前をユーザーアカウントとロールの両方として使用する予定がない場合は、同じことができます。
どのように役割を作成しますか?
新しい役割を作成するには、CREATE ROLE
を使用します コマンド。
基本的な構文は次のようになります:
CREATE ROLE '<role>'@'<host>';
各ロール名をコンマで区切って、同時に複数のロールを作成することもできます:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
指定した役割のいずれかがシステムにすでに存在する場合、コマンドはエラーで失敗します。
これを回避し、MySQLが警告のみを発行するようにするには、IF NOT EXISTS
を含めることができます。 CREATE ROLE
の後の句 ロール名の前のコマンド:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';
上記のように、多くの場合、管理者は'<host>'
を省略します 簡単にするためにロール名の一部。暗黙的にリテラル%
に設定します。 キャラクター。したがって、実際には、ロール作成コマンドの多くは次のようになります。
CREATE ROLE '<role>';
ロールに特権を付与するにはどうすればよいですか?
新しい役割を作成した後の次の優先事項は、通常、特権を付与して意味のあるものにすることです。
ユーザーアカウントに特権を付与するのと同じ方法で、ロールに特権を付与します。付与する正確な権限を指定し、権限が有効なデータベースとデータベースオブジェクト、および権限を付与する必要のあるエンティティ(この場合はロール)を指定してスコープを指定します。
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';
たとえば、SELECT
を付与するには readapp
と呼ばれる役割への特権 appdb
で データベースとそれに含まれるすべてのオブジェクトには、次のように入力できます。
GRANT SELECT ON appdb.* TO 'readapp';
同様に、同じデータベースへの書き込み権限をwriteapp
という役割に付与できます。 次のように入力します:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';
ユーザーアカウントで直接行う場合とまったく同じように、ロールに特権を付与したり、ロールからそれらを取り消すことができます。したがって、提供するアクセスのレベルを調整する必要がある場合は、ロールに関連付けられている特権をいつでも変更できます。
ユーザーにロールのメンバーシップを付与するにはどうすればよいですか?
ロールに特権を追加したら、メンバーをロールに追加して、関連付けられた特権を付与することができます。
これを行うために、MySQLは同じGRANT
の異なる形式を使用します ユーザーとロールに特権を付与するために使用します。ただし、この新しいフォームはユーザーに役割を追加し、ユーザーアカウントが役割に与えられたすべての特権にアクセスできるようにします。
基本的な構文は次のようになります:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';
たとえば、'reports'@'localhost'
の場合 ユーザーはappdb
からデータを読み取れる必要があります レポートを生成するデータベースの場合、readapp
を追加できます ユーザーアカウントに役割を割り当て、選択した権限を付与します:
GRANT 'readapp' TO 'reports'@'localhost';
同様に、'appuser'@'localhost'
を指定します 同じデータベース内のデータを管理する機能により、そのユーザーをwriteapp
のメンバーにすることができます 役割:
GRANT 'writeapp' TO 'appuser'@'localhost';
'appuser'@'localhost'
アカウントは、データベースにデータを挿入、更新、および削除できるようになります。 writeapp
に新しい権限が追加された場合 ロール、'appuser'@'localhost'
アカウントはすぐにそれらの特権を取得します。
すべてのユーザーに特定の役割を自動的に付与するにはどうすればよいですか?
システム上のすべてのユーザーにアクセスを許可したい役割がある場合があります。 mandatory_roles
を設定することで、各アカウントに自動的に付与される役割を定義できます。 変数。
mandatory_roles
を変更するには 変数の場合、ユーザーはROLE_ADMIN
を持っている必要があります およびSYSTEM_VARIABLES_ADMIN
特権。次のように入力して、すべてのユーザーに付与する役割を設定できます。
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';
ここでは、システム上の各ユーザーに3つの役割を自動的に与えます。システム変数を設定する場合、mandatory_roles
の値 文字列である必要があるため、役割リスト全体を一重引用符で囲み、バッククォートを使用して個々の役割コンポーネントを引用します。
mandatory_roles
に役割を追加することはできません SYSTEM_USER
を持つリスト 特権。これは、システム上のすべてのセッションが自動的にシステムセッションになるわけではないことを保証するためのセキュリティ対策です。
ロールからの特権をどのように使用しますか?
ユーザーアカウントにロールのメンバーシップを付与したら、それらをどのように使用しますか?ロールによってアカウントに付与された特権にアクセスするには、アカウントをアクティブ化する必要があります。
現在アクティブな役割の表示
新しい役割をアクティブ化する前に、ユーザーセッションで現在アクティブになっている役割を確認できます。
セッションのアクティブな役割を表示するには、次のように入力します。
SELECT CURRENT_ROLE()
出力には、現在のセッションでアクティブな0個以上の役割が表示されます。これらの役割に関連付けられた特権により、実行が許可されるアクションが追加されます。
セッションの役割をアクティブ化する方法
セッション中にアクティブな役割を変更するには、SET ROLE
を使用します 指図。このコマンドはさまざまな方法で使用できます。
基本的な構文は次のようになります:
SET ROLE '<rolename>'@'<host>';
これにより、問題の役割がアクティブになります。 SET ROLE
に記載されていない以前にアクティブだった役割に注意することが重要です。 コマンドが無効になります。
一度に複数の役割をアクティブ化するには、各役割をコンマで区切ります。
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
アカウントに付与されているすべての役割をアクティブ化するには、ALL
を指定できます 特定の役割の代わりに:
SET ROLE ALL;
ALL EXCEPT
を使用して、特定の例外を除いてすべての役割をアクティブ化するようにMySQLに指示することもできます。 :
SET ROLL ALL EXCEPT '<role_1>'@'<host>';
もう1つのオプションは、NONE
を指定して、アカウントのすべての役割を無効にすることです。 :
SET ROLE NONE
これにより、セッションのすべてのユーザーロールが非アクティブ化され、ユーザーアカウントに特別に割り当てられた権限のみが付与されます。
アカウントに定義されている役割のデフォルトリストに戻すには、DEFAULT
を使用します キーワード:
SET ROLE DEFAULT
ユーザーアカウントのデフォルトの役割を定義する方法
ユーザーとしてログインすると自動的にアクティブ化されるロールと、SET ROLE DEFAULT
を使用すると再アクティブ化されるロール 構成可能です。
デフォルトでアクティブ化されるロールを定義するには、SET DEFAULT ROLE
を使用します SET ROLE
の使用方法と同様のコマンド コマンド:
SET DEFAULT ROLE '<role_1>'@'<host>';
これにより、ログイン時またはSET ROLE DEFAULT
の使用時に自分のアカウントに対してアクティブ化されるデフォルトの役割が設定されます 。
ユーザーがCREATE USER
を持っている場合 特権、他のアカウントのデフォルトの役割を設定できます:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';
ここでは、'<user>'@'<host>'
を指定します アカウントは、認証時にすべての役割を自動的にアクティブ化する必要があります。
この構文を使用して、各ユーザーをコンマで区切ることにより、複数のアカウントのデフォルトの役割を定義することもできます。
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';
デフォルトですべてのユーザーのすべての役割をアクティブ化
MySQLサーバー上のすべてのアカウントでデフォルトですべての役割をアクティブ化する場合は、システム設定を変更してアクティブ化できます。
activate_all_roles_on_login
の場合 変数がtrueに設定されている場合、MySQLはログイン時にアカウントに関連付けられているすべてのロールを自動的にアクティブ化します。これは、SET DEFAULT ROLE
で指定された設定に優先します。 。
この機能を有効にするには、SYSTEM_VARIABLES_ADMIN
が必要です。 およびROLE_ADMIN
特権。次のように入力して機能を有効にします:
SET PERSIST activate_all_roles_on_login = ON;
これにより、ユーザーアカウントはログイン時にすべての役割を自動的にアクティブ化します。ただし、SET ROLE DEFAULT
アカウントに関連付けられているデフォルトの役割のみをアクティブ化できます。
役割から取得した既存の特権を表示する
アカウントで利用できる特権を理解するには、SHOW GRANTS
を使用できます。 コマンド。
ユーザーに対して有効になっている付与を確認するには、次のように入力します。
SHOW GRANTS FOR '<user>'@'<host>';
出力には、ユーザーアカウントに直接割り当てられているすべての権限と、ユーザーがメンバーになっているすべての役割が表示されます。
アカウントがメンバーになっている役割を学習したら、次のように入力して、役割がユーザーに提供する特権を確認できます。
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';
たとえば、'reports'@'localhost'
の権限を確認するには readapp
のメンバーシップによって付与されたユーザーを含むユーザー 役割、使用できます:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';
これにより、'reports'@'localhost'
に明示的に付与されたすべての権限が表示されます ユーザーアカウントとreadapp
によって追加されたアカウント 役割。
ユーザーからの役割の取り消し
では、ユーザーから役割を削除したい場合はどうなりますか? GRANT
と同様です コマンドは、ユーザーまたはロールに新しい特権を追加するか、ユーザーにロールを追加することができます。REVOKE
コマンドは、ユーザーまたはロールから特権を削除したり、ユーザーからロールメンバーシップを削除したりできます。
ユーザーアカウントから役割を削除するために使用される基本的な構文は、次のようになります。
REVOKE '<role>' FROM '<user>'@'<host>';
このようなステートメントを実行すると、ユーザーはロールを通じて付与された特権にアクセスできなくなります。
例として、writeapp
を取り消すことができます 'appuser'@'localhost'
からの役割 次のように入力してユーザーアカウント:
REVOKE 'writeapp' FROM 'appuser'@'localhost';
ただし、ユーザーが他の方法で特権を付与されている場合(直接付与されているか、別の役割のメンバーシップを通じて付与されている場合)、ユーザーは引き続きその特権にアクセスできます。したがって、'appuser'@'localhost'
ユーザーはreadapp
のメンバーでもありました 以前に付与した役割は、引き続きSELECT
appdb
の権限 データベース。
結論
役割を使用してMySQLデータベースの特権を分散すると、アクセス制御システムの管理オーバーヘッドと複雑さを単純化するのに役立ちます。多くの異なる特権を直接付与するよりも、同じ責任を持つユーザーが役割を使用して同じ特権を持つようにする方がはるかに簡単です。
同様に、役割を使用すると、特権付与の背後にある意図について明示的にすることができます。コメントなしでアカウントに多数の特権を付与するのではなく、慎重に選択された役割名は、アクセスのさまざまな理由を区別するのに役立ちます。時間をかけて事前に役割を作成して整理することで、データのさまざまな部分へのユーザーアクセスを管理する機能が、長期的にはより簡単になります。