すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for SelectDB:基本権限の管理

最終更新日:Apr 01, 2025

ApsaraDB for SelectDB は、MySQL の権限管理メカニズムを参照して、テーブルレベルでのきめ細かい権限制御を実装し、ロールとホワイトリストに基づく権限制御をサポートしています。 このトピックでは、SelectDB の権限管理システムの使用方法について説明します。また、権限管理システムの構文の詳細と使用上の注意についても説明します。

用語

用語

パラメーター

説明

ユーザー ID

user_identity

権限管理システムでは、ユーザーはユーザー ID によって識別されます。ユーザー ID は、ユーザー名とユーザーホストの 2 つの部分で構成されます。username はユーザー名を示し、文字を含めることができます。userhost は、ユーザーのログインリクエストが送信される IP アドレスを示します。ユーザー ID は、次の 2 つの形式のいずれかで表示できます。

  • username@'userhost': username で指定された名前のユーザーが、userhost で指定された IP アドレスからログインリクエストを送信します。

  • username@['domain']: domain はドメイン名を示し、DNS を使用して IP アドレスのグループに逆引き解決できます。値は、username@'userhost' 形式のユーザー ID のグループです。

この例では、username@'userhost' 形式が使用されています。

権限

privilege

権限により、ノード、データカタログ、データベース、またはテーブルに対する操作を実行できます。操作によって必要な権限が異なります。

ロール

role

ロールは権限のグループと考えることができます。新しいユーザーにロールを割り当てることができます。その後、ユーザーにはロールの権限が自動的に付与されます。ロールの権限を変更すると、ロールが割り当てられているすべてのユーザーの権限も変更されます。

カスタムロールを作成できます。

ユーザープロパティ

user_property

ユーザープロパティは、ユーザー ID ではなく、ユーザーに直接アタッチされます。たとえば、cmy@'192.%' と cmy@['domain'] は同じユーザープロパティのグループを持っています。ユーザープロパティは、cmy@'192.%' や cmy@['domain'] ではなく、cmy という名前のユーザーに属します。ユーザープロパティには、ユーザー接続の最大数と、データインポート用のクラスターの構成が含まれます。

権限で許可される操作

重要

ユーザーを作成した後、特権アカウントを使用して、クラスター、データベース、およびテーブルにアクセスするための権限をユーザーに付与する必要があります。

  • クラスターにアクセスするための権限をユーザーに付与する方法の詳細については、「ユーザーにクラスターへのアクセス権限を付与する」をご参照ください。

  • データベースとテーブルにアクセスするための権限をユーザーに付与する方法の詳細については、次の表をご参照ください。

操作

操作キーワード

構文

ユーザーの作成

CREATE USER

CREATE USER [IF EXISTS] user_identity [IDENTIFIED BY 'password']
[DEFAULT ROLE 'role_name']
[password_policy]

ユーザーの削除

DROP USER

 DROP USER 'user_identity'
 
 `user_identity`:
     user@'host'
     user@['domain']

ユーザーへの権限の付与

GRANT

GRANT privilege_list ON priv_level TO user_identity [ROLE role_name]
 
GRANT privilege_list ON RESOURCE resource_name TO user_identity [ROLE role_name]

ユーザーからの権限の取り消し

REVOKE

REVOKE privilege_list ON db_name[.tbl_name] FROM user_identity [ROLE role_name]
 
REVOKE privilege_list ON RESOURCE resource_name FROM user_identity [ROLE role_name]

ロールの作成

CREATE ROLE

 CREATE ROLE rol_name;

ロールの削除

DROP ROLE

 DROP ROLE rol_name;

1 人またはすべてのユーザーに付与された権限のクエリ

SHOW (ALL) GRANTS

SHOW [ALL] GRANTS [FOR user_identity];

作成されたロールのクエリ

SHOW ROLES

SHOW ROLES

ユーザープロパティのクエリ

SHOW PROPERTY

SHOW PROPERTY [FOR user] [LIKE key]

ユーザープロパティの構成

SET PROPERTY

SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value']

パラメーターの説明

パラメーター

説明

[password_policy]

パスワードベースのログイン認証に関連するポリシー。次のパスワードポリシーがサポートされています。

  • PASSWORD_HISTORY: ユーザーがパスワードをリセットするときに、ユーザーが履歴パスワードを新しいパスワードとして使用できるかどうかを指定します。

    有効な値: [n|DEFAULT]。デフォルト値は 0 で、パスワード履歴が有効になっておらず、ユーザーは履歴パスワードを新しいパスワードとして使用できることを示します。たとえば、PASSWORD_HISTORY 10 は、以前の 10 個の履歴パスワードを新しいパスワードとして使用できないことを示します。

  • PASSWORD_EXPIRE: 現在のパスワードの有効期限。

    有効な値: [DEFAULT|NEVER|INTERVAL n DAY/HOUR/SECOND]。デフォルト値は NEVER で、パスワードが期限切れにならないことを示します。

  • FAILED_LOGIN_ATTEMPTS: アカウントがロックされるまでに許可されるログイン試行の失敗の最大回数。

    有効な値: [n|DEFAULT]。パラメーターのデフォルト値は、システムがログイン試行の失敗の最大回数を課さないことを示します。

  • PASSWORD_LOCK_TIME: アカウントがロックされる期間。

    有効な値: [n DAY/HOUR/SECOND|UNBOUNDED]。

操作例

  • 例 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_role

    GRANT "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 文を使用して付与された ctl.*.* の権限。付与された権限は、指定されたカタログ内のすべてのデータベースとテーブルに適用されます。

DATABASE LEVEL

データベースレベルの権限

GRANT 文を使用して付与された ctl.db.* の権限。付与された権限は、指定されたデータベース内のすべてのテーブルに適用されます。

TABLE LEVEL

テーブルレベルの権限

GRANT 文を使用して付与された ctl.db.tbl の権限。付与された権限は、指定されたデータベース内の指定されたテーブルに適用されます。

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 リソースの最大量。詳細については、cpu_resource_limit セッション変数をご参照ください。値 -1 は、クエリに使用できる CPU リソースに制限がないことを示します。

default_load_cluster

データをインポートするデフォルトのクラスター。

exec_mem_limit

クエリに使用できるメモリの最大サイズ。詳細については、exec_mem_limit セッション変数をご参照ください。値 -1 は、クエリに使用できるメモリサイズに制限がないことを示します。

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 アドレスと競合するシナリオ:

    1. ユーザーを削除した後、新しいユーザーを作成し、ユーザーに権限を付与します。サンプルコード:

      CREATE USER test_user@['domain'];
      GRANT SELECT_PRIV ON *.* TO test_user@['domain'];

      たとえば、ドメイン名は DNS によって 2 つの IP アドレス (IP1 と IP2) に解決されます。

    2. ユーザー 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 インスタンスにログインしようとすると、ログインリクエストは拒否されます。