在 VM 上建立採用 TLS 加密的部署作業

本文說明如何為虛擬機器 (VM) 上的 Spanner Omni 部署作業新增 TLS 加密。具備網路安全功能的部署作業會使用傳輸層安全標準 (TLS) 1.3,加密及驗證部署作業內部和用戶端之間的通訊。Spanner Omni 提供相互 TLS (mTLS) 來強化安全性,雙方在交換資料前會先建立驗證。用戶端和伺服器之間可選擇是否使用 mTLS,但 Spanner Omni 伺服器之間會透過 mTLS 進行通訊。

事前準備

開始之前,請確認環境符合下列需求:

  • 請確認您具備部署作業中每部機器的 SSH 存取權。取得這項存取權後,您就能下載並執行 Spanner Omni 二進位檔。

  • 您的網路必須允許透過通訊埠 15000 至 15030 進行 TCP 通訊。

  • 每部機器都必須有足夠的儲存空間,才能託管部署作業處理的資料。

  • 查看「系統需求」頁面,確認設定符合需求。

  • 如果您在 vSphere 虛擬化平台上執行二進位檔,請停用 TSC 虛擬化功能。如要這麼做,請將 monitor_control.virtual_rdtsc = FALSE 設定新增至虛擬機器的 .vmx 設定檔。

步驟 1:建立不含 TLS 加密的部署作業

按照「建立不加密的 Spanner Omni VM 部署作業」中的步驟操作。確認未啟用加密和安全防護功能的 VM 部署作業正常運作。本頁面假設您已建立具有三個可用區的區域性部署作業。

步驟 2:產生憑證

您需要建立三組憑證:

憑證類型 說明
API 憑證 API 憑證有助於保護 Spanner API 伺服器。
伺服器憑證 伺服器憑證有助於保護伺服器間的通訊。
用戶端憑證 使用者或應用程式會使用用戶端憑證,與 Spanner Omni 伺服器建立身分和信任關係。

這些憑證由憑證授權單位 (CA) 核發。Spanner Omni 提供工具,可建立 CA 和所有三種憑證。在其中一部機器上執行下列步驟。

您可以使用 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。

產生伺服器憑證

您會產生兩種伺服器憑證:

這種設定可讓您更靈活地管理這些憑證,例如輪替憑證。

建立 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.crt 和 server.key 兩個檔案。

建立 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.crt 和 api.key。如有需要,您可以使用外部信任的 CA 取得 API 憑證。

將憑證發布至所有伺服器

將 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:產生包裝函式金鑰組

Spanner Omni 會使用金鑰加密金鑰 (KEK) 包裝函式金鑰組,加密內部金鑰,例如權杖加密和簽署金鑰。Spanner Omni 伺服器會從 BASE_DIR/kms/wrapper_key 讀取這個金鑰組。

如要使用 spanner keys create-keyset 產生新的包裝函式金鑰組檔案,請執行下列指令:

spanner keys create-keyset --output-file=kms/wrapper_key

根據預設,spanner keys create-keyset 會產生 AES256_GCM 金鑰。如要產生其他類型的金鑰,請使用 --key-template 旗標,並搭配下列其中一個金鑰類型值:AES256_GCM、AES128_GCM、AES256_GCM_RAW、CHACHA20_POLY1305 或 XCHACHA20_POLY1305。

將包裝函式金鑰組發布至所有伺服器

在啟動伺服器前,請將 kms 目錄複製到部署作業中所有伺服器的基礎目錄:

scp -r kms REMOTE_HOST:BASE_DIR/kms

步驟 5:啟動伺服器

如要啟動部署作業中的伺服器,請按照下列步驟操作:

  1. 確認您已產生憑證和包裝函式金鑰集,並複製到部署作業中的所有伺服器。
  2. 在每部伺服器上建立基本目錄,用於儲存資料、中繼資料和記錄。如果伺服器需要重新啟動,請指定相同的基本目錄,以確保連續性。
  3. 請按照下列各節中適用於您部署類型的操作說明,啟動各個伺服器。

單一伺服器部署

如要啟動採用加密機制的單一伺服器部署作業,請為初始 admin 使用者建立密碼檔案,並使用支援的驗證方式和憑證啟動伺服器。

  1. 建立密碼檔案,並將權限設為 600,只有擁有者可以讀取:

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    密碼必須符合下列規定:

    • 長度介於 8 到 32 個半形字元。
    • 至少一個大寫字元。
    • 至少一個小寫字元。
    • 至少一個數字。
    • 至少一個特殊字元。
  2. 啟動已設定 TLS 和驗證機制的單一伺服器:

    nohup spanner start-single-server \
        --base-dir=BASE_DIR \
        --certificate-directory=${HOME}/.spanner/certs \
        --auth-methods=password,client-certificate \
        --password-protocol=opaque \
        --initial-admin-password-file=admin_password.txt &
    

    初次啟動時,spanner start-single-server 會設定支援的驗證方式和密碼通訊協定,並使用指定的密碼檔案建立具有 roles/spanner.admin 角色的初始 admin 使用者。

如要瞭解如何與部署項目互動,請參閱「步驟 8:與部署項目互動」。

水平擴展部署

如果是向外擴充部署作業,請在每部機器上啟動伺服器。server-address 和 zone 的值必須與部署設定中的值相符。網路必須解析 server-address。伺服器會使用 server-address 進行內部通訊。執行下列指令,啟動根伺服器:

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

以下指令顯示包含特定值的範例:

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

伺服器現在已在各部機器上運作,可以建立 Deployment 了。

步驟 6:建立採用 TLS 加密的部署作業

如要建立部署作業,請按照下列步驟操作:

  1. 建立密碼檔案,其中包含預設 admin 使用者的密碼,並將權限設為 600 (僅限擁有者讀取):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    密碼必須符合下列規定:

    • 長度介於 8 到 32 個半形字元。
    • 至少一個大寫字元。
    • 至少一個小寫字元。
    • 至少一個數字。
    • 至少一個特殊字元。
  2. 確認 deployment.yaml 包含您選取的驗證方式和密碼通訊協定:

    deployment_settings:
      security_settings:
        authentication_methods:
          - AUTHENTICATION_METHOD_PASSWORD
          - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
        password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE
    

    您可以指定下列一或多種驗證方式:

    • AUTHENTICATION_METHOD_PASSWORD:密碼驗證
    • AUTHENTICATION_METHOD_CLIENT_CERTIFICATE:用戶端憑證驗證

    您可以指定下列密碼通訊協定:

    • PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE:OPAQUE 通訊協定
  3. 從其中一個根伺服器執行 spanner deployment create 指令,建立部署作業。使用 --base-dir 旗標指定基本目錄 (使用啟動根伺服器時指定的相同 BASE_DIR),並使用 --admin-password-file 旗標提供管理員密碼檔案:

    spanner deployment create \
        --config-file=deployment.yaml \
        --base-dir=BASE_DIR \
        --admin-password-file=admin_password.txt
    

每部機器的控制台都會顯示訊息,指出部署作業現在包含 TLS 加密。所有伺服器都會透過加密通道相互通訊。

步驟 7:(選用) 設定負載平衡器

如要管理及分配部署項目中各伺服器的用戶端流量,請設定負載平衡器。確認健康狀態檢查的負載平衡器設定使用 HTTPS,而非 HTTP。請使用下列設定詳細資料:

參數 值
通訊協定 TCP
後端 IP 伺服器的 IP 位址。
通訊埠 15000 (這是預設通訊埠。如果您在 --server-address 旗標中使用其他通訊埠,請改用該通訊埠。
健康狀態檢查網址 https://IP_ADDRESS:15012/healthz
平衡策略 roundrobin (依序將要求分配給各個伺服器)

步驟 8:與部署項目互動

您可以使用 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_password.txt 設定的密碼。

    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)
    

步驟 9:(選用) 調整部署作業

您可以將非根伺服器新增至可用區,擴充其容量。如要新增非根伺服器,請按照下列步驟操作:

  1. 為非根伺服器產生伺服器憑證,並將憑證複製到該伺服器。詳情請參閱「步驟 2:產生憑證」。

  2. 將包裝函式金鑰組複製到非根伺服器。詳情請參閱「步驟 4:產生包裝函式金鑰組」。

  3. 啟動非根伺服器:

    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
    

後續步驟