ApsaraDB for SelectDB は、MySQL の権限管理メカニズムを参照して、テーブルレベルでのきめ細かい権限制御を実装し、ロールとホワイトリストに基づく権限制御をサポートしています。 このトピックでは、SelectDB の権限管理システムの使用方法について説明します。また、権限管理システムの構文の詳細と使用上の注意についても説明します。
権限で許可される操作
ユーザーを作成した後、特権アカウントを使用して、クラスター、データベース、およびテーブルにアクセスするための権限をユーザーに付与する必要があります。
クラスターにアクセスするための権限をユーザーに付与する方法の詳細については、「ユーザーにクラスターへのアクセス権限を付与する」をご参照ください。
データベースとテーブルにアクセスするための権限をユーザーに付与する方法の詳細については、次の表をご参照ください。
操作 | 操作キーワード | 構文 |
ユーザーの作成 | CREATE USER | |
ユーザーの削除 | DROP USER | |
ユーザーへの権限の付与 | GRANT | |
ユーザーからの権限の取り消し | REVOKE | |
ロールの作成 | CREATE ROLE | |
ロールの削除 | DROP ROLE | |
1 人またはすべてのユーザーに付与された権限のクエリ | SHOW (ALL) GRANTS | |
作成されたロールのクエリ | SHOW ROLES | |
ユーザープロパティのクエリ | SHOW PROPERTY | |
ユーザープロパティの構成 | SET PROPERTY | |
パラメーターの説明
パラメーター | 説明 |
[password_policy] | パスワードベースのログイン認証に関連するポリシー。次のパスワードポリシーがサポートされています。
|
操作例
例 1:
test_userという名前のユーザーを作成します。ユーザーのパスワードは 123456 で、ユーザーは CIDR ブロック 172.10.0.0/16 からログインリクエストを送信できます。CREATE USER test_user@'172.10.%' IDENTIFIED BY '123456';例 2: ユーザー ID が
test_user@'172.10.%'であるユーザーを削除します。DROP USER 'test_user'@'172.10.%';例 3: ユーザー ID が
test_user@'172.10.%'であるユーザーに、test_db.test_tableテーブルに対する読み取り、変更、およびインポート権限を付与します。GRANT SELECT_PRIV,ALTER_PRIV,LOAD_PRIV ON test_db.test_table TO 'test_user'@'172.10.%';例 4: test_db データベースに対する読み取り権限を、
test_userという名前のユーザーから取り消します。REVOKE SELECT_PRIV ON test_db.* FROM 'test_user'@'172.10.%';例 5:
test_roleという名前のロールを作成します。CREATE ROLE test_role;例 6:
test_roleという名前のロールを削除します。DROP ROLE test_role;例 7:
test_roleという名前のロールに、test_dbデータベース内のすべてのテーブルに対するインポート権限を付与します。GRANT LOAD_PRIV ON test_db.* TO ROLE 'test_role';例 8: ユーザー ID が
test_user@'172.10.%'であるユーザーに割り当てられたロールをtest_roletest_roleGRANT "test_role" TO test_user@'172.10.%';例 9: ユーザー ID が
test_user@'%'であるユーザーの権限をクエリします。SHOW GRANTS FOR test_user@'%';例 10:
test_userという名前のユーザーのプロパティをクエリします。# ユーザーのすべてのプロパティをクエリします。 SHOW PROPERTY FOR 'test_user'; # LIKE 式を使用して、ユーザーの特定のプロパティをクエリします。 SHOW PROPERTY FOR 'test_user' LIKE '%max_user_connections%';例 11:
test_userという名前のユーザーのプロパティを構成します。SET PROPERTY FOR 'test_user' 'max_user_connections' = '1000';
ベストプラクティス
権限管理システムは、一般的に次のシナリオで使用されます。
シナリオ 1
クラスターのユーザーは、管理者、R&D エンジニア、および一般ユーザーに分類されます。管理者はクラスターに対するすべての権限を持ち、クラスターの構築やノードの管理など、クラスター管理を担当します。R&D エンジニアは、データベースとテーブルの作成、データのインポートと変更など、サービスモデリングを担当します。一般ユーザーは、さまざまなデータベースとテーブルのデータにアクセスします。
このシナリオでは、管理者に ADMIN_PRIV または GRANT_PRIV 権限を付与できます。R&D エンジニアには、1 つ以上のデータベースとテーブルに対する CREATE、DROP、ALTER、LOAD、および SELECT 権限を付与できます。一般ユーザーには、1 つ以上のデータベースとテーブルに対する SELECT 権限を付与できます。また、さまざまなロールを作成して、複数のユーザーに簡単に権限を付与することもできます。
シナリオ 2
クラスターはさまざまなサービスを提供します。各サービスは、1 つ以上のデータレコードを使用する場合があります。各サービスのユーザーの権限を管理する必要があります。このシナリオでは、管理者は各データベースのデータベースレベルで GRANT_PRIV 権限を持つユーザーを作成できます。このユーザーは、指定されたデータベースに対する権限のみをユーザーに付与できます。
シナリオ 3
SelectDB はブラックリストをサポートしておらず、ホワイトリストのみをサポートしています。ただし、特定の方法を使用してブラックリストをシミュレートできます。たとえば、ユーザー ID が
test_user1@'192.%'であるユーザーを作成します。ユーザーは、192.*の IP アドレスからログインリクエストを送信できます。この場合、CIDR ブロック192.168.0.0/16からのログインリクエストを拒否する場合、ユーザー ID がtest_user2@'192.168.%'である別のユーザーを作成し、ユーザーの新しいパスワードを構成できます。192.168.%の優先度は192.%よりも高くなります。したがって、ユーザーは元のパスワードを使用して CIDR ブロック192.168.0.0/16から SelectDB インスタンスにログインできなくなります。
権限の使用上の注意
SelectDB インスタンスが初期化されると、次のロールとユーザーが自動的に作成されます。
operator: このロールは、SelectDB に対する NODE_PRIV および ADMIN_PRIV 権限を持ち、任意のノードから SelectDB インスタンスにログインできます。このロールは、ユーザー ID が root@'%' である組み込みインスタンスユーザーにのみ割り当てられます。
admin: このロールは管理ロールであり、ADMIN_PRIV 権限を持ちます。このロールは、ノードの変更権限を除くすべての権限を持ち、ノードから SelectDB インスタンスにログインできます。SelectDB インスタンスが初期化されると、システムはユーザー ID が admin@'%' であるユーザーを自動的に作成し、admin ロールをユーザーに割り当てます。複数のユーザーを作成し、admin ロールをユーザーに割り当てることができます。
自動的に作成されたロールまたはユーザーの権限を取り消したり変更したりすることはできません。
admin ロールが割り当てられているユーザーのパスワードを忘れて SelectDB インスタンスにログインできない場合は、SelectDB コンソールでユーザーのパスワードをリセットできます。詳細については、「インスタンスの管理者ユーザーのパスワードをリセットする」をご参照ください。
ADMIN_PRIV 権限は、グローバルレベルでのみ付与または取り消すことができます。
グローバルレベルの GRANT_PRIV 権限は、すべての権限を付与する権限を持っているため、ADMIN_PRIV 権限と同等です。グローバルレベルで GRANT_PRIV 権限を使用する場合は注意してください。
SELECT current_user();文を実行してcurrent_userをクエリし、SELECT user();ステートメント 文を実行してuserをクエリできます。current_usercurrent_user は、現在のユーザーが身元認証に使用するユーザー ID を示し、user はユーザーの実際のユーザー ID を示します。ユーザーは、ユーザーの実際のユーザー ID を示します。すべての権限は、現在のユーザーが身元認証を通過するために使用するユーザー ID に付与され、ユーザーはそのユーザー ID の権限を持ちます。たとえば、ユーザー ID が
user1@'192.%'であるユーザーと、user1という名前のユーザーがCIDR ブロック 192.168.0.0/16現在のユーザーから SelectDB インスタンスにログインしたとします。この場合、現在のユーザーが使用するユーザー ID はuser1@'192.%'であり、ユーザーの実際のユーザー ID はuser1@'192.168.%'です。user1@'192.168.%'。
権限の構文の詳細
権限の種類
権限 | 説明 |
GRANT_PRIV | 権限を変更するための権限。 これらの権限により、ユーザーとロールへの権限の付与と取り消し、ユーザーとロールの作成、削除、および変更を行うことができます。 |
SELECT_PRIV | データベースとテーブルに対する読み取り専用権限。 |
LOAD_PRIV | データベースとテーブルに対する書き込み権限。LOAD、INSERT、および DELETE 権限を含みます。 |
ALTER_PRIV | データベースとテーブルに対する変更権限。データベースとテーブルの名前変更権限、列の作成、削除、および変更権限、パーティションの作成と削除権限を含みます。 |
CREATE_PRIV | データベース、テーブル、およびビューを作成するための権限。 |
DROP_PRIV | データベース、テーブル、およびビューを削除するための権限。 |
USAGE_PRIV | リソースを使用するための権限。 |
権限レベル
権限レベルは、データとリソースに適用されます。
データは、グローバル、カタログ、データベース、テーブルのレベルに分類されます。次の表に、権限レベルを示します。
権限レベル | 説明 |
GLOBAL LEVEL グローバル権限 | GRANT 文を使用して付与された |
CATALOG LEVEL カタログレベルの権限 | GRANT 文を使用して付与された |
DATABASE LEVEL データベースレベルの権限 | GRANT 文を使用して付与された |
TABLE LEVEL テーブルレベルの権限 | GRANT 文を使用して付与された |
ADMIN_PRIV および GRANT_PRIV 権限
ADMIN_PRIV 権限と GRANT_PRIV 権限の両方で、権限を付与できます。このセクションでは、ADMIN_PRIV および GRANT_PRIV 権限の使用上の注意について説明します。
CREATE USER
ADMIN_PRIV 権限、またはグローバルレベルとデータベースレベルの GRANT_PRIV 権限を持つユーザーは、ユーザーを作成できます。
DROP USER
ADMIN_PRIV 権限、またはグローバルレベルの GRANT_PRIV 権限を持つユーザーは、ユーザーを削除できます。
CREATE/DROP ROLE
ADMIN_PRIV 権限、またはグローバルレベルの GRANT_PRIV 権限を持つユーザーは、ロールを作成できます。
GRANT/REVOKE
ADMIN_PRIV 権限、またはグローバルレベルの GRANT_PRIV 権限を持つユーザーは、ユーザーに権限を付与したり、ユーザーから権限を取り消したりできます。
カタログレベルの GRANT_PRIV 権限を持つユーザーは、指定されたカタログに対する権限をユーザーに付与したり、ユーザーから権限を取り消したりできます。
データベースレベルの GRANT_PRIV 権限を持つユーザーは、指定されたデータベースに対する権限をユーザーに付与したり、ユーザーから権限を取り消したりできます。
テーブルレベルの GRANT_PRIV 権限を持つユーザーは、指定されたデータベース内の指定されたテーブルに対する権限をユーザーに付与したり、ユーザーから権限を取り消したりできます。
SET PASSWORD
ADMIN_PRIV 権限、またはグローバルレベルの GRANT_PRIV 権限を持つユーザーは、すべてのユーザーのパスワードを設定できます。
一般ユーザーは、自分のユーザー ID に対応するパスワードを設定できます。
SELECT CURRENT_USER();文を実行して、ユーザー ID をクエリできます。グローバルレベルではない GRANT_PRIV 権限を持つユーザーは、既存のユーザーのパスワードを設定できません。このようなユーザーは、ユーザーを作成するときにのみパスワードを設定できます。
ユーザープロパティ
次の表に、ユーザーに関連するプロパティを示します。
プロパティ | 説明 |
cpu_resource_limit | クエリに使用できる CPU リソースの最大量。詳細については、 |
default_load_cluster | データをインポートするデフォルトのクラスター。 |
exec_mem_limit | クエリに使用できるメモリの最大サイズ。詳細については、 |
insert_timeout | INSERT 操作のタイムアウト期間。 |
max_query_instances | ユーザーがある時点でクエリに使用できるインスタンスの最大数。 |
max_user_connections | ユーザー接続の最大数。 |
query_timeout | ユーザーのクエリのタイムアウト期間。 |
resource_tags | リソースタグ。 |
sql_block_rules | SQL クエリをブロックするためのルール。ユーザーが指定されたルールに一致するクエリを送信すると、クエリは拒否されます。 |
query_timeout などのユーザープロパティが変数としても指定されている場合、システムは次の優先順位に基づいてユーザープロパティの値を取得します。セッション変数 > ユーザープロパティ > グローバル変数 > デフォルト値。ユーザープロパティにセッション変数が指定されていない場合、システムはユーザープロパティが直接指定されているかどうかを確認します。指定されていない場合、システムはユーザープロパティにグローバル変数が指定されているかどうかを確認します。指定されていない場合、システムはユーザープロパティのデフォルト値を使用します。
FAQ
Q: ユーザーを作成し、ユーザーに権限を付与するときに、ドメイン名が IP アドレスと競合する場合、または IP アドレスの競合が発生する場合はどうすればよいですか?
DROP USER 文を実行してユーザーを削除し、別のユーザーを作成します。
ドメイン名が IP アドレスと競合するシナリオ:
ユーザーを削除した後、新しいユーザーを作成し、ユーザーに権限を付与します。サンプルコード:
CREATE USER test_user@['domain']; GRANT SELECT_PRIV ON *.* TO test_user@['domain'];たとえば、ドメイン名は DNS によって 2 つの IP アドレス (IP1 と IP2) に解決されます。
ユーザー ID が
test_user@'IP1'であるユーザーに権限を付与します。サンプルコード:GRANT ALTER_PRIV ON *.* TO test_user@'IP1';ユーザー ID が
test_user@'IP1'であるユーザーの権限は、SELECT_PRIV から ALTER_PRIV に変更されます。ユーザーは IP1 からログインリクエストを送信できます。ユーザー ID がtest_user@['domain']であるユーザーの権限を変更しても、ユーザー ID がtest_user@'IP1'であるユーザーの権限は変更されません。
IP アドレスの競合が発生するシナリオ:
新しいユーザーを作成します。サンプルコード:
CREATE USER test_user@'%' IDENTIFIED BY "12345"; CREATE USER test_user@'192.%' IDENTIFIED BY "abcde";'192.%' の優先度は '%' よりも高くなります。test_user という名前のユーザーがパスワード '12345' を使用して、CIDR ブロックが
192.168.0.0/16であるマシンから SelectDB インスタンスにログインしようとすると、ログインリクエストは拒否されます。