ユーザー権限
MySQL の権限管理メカニズムに基づき、StarRocks の権限管理システムは、テーブルレベルでのきめ細かい権限制御、ロールベースのアクセス制御、およびホワイトリストをサポートしています。
用語
- ユーザーアイデンティティ
権限システムでは、ユーザーはユーザーアイデンティティとして識別されます。ユーザーアイデンティティは、ユーザー名とユーザーホストの2つの部分で構成されます。user_identity
は username@'userhost'
として表されます。ユーザー名は英字で構成されます。ユーザーホストは、ユーザーがリンクしている IP です。
user_identity
は username@['domain']
としても表されることがあります。ここで domain
は DNS によって IP のセットに解決できるドメイン名です。最終的な表現は username@'userhost' のセットであり、この章全体を通じて username@'userhost' で表現します。
- 権限
ユーザーはノード、データベース、またはテーブルに対して権限を設定できます。異なる権限は、異なる操作権限を表します。
- ロール
StarRocks では、カスタマイズされた名前でロールを作成できます。ロールは権限のコレクションです。新しく作成されたユーザーには、対応する権限を持つロールを与えることができます。その後の権限の変更は、そのロールを付与されたすべてのユーザーに適用されます。
- ユーザー属性
ユーザー属性は、ユーザーアイデンティティではなく、ユーザーに直接付与されます。つまり、abc@'192.%'
と abc@['domain']
の両方が、ユーザー abc
に属する同じセットのユーザー属性を持ちます。ユーザー属性には、最大ユーザー接続数、インポートクラスター構成などが含まれますが、これに限定されません。
サポートされている操作
- ユーザーの作成: CREATE USER
- ユーザーの削除: DROP USER
- 認可: GRANT
- 権限の取り消し: REVOKE
- ロールの作成: CREATE ROLE
- ロールの削除: DROP ROLE
- 現在のユーザー権限の表示: SHOW GRANTS
- すべてのユーザー権限の表示: SHOW ALL GRANTS
- 作成されたロールの表示: SHOW ROLES
- ユーザー属性の表示: SHOW PROPERTY
権限の種類
StarRocks は現在、以下の種類の権限をサポートしています。
-
NODE_PRIV
ノード変更のための権限。これにより、FE、BE、BROKER ノードを追加、削除、無効化できます。現在、この権限は Root ユーザーにのみ付与できます。
-
GRANT_PRIV
権限変更のための権限。これにより、ユーザー/ロールを付与、取り消し、変更できます。
-
SELECT_PRIV
データベースとテーブルへの読み取り専用アクセス。
-
LOAD_PRIV
データベースとテーブルへの書き込みアクセス。これにより、データベースまたはテーブルをロード、挿入、削除できます。
-
ALTER_PRIV
データベースとテーブルを変更するための権限。これにより、名前の変更、列の追加/削除/変更、パーティションの追加/削除が可能です。
-
CREATE_PRIV
データベース、テーブル、およびビューを作成するための権限。
-
DROP_PRIV
データベース、テーブル、およびビューを削除するための権限。
-
USAGE_PRIV
リソースを使用するための権限。
権限の階層
StarRocks は、データベースおよびテーブルの権限を3つのレベルに分類します。
- GLOBAL LEVEL: グローバル権限。この権限は、GRANT ステートメントによって
.
に付与されます。付与された権限は、任意のデータベースの任意のテーブルに適用されます。 - DATABASE LEVEL: データベースレベルの権限。この権限は、
GRANT
ステートメントによってdb.*
に付与されます。付与された権限は、特定のデータベース内の任意のテーブルに適用されます。 - TABLE LEVEL: テーブルレベルの権限。この権限は、
GRANT
ステートメントによってdb.tbl
に付与されます。付与された権限は、特定のデータベース内の特定のテーブルに適用されます。
StarRocks は、リソースの権限を2つのレベルに分類します。
- GLOBAL LEVEL: グローバル権限。この権限は、
GRANT
ステートメントによって*
に付与されます。付与された権限は、すべてのリソースに適用されます。 - RESOURCE LEVEL: リソースレベルの権限。この権限は、
GRANT
ステートメントによってresource_name
に付与されます。付与された権限は、特定のリソースに適用されます。
権限の説明
ADMIN_PRIV
と GRANT_PRIV
の権限は特別で、どちらも権限を付与する権限を持っています。
-
CREATE USER
-
ADMIN 権限または任意のレベルでの GRANT 権限を持つユーザーは、新しいユーザーを作成できます。
-
DROP USER
-
ADMIN 権限を持つユーザーは、ユーザーを削除できます。
-
CREATE/DROP ROLE
-
ADMIN 権限を持つユーザーは、ロールを作成できます。
-
GRANT/REVOKE
-
ADMIN 権限または GLOBAL レベルの GRANT 権限を持つユーザーは、任意のユーザーに権限を付与または取り消すことができます。
-
DATABASE レベルの GRANT 権限を持つユーザーは、特定のデータベース内の任意のテーブルに対して任意のユーザーに権限を付与または取り消すことができます。
-
TABLE レベルの GRANT 権限を持つユーザーは、特定のデータベース内の特定のテーブルに対して任意のユーザーに権限を付与または取り消すことができます。
-
SET PASSWORD
-
ADMIN 権限または GLOBAL レベルの GRANT 権限を持つユーザーは、ユーザーのパスワードを設定できます。
-
通常のユーザーは、自分のユーザーアイデンティティのパスワードを設定できます。
SELECT CURRENT_USER();
コマンドを使用してユーザーアイデンティティを表示します。 -
TABLE または DATABASE レベルの GRANT 権限を持つユーザーは、既存のユーザーのパスワードを設定することはできませんが、新しいユーザーのパスワードを設定することはできます。
その他の注意事項
-
StarRocks が初期化されると、次のユーザーとロールが自動的に作成されます。
-
operator ロール: このロールは
NODE_PRIV
とADMIN_PRIV
を持ち、すなわちすべての権限を持ちます。後のアップグレードでは、このロールはNODE_PRIV
(ノード変更のための権限)に制限される可能性があります。これは、クラウド上での特定のデプロイ要件を満たすためです。 -
admin ロール: このロールは
ADMIN_PRIV
を持ち、すなわちノード変更のための権限を除くすべての権限を持ちます。 -
root@'%': ルートユーザーで、任意のノードから
operator
としてログインできます。 -
admin@'%': 管理者ユーザーで、任意のノードから
admin
としてログインできます。 -
ロールまたはユーザーに設定されたデフォルトの権限を削除または変更することはサポートされていません。
-
operator ロールは1人のユーザーにのみ付与できます。admin ロールは複数のユーザーに付与できます。
-
潜在的に競合する操作の説明:
-
ドメイン名と IP の競合
次のユーザーが作成されたとします。
CREATE USER abc@['domain'];
そして権限が付与されました:
GRANT SELECT_PRIV ON
*. *
TO abc@['domain']
ドメインは2つの IP に解決されます: ip1 と ip2。次に abc@'ip1' に個別に権限を付与したとします:
GRANT ALTER_PRIV ON
*. *
TO abc@'ip1';
すると、abc@'ip1' の権限は SELECT_PRIV
, ALTER_PRIV
に変更されます。今後、abc@['domain'] に対する権限の変更は abc@'ip1' には適用されません。
- 重複する IP の競合
次のユーザーが作成されたとします。
CREATE USER abc@'%' IDENTIFIED BY "12345";
CREATE USER abc@'192.%' IDENTIFIED BY "abcde";
'192.%' は '%' よりも優先されます。ユーザーが 192.168.1.1 から '12345' のパスワードで StarRocks にログインしようとすると、リクエストは拒否されます。
-
パスワードを忘れた場合
パスワードを忘れた場合は、次のコマンドを使用して StarRocks にログインできます。
mysql-client -h 127.0.0.1 -P query_port -uroot
ログイン後、SET PASSWORD
コマンドでパスワードをリセットできます。 -
ルートユーザーのみが自分のパスワードをリセットでき、他のユーザーはルートユーザーのパスワードをリセットできません。
-
ADMIN_PRIV 権限は、GLOBAL レベルでのみ付与または取り消すことができます。
-
GLOBAL レベルでの
GRANT_PRIV
はADMIN_PRIV
に似ています。GLOBAL レベルでのGRANT_PRIV
は任意の権限を付与する権限を持っているため、注意して使用してください。 -
current_user() と user()
ユーザーは SELECT current_user();
と SELECT user();
を使用して、それぞれ current_user
と user
を確認できます。current_user
は認証システムの下での現在のユーザーのアイデンティティを示し、user
はユーザーの実際の user_identity
です。
たとえば、user1@'192.%' が作成され、その後 user1 が 192.168.10.1 からシステムにログインしたとします。この場合、current_user
は user1@'192.%' であり、user
は user1@'192.168.10.1' です。
すべての権限は current_user
に付与され、実際のユーザーは対応する current_user
のすべての権限を持っています。
ベストプラクティス
ここでは、StarRocks の権限管理システムを使用するシナリオをいくつか紹介します。
シナリオ 1: 権限の割り当て
StarRocks のユーザーは、管理者 (Admin)、開発エンジニア (RD)、およびユーザー (Client) に分けられます。管理者はすべての権限を持ち、主にクラスターの構築やノード管理を担当します。開発エンジニアは、ビジネスモデリングを担当し、データベースやテーブルの構築、データのインポートや変更などを行います。ユーザーはデータベースやテーブルにアクセスしてデータを取得します。
このシナリオでは、管理者には ADMIN 権限または GRANT 権限が付与されます。RD には、任意または特定のデータベーステーブルに対して CREATE、DROP、ALTER、LOAD、および SELECT の権限が付与されます。クライアントには、任意または特定のデータベーステーブルに対して SELECT の権限が付与されます。複数のユーザーがいる場合は、異なるロールを作成して認可を簡素化することも可能です。
シナリオ 2: 複数のビジネスライン
クラスター内には複数のユースケースが存在し、それぞれが1つ以上のデータベースを使用する場合があります。各ユースケースは自分のユーザーを管理する必要があります。このシナリオでは、ADMIN は各データベースに対して DATABASE レベルの GRANT 権限を持つユーザーを1人付与できます。このユーザーは、この特定のデータベースに対してのみユーザーを認可できます。
シナリオ 3: ブラックリスト
StarRocks はブラックリストをサポートしていません(ホワイトリストのみがサポートされています)が、ある方法でブラックリストを模倣することができます。たとえば、user@'192.%' というユーザーが最初に作成されたとします。これは、ユーザーが 192.* からログインできることを示しています。この時点で、ユーザーが 192.168.10.1 からのログインを防ぎたい場合は、別のユーザー abc@'192.168.10.1' を作成し、新しいパスワードを設定します。192.168.10.1 は 192.% よりも優先されるため、ユーザーは古いパスワードで 192.168.10.1 からログインできなくなります。
トラブルシューティング
ルートユーザーのパスワードリセット
ユーザー root
のパスワードを忘れた場合は、次の手順でリセットできます。
-
認証を無効にするために、すべての FE ノードの設定ファイル fe/conf/fe.conf に次の設定項目を追加します。
enable_auth_check = false
-
すべての FE ノードを再起動します。
./fe/bin/stop_fe.sh
./fe/bin/start_fe.sh -
MySQL クライアントを起動し、パスワードなしでユーザー
root
として StarRocks に接続します。mysql -h <fe_ip> -P<fe_query_port> -uroot
-
ユーザー
root
のパスワードをリセットします。SET PASSWORD for root = PASSWORD('xxxxxx');
-
すべての FE ノードの設定ファイル fe/conf/fe.conf で設定項目
enable_auth_check
をtrue
に設定して認証を再有効化します。enable_auth_check = true
-
すべての FE ノードを再起動します。
./fe/bin/stop_fe.sh
./fe/bin/start_fe.sh -
MySQL クライアントを起動し、新しいパスワードを使用してユーザー
root
として StarRocks に接続し、パスワードが正常にリセットされたかどうかを確認します。mysql -h <fe_ip> -P<fe_query_port> -uroot -p<xxxxxx>