Spanner Omni は TLS 1.3 を使用して、クライアントとサーバー間、および Spanner Omni サーバー間でやり取りされるデータを暗号化します。 Spanner Omni は、両者がデータを交換する前に互いの信頼性を確立する mTLS を提供し、セキュリティを強化します。暗号化を使用する場合、サーバーは mTLS 経由で通信する必要があります。クライアントとサーバーも mTLS を使用するかどうかを選択できます。
Spanner Omni のプレビュー版では、TLS 暗号化はサポートされていません。TLS 暗号化を使用してデプロイを作成できる機能を入手するには、 Google にお問い合わせのうえ、Spanner Omni のフルバージョンへの早期アクセスをリクエストしてください。
始める前に
次の要件を満たしていることを確認してください。
Kubernetes クラスタを作成する。この構成は、Google Kubernetes Engine(GKE)と Amazon Elastic Kubernetes Service(Amazon EKS)をサポートしています。他の環境で動作させるには、構成のカスタマイズが必要になる場合があります。
Kubernetes クラスタが、Spanner Omni コンテナをホストする Artifact Registry アーティファクトにアクセスできることを確認します。
kubectlコマンドライン ツール と Helm をインストールして構成します。vSphere 仮想化プラットフォーム マシンに Kubernetes 環境を設定する場合は、仮想マシンの
.vmx構成ファイルにmonitor_control.virtual_rdtsc = FALSEを追加して、タイムスタンプ カウンタ(TSC)の仮想化を無効にします。これにより、TrueTime が正しく動作します。環境が Spanner Omni のシステム要件を満たしていることを確認します。
ステップ 1: 証明書を生成する
3 つの証明書セットを作成する必要があります。
API 証明書: Spanner Omni API サーバーの保護に役立ちます。
サーバー証明書: サーバー間の通信の保護に役立ちます。
クライアント証明書: エンドユーザーまたはアプリケーションは、これを使用して Spanner Omni サーバーとの ID と信頼を確立します。
これらの証明書は認証局(CA)によって発行されます。 Spanner Omni には、自己署名 CA と 3 種類の証明書すべてを作成するツールが用意されています。
いずれかのマシンで次の手順を行います。この手順では、Namespace が spanner-ns であることを前提としています。これは、デプロイで使用する Namespace に変更してください。
これらの証明書は、Spanner Omni CLI を使用してワークステーションで作成できます。
1. 認証局(CA)を作成する
すべての証明書は認証局(CA)によって発行されます。組織に中央 CA がある場合や、パブリック CA を使用できます。すべての証明書に同じ CA を使用できますが、API 証明書とクライアント証明書には同じ CA を使用する必要があります。
Spanner Omni では、プライベート CA を作成できます。
./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs
create-ca コマンドは、certs ディレクトリに CA 証明書を生成します。この証明書をコピーして API 証明書の CA として使用することも、別の CA を作成することもできます。証明書を作成するときは、正しい CA を使用してください。
cp certs/ca.crt certs/ca-api.crt
ディレクトリ $HOME/.spanner/private-keys には、CA の秘密鍵が含まれています。
このディレクトリをバックアップして保護することが重要です。秘密鍵にアクセスできるユーザーは、自己署名 CA を信頼するクライアントが信頼する任意の証明書に署名できます。必要に応じて、API 証明書用に追加の CA を作成(または外部で信頼されている CA を使用)できます。このドキュメントでは、すべての種類の証明書に同じ CA を使用します。
2. サーバー証明書を生成する
2 種類のサーバー証明書を生成する必要があります。
API 証明書: この証明書を使用して、デプロイとやり取りする システムからの通信を暗号化します。
Spanner サーバー証明書: Spanner Omni サーバーは、この 証明書を使用して相互の通信を暗号化します。
この構成により、これらの証明書を柔軟に管理できます。たとえば、証明書のローテーションを使用できます。
Spanner サーバー証明書を作成する
サーバー証明書を作成するには、次のコマンドを実行します。
# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
このコマンドにより、certs ディレクトリに server.crt と server.key が作成されます。
API 証明書を作成する
API 証明書を作成するには、次のコマンドを実行します。
OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs
このコマンドにより、certs ディレクトリに api.crt と api.key が作成されます。必要に応じて、API 証明書に外部で信頼されている CA を使用します。
3. クライアント証明書を生成する
クライアント証明書を使用して、ユーザーとアプリケーションを認証できます。クライアント証明書により、クライアントとサーバー間で mTLS を有効にできます。mTLS を使用しない場合は、この手順をスキップできます。
API 証明書に署名する CA と同じ CA がクライアント証明書に署名する必要があります。また、クライアント証明書には認可用のユーザー名も含まれている必要があります。この例では、新しいデータベースのデフォルト ユーザーである admin ユーザーを使用します。詳細については、
Spanner Omni の
認証と認可をご覧ください。
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs
このコマンドにより、clientcerts ディレクトリに client.crt と client.key が作成されます。これらのファイルを、デプロイに接続するマシンに送信します。
Java クライアント ライブラリでクライアント証明書を使用する場合は、証明書鍵を PKCS#8 形式で生成する必要があります。次のコマンドを使用します。
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key
ステップ 2: 証明書を Kubernetes クラスタに push する
次のコマンドを実行して、証明書を Kubernetes クラスタに push します。
kubectl create namespace NAMESPACE
kubectl create secret generic tls-certs \
--from-file=ca.crt="certs/ca.crt" \
--from-file=ca-api.crt="certs/ca-api.crt" \
--from-file=server.crt="certs/server.crt" \
--from-file=server.key="certs/server.key" \
--from-file=api.crt="certs/api.crt" \
--from-file=api.key="certs/api.key" \
-n NAMESPACE
ステップ 3: TLS 暗号化を使用してデプロイを作成する
次の手順に沿って、TLS 暗号化を使用してデプロイを作成します。
1. Helm 構成を準備する
Helm チャート構成を作成する を参照して、環境のデプロイ構成を作成します。
TLS を有効にするには、Helm チャート構成に次の値を設定します。
# Enables TLS
global:
insecureMode: false
# Enables client certificate authentication (mTLS)
deployment:
enableClientCertificateAuthentication: true
2. デプロイの作成
次のコマンドを実行してデプロイを作成します。
kubectl create ns monitoring
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
--version VERSION \
--set global.platform=gke \
--set global.insecureMode=false \
--set deployment.enableClientCertificateAuthentication=true \
--namespace NAMESPACE \
--set monitoring.enabled=true
このコマンドはブートストラップ ジョブをトリガーします。このジョブのログを監視することで、進行状況を追跡できます。
kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f
出力に進行状況が表示されます。完了すると、「Deployment created successfully」というメッセージが表示されます。
3. Pod のステータスを確認する
次のコマンドを実行して、Pod のステータスを確認します。
kubectl get pods --watch --namespace NAMESPACE
すべての Pod が READY 状態になっています。
4. ロードバランサの詳細を使用して証明書とデプロイを更新する
クライアントが Kubernetes クラスタの外部から接続する場合は、この手順が必要です。
# Get the service details
kubectl get service spanner -n NAMESPACE
# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite
# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
ステップ 4: Spanner Omni を操作する
Spanner Omni CLI を使用すると、任意の VM から Spanner Omni デプロイを操作できます。
クライアントで mTLS を有効にした場合は、各コマンドで次のフラグを使用します。
--client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY--ca-certificate-file=API_CA_CERT_FILE_PATH
1. Spanner Omni にログインする
次のコマンドを実行してログインします。
./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
デフォルトのパスワードは admin です。
Successfully logged in as "admin"
2. データベースの作成
次のコマンドを実行してデータベースを作成します。
./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
3. SQL Shell を開く
次のコマンドを実行してシェルを開きます。
./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
4. テーブルを作成してデータを追加する
次の SQL コマンドを実行します。
spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)
spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)
5. デプロイを確認する
データベースを一覧表示するには、次のコマンドを実行します。
./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
出力は次のようになります。
| NAME | 状態 | VERSION_RETENTION_PERIOD | EARLIEST_VERSION_TIME | ENABLE_DROP_PROTECTION |
|---|---|---|---|---|
| DATABASE_NAME | READY | 1 時間 | 2025-02-07T12:25:30Z | false |
データをクエリするには、次のコマンドを実行します。
./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
次の SQL コマンドを実行します。
SHOW TABLES;
SELECT * FROM names;
または、Spanner Omni で
PGAdapter を使用するの手順に沿って PGAdapter を構成し、
psql などのツールを使用して操作することもできます。
ステップ 5: デプロイをモニタリングする
monitoring.enabled=true で Spanner Omni をインストールすると、Prometheus
が指標をスクレイピングします。Grafana を使用してこれらの指標を可視化できます。
1. サービスの詳細を取得する
次のコマンドを実行して、サービスの詳細を取得します。
# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring
# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring
次のステップ
- クライアント ライブラリと JDBC ドライバを使用して、 アプリケーションをデプロイに接続する。
- ユーザーとロールを管理する。