VM で TLS 暗号化を使用してデプロイを作成する

このドキュメントでは、仮想マシン(VM)上の Spanner Omni デプロイに TLS 暗号化を追加する方法について説明します。ネットワーク セキュリティ機能を備えたデプロイでは、Transport Layer Security(TLS)1.3 を使用して、デプロイ内およびクライアントとの通信を暗号化して認証します。Spanner Omni は、セキュリティを強化するために相互 TLS(mTLS)を提供します。mTLS では、両方の当事者がデータを交換する前に信頼性を確立します。mTLS はクライアントとサーバーの間では省略可能ですが、Spanner Omni サーバーは mTLS を介して相互に通信します。

Spanner Omni のプレビュー バージョンは TLS 暗号化をサポートしておらず、デプロイの作成から 90 日後にデータの書き込みを停止します。すべての機能を利用できるエディションの早期アクセスについては、Google にお問い合わせください。

始める前に

開始する前に、環境が次の要件を満たしていることを確認してください。

  • デプロイ内の各マシンに SSH アクセスできることを確認します。このアクセス権により、Spanner Omni バイナリをダウンロードして実行できます。

  • ネットワークでポート 15000 ~ 15025 の TCP 通信を許可する必要があります。

  • 各マシンには、デプロイで処理するデータをホストするのに十分なストレージが必要です。

  • システム要件のページで、セットアップが要件を満たしていることを確認します。

  • vSphere 仮想化プラットフォームでバイナリを実行する場合は、TSC 仮想化を無効にします。これを行うには、仮想マシンの .vmx 構成ファイルに monitor_control.virtual_rdtsc = FALSE 設定を追加します。

ステップ 1: TLS 暗号化なしでデプロイを作成する

暗号化なしで Spanner Omni VM デプロイを作成するの手順に沿って操作します。暗号化とセキュリティ機能のない VM デプロイが正しく機能することを確認します。このページでは、3 つのゾーンを含むリージョン デプロイを作成していることを前提としています。

ステップ 2: 証明書を生成する

次の 3 組の証明書を作成する必要があります。

証明書の種類 説明
API 証明書 API 証明書は、Spanner API サーバーの保護に役立ちます。
サーバー証明書 サーバー証明書は、サーバー間の通信を保護するのに役立ちます。
クライアント証明書 エンドユーザーまたはアプリケーションは、クライアント証明書を使用して、Spanner Omni サーバーとの ID と信頼を確立します。

これらの証明書は認証局(CA)によって発行されます。Spanner Omni には、CA と 3 種類の証明書すべてを作成するためのツールが用意されています。いずれかのマシンで次の手順を行います。

これらの証明書は、Spanner Omni CLI を使用してワークステーションで作成し、証明書ファイルを各 Spanner Omni サーバーに転送できます。詳細については、Spanner Omni CLI を使用したクイックスタートをご覧ください。

証明書を生成するには、次の手順を完了する必要があります。

認証局(CA)を作成する

この認証局は、次の手順で生成するすべてのクライアント証明書とサーバー証明書のルート CA です。

spanner certificates create-ca --ca-certificate-directory=certs

certs ディレクトリには CA 証明書が含まれています。この証明書のコピーを作成して、API 証明書の CA として使用します。

cp certs/ca.crt certs/ca-api.crt

ディレクトリ $HOME/.spanner/private-keys には、CA の秘密鍵が含まれています。このディレクトリをバックアップして保護します。秘密鍵にアクセスできるユーザーは、自己署名 CA を信頼するクライアントが信頼する任意の証明書に署名できます。すべての証明書に同じ CA を使用できますが、API 証明書とクライアント証明書は同じ CA を使用する必要があります。必要に応じて、API 証明書用の追加の CA を作成(または外部で信頼されている CA を使用)できます。証明書を作成する次の手順では、正しい CA を使用してください。このドキュメントでは、すべての証明書タイプに同じ CA を使用します。

サーバー証明書を生成する

次の 2 種類のサーバー証明書を生成します。

この設定により、証明書のローテーションなど、これらの証明書をより柔軟に管理できます。

Spanner サーバー証明書を作成する

Spanner Omni サーバーは、サーバー証明書を使用して相互の通信(サーバー間通信)を暗号化します。

次のコマンドを実行して、サーバー証明書を作成します。SERVER_LIST は、Spanner サーバーまたは接尾辞の名前のカンマ区切りリストに置き換えます。

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

このコマンドにより、certs ディレクトリに server.crtserver.key という 2 つのファイルが作成されます。

API 証明書を作成する

API 証明書は、デプロイとやり取りするシステムからの通信を暗号化します。API とサーバー間通信に個別の証明書を使用すると、各タイプを個別に管理およびローテーションできます。

次のコマンドを実行して API 証明書を作成します。LB_DNS は、ロードバランサの DNS に置き換えます。

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

このコマンドにより、certs ディレクトリに api.crtapi.key という 2 つのファイルが作成されます。必要に応じて、API 証明書に外部で信頼されている CA を使用できます。

すべてのサーバーに証明書を配布する

certs ディレクトリをデプロイ内の他のすべてのサーバーにコピーして、ネットワーク セキュリティ機能で起動します。

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

ステップ 3: クライアント証明書を生成する

クライアント証明書を使用して、Spanner でユーザーとアプリケーションを認証できます。クライアント証明書を使用すると、クライアントとサーバー間の mTLS が有効になります。

クライアント証明書は、API 証明書と同じ CA によって署名され、認証用のユーザー名が含まれている必要があります。この例では、各データベースのデフォルト ユーザーである admin ユーザーを使用します。ユーザー、ロール、認証オプションの詳細については、Spanner Omni の認証と認可をご覧ください。

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

このコマンドは、clientcerts ディレクトリに client.crt ファイルと client.key ファイルを作成します。これらのファイルを、デプロイのサーバーに接続する任意のマシンに送信します。

Java クライアント ライブラリでクライアント証明書を使用する場合は、証明書鍵を PKCS#8 形式で生成する必要があります。次のコマンドを使用します。

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

ステップ 4: サーバーを再起動する

証明書を生成してデプロイ内のすべてのサーバーにコピーしたら、各サーバーを再起動します。

単一サーバーのデプロイ

単一サーバーのデプロイの場合は、次のコマンドを実行します。

nohup spanner start-single-server \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

サーバーが起動します。デプロイを操作するには、ステップ 7: デプロイを操作するをご覧ください。

スケールアウト デプロイ

スケールアウト デプロイの場合は、各マシンでサーバーを起動します。server_addresszone の値は、デプロイ構成の値と一致している必要があります。ネットワークは server_address を解決する必要があります。サーバーは内部通信にこれを使用します。次のコマンドを実行して、ルートサーバーを起動します。

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

次のコマンドは、特定の値を含む例を示しています。

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false &

クライアントで mTLS を有効にするには、サーバーの起動時に --enable-client-certificate-authentication=true フラグを使用します。

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false \
    --enable-client-certificate-authentication=true &

各マシンでサーバーが実行されているので、Deployment を作成する準備が整いました。

ステップ 5: TLS 暗号化を使用してデプロイを作成する

ルートサーバーのいずれかから spanner deployment create コマンドを実行します。

spanner deployment create --config-file=deployment.yaml

各マシンのコンソールに、デプロイに TLS 暗号化が含まれるようになったことを示すメッセージが表示されます。すべてのサーバーは、暗号化されたチャネルを介して相互に通信します。

ステップ 6: (省略可)ロードバランサを構成する

クライアント トラフィックを管理してデプロイ内のサーバーに分散するには、ロードバランサを設定します。ヘルスチェックのロードバランサ構成で、HTTP ではなく HTTPS が使用されていることを確認します。次の構成の詳細を使用します。

パラメータ
プロトコル TCP
バックエンド IP サーバーの IP アドレス。
ポート 15000(これはデフォルトのポートです。--server-address フラグで別のポートを使用した場合は、そのポートを使用します)。
ヘルスチェック URL https://IP_ADDRESS:15012/healthz
バランス調整戦略 roundrobin(サーバー間でリクエストを順番に分散します)

ステップ 7: デプロイを操作する

Spanner Omni CLI を使用して、任意の VM から Spanner Omni デプロイを操作できます。

暗号化された接続を確立するには、各コマンドに次のフラグを含める必要があります。

  • --ca-certificate-file=certs/ca-api.crt

クライアントで mTLS を有効にした場合は、各コマンドに次のフラグも追加します。

  • --client-certificate-directory=clientcerts

ログインしてデプロイを操作する手順は次のとおりです。

  1. Spanner Omni にログインする

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    デフォルトのパスワードは admin です。

    Successfully logged in as "admin"
    
  2. データベースの作成

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. SQL Shell を開く

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. テーブルを作成してデータを追加する

    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. データを確認する

    データベースを一覧表示します。

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    テーブルからデータを取得します。

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

ステップ 8: (省略可)デプロイをスケーリングする

ゾーンに非ルート サーバーを追加して、ゾーンの容量をスケーリングできます。これを行うには、ステップ 2: 証明書を生成するで説明するように、非ルート サーバーのサーバー証明書を生成し、次のコマンドでサーバーを起動します。

spanner start \
    --server-address=NON_ROOT_MACHINE \
    --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
    --zone=us-central1-a \
    --base-dir=./spandir \
    --certificate-directory=${HOME}/.spanner/certs \
    --insecure-mode=false

次のステップ