Spanner Omni は TLS 1.3 を使用して、クライアントとサーバー間、および Spanner Omni サーバー間で流れるデータを暗号化します。Spanner Omni は、セキュリティを強化するために mTLS を提供します。mTLS では、両者がデータを交換する前に互いの信頼性を確立します。暗号化を使用する場合は、サーバーが mTLS で通信する必要があります。クライアントとサーバーで mTLS を使用するかどうかを選択できます。
Spanner Omni のプレビュー バージョンは TLS 暗号化をサポートしておらず、デプロイの作成から 90 日後にデータの書き込みを停止します。すべての機能を利用できるエディションの早期アクセスについては、Google にお問い合わせください。
始める前に
次の要件を満たしていることを確認してください。
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 がクライアント証明書に署名する必要があります。また、クライアント証明書には認証用のユーザー名も含まれている必要があります。この例では、新しいデータベースのデフォルト ユーザーである 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
出力は次のようになります。
| 名前 | 状態 | 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 ドライバを使用して、アプリケーションをデプロイと接続します。
- ユーザーとロールを管理する。