メインコンテンツまでスキップ
バージョン: 3.14

ユーザーの認証と認可

注記

このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。

ScalarDB Cluster には、ユーザーを認証および認可するメカニズムがあります。

このガイドでは、ScalarDB Cluster で認証と認可を使用する方法について説明します。

概要

認証と認可を使用することで、ユーザーを作成し、その権限を付与または取り消すことができます。CREATE USER コマンドを使用してユーザーを作成し、GRANT コマンドまたは REVOKE コマンドを使用して、それぞれテーブルまたは名前空間に対する権限を付与または取り消すことができます。このようなデータ制御言語 (DCL) コマンドの詳細については、DCL を参照してください。

ユーザーは、必要な権限を持っている場合、ユーザー名とパスワードを使用して ScalarDB Cluster にログインし、SQL ステートメントを実行できます。

認証と認可では、次の 2 種類のユーザーがサポートされます。

  • スーパーユーザー: このタイプのユーザーにはすべての権限があります。スーパーユーザーのみが他のユーザーや名前空間を作成または削除できます。
  • 通常のユーザー: このタイプのユーザーには最初は権限がないため、スーパーユーザーまたは GRANT 権限を持つ別のユーザーによって権限を付与する必要があります。

認証と認可を使用する場合、次の権限が利用できます。

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • CREATE
  • DROP
  • TRUNCATE
  • ALTER
  • GRANT

権限の詳細については、各タイプの操作に必要な権限を参照してください。

構成

このセクションでは、認証と認可に使用できる構成について説明します。

ScalarDB Cluster ノードの構成

認証と認可を有効にするには、scalar.db.cluster.auth.enabledtrue に設定する必要があります。

名前説明デフォルト
scalar.db.cluster.auth.enabled認証と認可が有効かどうか。false

次の構成を設定することもできます。

名前説明デフォルト
scalar.db.cluster.auth.cache_expiration_time_millis認証および認可情報のキャッシュ有効期限(ミリ秒単位)。60000 (1 分)
scalar.db.cluster.auth.auth_token_expiration_time_minutes認証および認可トークンの有効期限(分単位)。1440 (1 日)
scalar.db.cluster.auth.auth_token_gc_thread_interval_minutes認証および認可トークンのガベージコレクション (GC) スレッド間隔 (分単位)。360(6 時間)
scalar.db.cluster.auth.pepperハッシュ化の前にパスワードに追加されるシークレットの値。指定しない場合、パスワードはペッパーなしでハッシュ化されます。
注記

認証と認可を有効にする場合は、認証と認可によって内部的にパーティション間スキャンが実行されるため、システム名前空間 (デフォルトでは scalardb) の scalar.db.cross_partition_scan.enabledtrue に設定する必要もあります。

ScalarDB Cluster Java Client SDK 構成

クライアント側で認証と認可を有効にするには、scalar.db.cluster.auth.enabledtrue に設定する必要があります。

名前説明デフォルト
scalar.db.cluster.auth.enabled認証と認可が有効かどうか。false

ScalarDB Cluster SQL クライアント構成 セクションの構成に加えて、クライアントのユーザー名とパスワードを指定するために scalar.db.sql.cluster_mode.usernamescalar.db.sql.cluster_mode.password も設定する必要があります。

名前説明デフォルト
scalar.db.sql.cluster_mode.usernameクライアントのユーザー名。
scalar.db.sql.cluster_mode.passwordクライアントのパスワード。

初期ユーザー

認証と認可を有効にすると、初期ユーザー admin が作成され、そのユーザーの初期パスワードは admin になります。このユーザーはスーパーユーザーであり、すべての権限を持ちます。このユーザーでログインし、必要に応じて他のユーザーを作成できます。

警告

セキュリティ上の理由から、特に実稼働環境にデプロイする前に、初期ユーザーのパスワードを必ず変更してください。

各タイプの操作に必要な権限

次の表は、各タイプの操作に必要な権限を示しています。

DDL

コマンドスーパーユーザーが必要です必要な権限
CREATE NAMESPACEtrue
DROP NAMESPACEtrue
CREATE TABLECREATE
DROP TABLEDROP
CREATE INDEXCREATE
DROP INDEXDROP
TRUNCATE TABLETRUNCATE
ALTER TABLEALTER
CREATE COORDINATOR TABLEStrue
DROP COORDINATOR TABLEStrue
TRUNCATE COORDINATOR TABLEStrue

DML

コマンドスーパーユーザーが必要です必要な権限
SELECTSELECT
INSERTINSERT
UPSERTINSERT
UPDATESELECTUPDATE
DELETESELECTDELETE

DCL

コマンドスーパーユーザーが必要です必要な権限
CREATE USERtrue
ALTER USERtrue (ユーザーは自分のパスワードを変更できます。)
DROP USERtrue
GRANTGRANT (ユーザーは自分が持っている権限のみを付与できます。)
REVOKEGRANT (ユーザーは自分が持っている権限のみを取り消すことができます。)

制限事項

認証と認可で付与または取り消される権限には、いくつかの制限があります:

  • INSERT 権限と UPDATE 権限は、一緒に付与または取り消す必要があります。
  • ユーザーに UPDATE 権限または DELETE 権限を付与するには、対象ユーザーに SELECT 権限が必要です。
  • 対象ユーザーに INSERT 権限または UPDATE 権限がある場合、そのユーザーから SELECT 権限を取り消すことはできません。

ワイヤ暗号化

認証と認可を有効にする場合は、ユーザー資格情報を保護するために、本番環境でワイヤ暗号化を有効にすることを強くお勧めします。ワイヤ暗号化の詳細については、ScalarDB Cluster ワイヤ暗号化を参照してください。

チュートリアル - ユーザーの認証と認可

このチュートリアルでは、認証と認可の使用方法を説明します。

警告

You need to have a license key (trial license or commercial license) to use ScalarDB Cluster. If you don't have a license key, please contact us.

1. ScalarDB Cluster 設定ファイルを作成する

次の設定ファイルを scalardb-cluster-node.properties として作成し、<YOUR_LICENSE_KEY><LICENSE_CHECK_CERT_PEM> を ScalarDB ライセンスキーとライセンスチェック証明書の値に置き換えます。ライセンスキーと証明書の詳細については、製品ライセンスキーの設定方法を参照してください。

scalar.db.storage=jdbc
scalar.db.contact_points=jdbc:postgresql://postgresql:5432/postgres
scalar.db.username=postgres
scalar.db.password=postgres
scalar.db.cluster.node.standalone_mode.enabled=true
scalar.db.cross_partition_scan.enabled=true
scalar.db.sql.enabled=true

# Enable authentication and authorization
scalar.db.cluster.auth.enabled=true

# License key configurations
scalar.db.cluster.node.licensing.license_key=<YOUR_LICENSE_KEY>
scalar.db.cluster.node.licensing.license_check_cert_pem=<LICENSE_CHECK_CERT_PEM>

2. Docker Compose ファイルを作成する

次の設定ファイルを docker-compose.yaml として作成します。

services:
postgresql:
container_name: "postgresql"
image: "postgres:15"
ports:
- 5432:5432
environment:
- POSTGRES_PASSWORD=postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready || exit 1"]
interval: 1s
timeout: 10s
retries: 60
start_period: 30s

scalardb-cluster-standalone:
container_name: "scalardb-cluser-node"
image: "ghcr.io/scalar-labs/scalardb-cluster-node-byol-premium:3.14.0"
ports:
- 60053:60053
- 9080:9080
volumes:
- ./scalardb-cluster-node.properties:/scalardb-cluster/node/scalardb-cluster-node.properties
depends_on:
postgresql:
condition: service_healthy

3. PostgreSQL と ScalarDB Cluster を起動します

次のコマンドを実行して、PostgreSQL と ScalarDB Cluster をスタンドアロンモードで起動します。

docker compose up -d

4. ScalarDB Cluster に接続する

ScalarDB Cluster に接続するために、このチュートリアルでは、ScalarDB Cluster に接続して SQL クエリを実行するツールである SQL CLI を使用します。SQL CLI は、ScalarDB Releases ページからダウンロードできます。

scalardb-cluster-sql-cli.properties という名前の設定ファイルを作成します。このファイルは、SQL CLI を使用して ScalarDB Cluster に接続するために使用されます。

scalar.db.sql.connection_mode=cluster
scalar.db.sql.cluster_mode.contact_points=indirect:localhost

# Enable authentication and authorization
scalar.db.cluster.auth.enabled=true

次に、次のコマンドを実行して SQL CLI を起動します。

java -jar scalardb-cluster-sql-cli-3.14.0-all.jar --config scalardb-cluster-sql-cli.properties

ユーザー名とパスワードをそれぞれ adminadmin と入力します。

これで、ScalarDB Cluster で認証と認可を有効にしてデータベースを使用する準備が整いました。

5. 名前空間とテーブルを作成する

名前空間を作成します。

CREATE NAMESPACE ns1;

CREATE NAMESPACE ns2;

次に、ns1 名前空間にテーブルを作成します。

CREATE TABLE ns1.tbl (
id INT PRIMARY KEY,
col1 TEXT,
col2 INT);

6. ユーザーを作成する

user1 という名前のユーザーを作成します。

CREATE USER user1 WITH PASSWORD 'user1';

ユーザーを確認するには、次のコマンドを実行します。

SHOW USERS;
+----------+-------------+
| username | isSuperuser |
+----------+-------------+
| user1 | false |
| admin | true |
+----------+-------------+

user1 ユーザーが作成されたことがわかります。

7. 権限の付与

ns1.tbl テーブルで user1SELECTINSERT、および UPDATE 権限を付与します。

GRANT SELECT, INSERT, UPDATE ON ns1.tbl TO user1;

次に、ns2 名前空間の user1SELECT 権限を付与します。

GRANT SELECT ON NAMESPACE ns2 TO user1;

権限を確認するには、次のコマンドを実行します。

SHOW GRANTS FOR user1;
+---------+-----------+-----------+
| name | type | privilege |
+---------+-----------+-----------+
| ns2 | NAMESPACE | SELECT |
| ns1.tbl | TABLE | SELECT |
| ns1.tbl | TABLE | INSERT |
| ns1.tbl | TABLE | UPDATE |
+---------+-----------+-----------+

user1ns.tbl テーブルに対する SELECTINSERTUPDATE 権限と、ns2 名前空間に対する SELECT 権限が付与されていることがわかります。

8. user1 としてログインする

user1 としてログインし、SQL ステートメントを実行します。

java -jar scalardb-cluster-sql-cli-3.14.0-all.jar --config scalardb-cluster-sql-cli.properties

ユーザー名とパスワードをそれぞれ user1user1 として入力します。

これで、user1 として SQL ステートメントを実行できます。

9. DML ステートメントを実行する

user1 として次の INSERT ステートメントを実行します。

INSERT INTO ns1.tbl VALUES (1, 'a', 1);

次に、user1 として次の SELECT ステートメントを実行します。

SELECT * FROM ns1.tbl;
+----+------+------+
| id | col1 | col2 |
+----+------+------+
| 1 | a | 1 |
+----+------+------+

user1INSERT および SELECT ステートメントを実行できることがわかります。

次に、user1 として次の DELETE ステートメントを実行してみてください。

DELETE FROM ns1.tbl WHERE id = 1;
Error: Authorization error (PERMISSION_DENIED: SQL-10021: Access denied: You need the DELETE privilege on the table ns1.tbl to execute this operation) (state=SDB11,code=9911)

user1 には ns1.tbl テーブルに対する DELETE 権限がないため、上記のエラーメッセージが表示されます。