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

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

Spanner Omni のプレビュー版 では、TLS 暗号化はサポートされていません。TLS 暗号化を使用してデプロイを作成できる機能 を入手するには、 Google に連絡して Spanner Omni のフルバージョン への早期アクセスをリクエストしてください。

始める前に

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

  • デプロイ内の各マシンに 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 &

各マシンでサーバーが実行されるようになったら、デプロイを作成できます。

ステップ 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

次のステップ