Scalar Solution Blog
🔐

ScalarDB/ SQL CLIで認証認可を行う

に公開

自己紹介

みなさんこんにちは、株式会社Scalarの mini-workerです。
これを書いている今日はなんと東京に雪が降り、まだまだ寒い日が続きそうだなあと凍えながら執筆しました。(遠い目)
私は東京生まれ東京育ちなのですが、年々夏はより暑く・冬はより寒くなっている気がしてます。健康が一番なので体調にはより一層気をつけていきたいです。
では本題に入りましょう。

概要

この記事では、ScalarDB Clusterの認証・認可機能について解説します。
SQL CLIを使って、ユーザーの作成から権限の付与・確認までの一連の流れを実際に試してみました。「ScalarDBで認証機能を有効にしたいけど、どうやって設定するの?」という方の参考になれば幸いです。

対象読者

  • ScalarDBの認証・認可機能を導入しようとしているエンジニア
  • SQL CLIでのユーザー管理方法を知りたい方
  • ScalarDBの権限管理の具体的なコード例を探している方

背景・目的

ScalarDBには認証・認可機能が備わっていますが、実際にどのように動作するのか試してみたいと思い、今回検証を行いました。
ユーザーの作成、権限の付与、ロールの作成と付与など、一通りの操作を確認していきます。


構成

今回は以下の構成で検証を行います。


事前準備

必要なファイルの作成

以下の3つのファイルを作成します。

1. docker-compose.yml

docker-compose.yml
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.17.1"
    ports:
      - 60053:60053
      - 9080:9080
    volumes:
      - ./scalardb-cluster-node.properties:/scalardb-cluster/node/scalardb-cluster-node.properties
    depends_on:
      postgresql:
        condition: service_healthy

2. scalardb-cluster-node.properties

ScalarDB Clusterの設定ファイルです。認証を有効にするにはscalar.db.cluster.auth.enabled=trueを設定します。

scalardb-cluster-node.properties
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=<license_key>
scalar.db.cluster.node.licensing.license_check_cert_pem=<pem>

3. sql.properties

SQL CLIからScalarDB Clusterに接続するための設定ファイルです。

sql.properties
scalar.db.sql.connection_mode=cluster
scalar.db.sql.cluster_mode.contact_points=indirect:localhost
scalar.db.sql.cluster_mode.contact_port=60053
scalar.db.cluster.auth.enabled=true

SQL CLIのダウンロード

SQL CLIのjarファイルをローカルにダウンロードします。

curl -OL https://github.com/scalar-labs/scalardb/releases/download/v3.17.1/scalardb-cluster-sql-cli-3.17.1-all.jar

または、GitHubのリリースページから直接ダウンロードすることも可能です。

準備完了の確認

以下の4つのファイルが揃っていればOKです。

.
├── docker-compose.yaml
├── scalardb-cluster-node.properties
├── scalardb-cluster-sql-cli-3.17.1-all.jar
└── sql.properties

実装方法 / 解説

1. Dockerコンテナの起動

docker compose up -d

2. SQL CLIでadminとしてログイン

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

ユーザー名とパスワードを聞かれるので、admin/adminでログインします。

Enter username for jdbc:scalardb:sql.properties: admin
Enter password for jdbc:scalardb:sql.properties: admin

3. Namespaceとテーブルの作成(admin)

CREATE NAMESPACE test;
CREATE TABLE IF NOT EXISTS test.privilege_test (id INT, value INT, PRIMARY KEY (id));

4. データの投入(admin)

INSERT INTO test.privilege_test VALUES(1,1),(2,2);

5. データの確認(admin)

SELECT * FROM test.privilege_test;

※adminでTerminal開いている時は背景をピンクにしています

6. ユーザーの作成(admin)

CREATE USER user1 WITH PASSWORD 'user1';

7. 新規ユーザーでログイン

別のターミナルを開き、作成したユーザーでログインします。

java -jar scalardb-cluster-sql-cli-3.17.1-all.jar --config sql.properties
Enter username for jdbc:scalardb:sql.properties: user1
Enter password for jdbc:scalardb:sql.properties: user1

8. 権限がないことを確認(user1)

SELECT * FROM test.privilege_test;

この時点では権限がないため、エラーになります。
※user1でTerminal開いている時は背景を水色にしています。


しっかりと認証エラー(Authorization error)エラーが出ました。

9. SELECT権限の付与(admin)

adminユーザー側で権限を付与します。

GRANT SELECT ON "test"."privilege_test" TO user1;
SHOW GRANTS FOR user1;

ちゃんとuser1に、test.privilege_testSELECT 権限が付与されたことを確認しました。

10. SELECTが可能になったことを確認(user1)

SELECT * FROM test.privilege_test;


権限が付与されたので、SELECTが成功します。

11. ロールを使った権限管理(admin)

ロールを作成し、複数の権限をまとめて付与することもできます。

-- ロールの作成
CREATE ROLE user1_role;
SHOW ROLES;

-- ロールに権限を付与
GRANT SELECT, INSERT, UPDATE ON test.privilege_test TO ROLE user1_role;

-- ロールの権限を確認
SHOW ROLE GRANTS FOR user1_role;

-- ユーザーにロールを付与
GRANT ROLE user1_role TO user1;
SHOW GRANTS FOR user1;

user1が test.privilege_testINSERT , UPDATE 権限が付与されたことを確認しました。

12. ロールで付与された権限の確認(user1)

INSERT INTO test.privilege_test VALUES(3,3);
UPDATE test.privilege_test SET value = 10 WHERE id = 2;
SELECT * FROM test.privilege_test;

INSERT権限, UPDATE権限も付与されたので、データの挿入・更新も可能になります。


感想


まとめ

今回は、ScalarDB Clusterの認証・認可機能を実際に試してみました。

  • 成果: SQL CLIを使って、ユーザーの作成、権限の付与、ロールを使った権限管理まで一通り確認できました。
  • 所感: 標準的なSQL構文で操作できるため、学習コストが低く、すぐに導入できそうだと感じました。

ScalarDBで認証機能を導入しようとしている方の参考になれば幸いです。


参考リンク


執筆者紹介 / 会社情報

執筆者

mini-worker
株式会社Scalar ビジネスソリューション本部 / Solution Engineer

会社情報

Scalar, Incは、「データマネジメントの未来を創る」を掲げ、データベースミドルウェアの研究開発・販売を行う日本発のグローバルスタートアップ企業です!
複数の異なるデータベース(RDB、NoSQLなど)を仮想的に統合し、トランザクション処理や分析クエリを実現するデータベースミドルウェアであるScalarDB、分散台帳技術(DLT)を用いたソフトウェアで、データの改ざん検知を行うScalarDLを主な製品としています。
是非下記の弊社サイトもチェックをお願いします!

Scalar Solution Blog
Scalar Solution Blog

Discussion