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

ユーザーの認証と認可

注記

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

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

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

ヒント

プリミティブインターフェースを使用して認証と認可を行うこともできます。詳細については、ClusterClientTransactionAdminを参照してください。これは AuthAdmin を実装しています。

概要​

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

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

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

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

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

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

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

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

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
INSERTSELECT、INSERT、UPDATE
UPSERTSELECT、INSERT、UPDATE
UPDATESELECT、INSERT、UPDATE
DELETESELECT、DELETE
注記

ScalarDB では最初、データを書き込むために UPSERT に対応する Put 操作のみが提供されていました。その結果、内部的には一つの書き込み権限しか存在しません。そのため、INSERT、UPDATE、UPSERT に必要な権限は同じであり、すべて SELECT 権限が必要です。将来的には、ScalarDB はより細かい書き込み権限の提供を予定しています。

DCL​

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

設定​

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

ScalarDB Cluster ノードの設定​

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

名前説明デフォルト
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.enabled を true に設定する必要もあります。

ScalarDB Cluster Java Client SDK 設定​

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

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

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

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

初期ユーザー​

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

警告

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

ワイヤ暗号化​

認証と認可を有効にする場合は、ユーザー資格情報を保護するために、本番環境でワイヤ暗号化を有効にすることを強くお勧めします。ワイヤ暗号化の詳細については、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-cluster-node"
image: "ghcr.io/scalar-labs/scalardb-cluster-node-byol-premium:3.15.9"
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.15.9-all.jar --config scalardb-cluster-sql-cli.properties

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

これで、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 テーブルで user1 に SELECT、INSERT、および UPDATE 権限を付与します。

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

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

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 |
+---------+-----------+-----------+

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

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

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

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

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

これで、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 |
+----+------+------+

user1 が INSERT および 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 権限がないため、上記のエラーメッセージが表示されます。