保存データの暗号化
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
このドキュメントでは、ScalarDB に保存されているデータを暗号化する方法について説明します。
概要
ScalarDB は、それを介して保存されたデータを暗号化できます。暗号化機能は、主要なデータベースシステムの透過的データ暗号化 (TDE) に似ているため、アプリケーションに対して透過的です。ScalarDB は、バックエンドデータベースに書き込む前にデータを暗号化し、そこから読み取るときに復号します。
現在、ScalarDB は列レベルの暗号化をサポートしており、テーブル内の特定の列を暗号化できます。
設定
暗号化機能を有効にするには、ScalarDB Cluster ノード設定ファイルで scalar.db.cluster.encryption.enabled を true に設定する必要があります。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.enabled | ScalarDB が保存データを暗号化するかどうか。 | false |
暗号化はクライアントに対して透過的であるため、クライアントの設定を変更する必要はありません。
その他の設定は、選択した暗号化実装によって異なります。現在、ScalarDB は次の暗号化実装をサポートしています。
- HashiCorp Vault 暗号化
- 自己暗号化
次のセクションでは、各暗号化実装の設定方法について説明します。
HashiCorp Vault 暗号化
HashiCorp Vault 暗号化では、ScalarDB は HashiCorp Vault の encryption as a service を使用してデータを暗号化および復号します。この実装では、ScalarDB は暗号化キーの管理とデータの暗号化および復号を HashiCorp Vault に委任します。
HashiCorp Vault 暗号化を使用するには、ScalarDB Cluster ノード設定ファイルでプロパティ scalar.db.cluster.encryption.type を vault に設定する必要があります。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.type | HashiCorp Vault 暗号化を使用するには、vault に設定する必要があります。 |
次のプロパティも設定する必要があります。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.vault.key_type | キーの種類。現在、aes128-gcm96、aes256-gcm96、chacha20-poly1305 がサポートされています。キーの種類の詳細については、Key types を参照してください。 | aes128-gcm96 |
scalar.db.cluster.encryption.vault.associated_data_required | AEAD 暗号化に関連データが必要かどうか。 | false |
scalar.db.cluster.encryption.vault.address | HashiCorp Vault サーバーのアドレス。 | |
scalar.db.cluster.encryption.vault.token | HashiCorp Vault で認証するためのトークン。 | |
scalar.db.cluster.encryption.vault.namespace | HashiCorp Vault の名前空間。この設定はオプションです。 | |
scalar.db.cluster.encryption.vault.transit_secrets_engine_path | トランジットシークレットエンジンのパス。 | transit |
scalar.db.cluster.encryption.vault.column_batch_size | HashiCorp Vault サーバーへの単一のリクエストに含まれる列の数。 | 64 |
現在、ScalarDB はトークン認証方式のみをサポートしています。将来的には、AppRole、OIDC、Kubernetes 認証などの、より安全な認証方式の実装が予定されています。
自己暗号化
自己暗号化では、ScalarDB がデータ暗号化キー (DEK) を管理し、暗号化と復号を実行します。ScalarDB はテーブルの作成時にテーブルごとに DEK を生成し、Kubernetes Secrets に保存します。
自己暗号化を使用するには、ScalarDB Cluster ノード設定ファイルでプロパティ scalar.db.cluster.encryption.type を self に設定する必要があります。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.type | 自己暗号化を使用するには self に設定する必要があります。 |
次のプロパティも設定する必要があります。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.self.key_type | キーの種類。現在、AES128_GCM、AES256_GCM、AES128_EAX、AES256_EAX、AES128_CTR_HMAC_SHA256、AES256_CTR_HMAC_SHA256、CHACHA20_POLY1305、および XCHACHA20_POLY1305 がサポートされています。キーの種類の詳細については、キータイプの選択を参照してください。 | AES128_GCM |
scalar.db.cluster.encryption.self.associated_data_required | AEAD 暗号化に関連データが必要かどうか。 | false |
scalar.db.cluster.encryption.self.kubernetes.secret.namespace_name | Kubernetes Secrets の名前空間名。 | default |
scalar.db.cluster.encryption.self.data_encryption_key_cache_expiration_time | DEK キャッシュの有効期限(ミリ秒単位)。 | 60000 (60秒) |
テーブルを削除するときに DEK を削除する
デフォルトでは、ScalarDB はテーブルを削除しても、テーブルに関連付けられたデータ暗号化キー (DEK) を削除しません。ただし、テーブルを削除するときに DEK を削除するように ScalarDB を設定できます。これを有効にするには、ScalarDB Cluster ノード設定ファイルでプロパティ scalar.db.cluster.encryption.delete_data_encryption_key_on_drop_table.enabled を true に設定します。
| 名前 | 説明 | デフォルト |
|---|---|---|
scalar.db.cluster.encryption.delete_data_encryption_key_on_drop_table.enabled | テーブルを削除するときに DEK を削除するかどうか。 | false |
制限事項
暗号化機能にはいくつかの制限事項があります:
- 主キー列 (パーティションキー列とクラスタリングキー列) は暗号化できません。
- セカンダリインデックス列は暗号化できません。
- 暗号化された列は WHERE 句または ORDER BY 句で指定できません。
- 暗号化された列は、基になるデータベースに BLOB 型として保存されるため、BLOB 型の最大サイズより大きい暗号化された列は保存できません。BLOB 型の最大サイズについては、ScalarDB と他のデータベース間のデータ型マッピングを参照してください。
- 暗号化された列の名前を変更することはできません。
- 暗号化された列のデータ型を変更することはできません。
ワイヤ暗号化
暗号化機能を有効にする場合は、データを保護するために本番環境でワイヤ暗号化を有効にすることを強くお勧めします。ワイヤ暗号化の詳細については、ScalarDB Cluster ワイヤ暗号化を参照してください。
チュートリアル - HashiCorp Vault 暗号化を設定してデータを暗号化する
このチュートリアルでは、HashiCorp Vault 暗号化を使用して ScalarDB で保存されたデータを暗号化する方法について説明します。
前提条件
- 以下のいずれかの Java Development Kit (JDK):
- Oracle JDK: 8、11、17、または 21 (LTS バージョン)
- OpenJDK ディストリビューション (Eclipse Temurin、Amazon Corretto、または Microsoft Build of OpenJDK): 8、11、17、または 21 (LTS バージョン)
- Docker 20.10以降と Docker Compose V2以降
ScalarDB Cluster を使用するには、ライセンスキー (試用ライセンスまたは商用ライセンス) が必要です。ライセンスキーをお持ちでない場合は、お問い合わせください。
ステップ 1. HashiCorp Vault をインストールします
HashiCorp の公式ドキュメント Install Vault を参照して、HashiCorp Vault をインストールします。
ステップ 2. 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.sql.enabled=true
# Enable cross-partition scan to perform a full scan by using the SELECT statements in this tutorial.
# This is not required for encryption itself.
scalar.db.cross_partition_scan.enabled=true
# Encryption configurations
scalar.db.cluster.encryption.enabled=true
scalar.db.cluster.encryption.type=vault
scalar.db.cluster.encryption.vault.address=http://vault:8200
scalar.db.cluster.encryption.vault.token=root
# 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>
ステップ 3. Docker Compose 設定ファイルを作成する
次の設定ファイルを docker-compose.yaml として作成します。
services:
vault:
container_name: "vault"
image: "hashicorp/vault:1.17.3"
ports:
- 8200:8200
environment:
- VAULT_DEV_ROOT_TOKEN_ID=root
- VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200
cap_add:
- IPC_LOCK
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.18.0"
ports:
- 60053:60053
- 9080:9080
volumes:
- ./scalardb-cluster-node.properties:/scalardb-cluster/node/scalardb-cluster-node.properties
depends_on:
postgresql:
condition: service_healthy
ステップ 4. HashiCorp Vault サーバーを起動します
次のコマンドを実行して、HashiCorp Vault サーバーを開発モードで起動します。
docker compose up vault -d
HashiCorp Vault サーバーが実行したら、次のコマンドを実行して環境変数を設定します。
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN=root
ステップ 5. HashiCorp Vault サーバーでトランジットシークレットエンジンを有効にする
次のコマンドを実行して、HashiCorp Vault サーバーでトランジットシークレットエンジンを有効にします。
vault secrets enable transit
ステップ 6. PostgreSQL と ScalarDB Cluster を起動する
次のコマンドを実行して、PostgreSQL と ScalarDB Cluster をスタンドアロンモードで起動します。
docker compose up postgresql scalardb-cluster-standalone -d
ScalarDB Cluster が完全に起動するまでに数分かかる場合があります。