在 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),將內部伺服器間通訊與外部用戶端和 API 通訊隔離:

  • 內部伺服器 CA (ca.crt):核發伺服器憑證 (server.crt),專門用於 Spanner Omni 伺服器之間的內部 mTLS 通訊。
  • API 和用戶端 CA (ca-api.crt):核發 API 伺服器憑證 (api.crt) 和用戶端 mTLS 憑證 (client.crt)。或者,您也可以針對 API 和用戶端憑證使用外部信任的 CA。
  1. 建立內部伺服器 CA,用於伺服器間通訊:

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

    這個指令會建立內部伺服器 CA 憑證 (certs/ca.crt),並將其私密金鑰寫入 $HOME/.spanner/private-keys/ca.key。

  2. 為 API 和用戶端憑證建立獨立的 CA,並將其 CA 憑證複製到 certs/ca-api.crt:

    spanner certificates create-ca \
        --ca-certificate-directory=api-certs \
        --ca-private-key-directory=$HOME/.spanner/api-private-keys
    cp api-certs/ca.crt certs/ca-api.crt
    

    這些指令會建立 API 和用戶端 CA 憑證 (api-certs/ca.crt,複製到 certs/ca-api.crt),並將其私密金鑰寫入 $HOME/.spanner/api-private-keys/ca.key。

備份並保護 $HOME/.spanner/private-keys 和 $HOME/.spanner/api-private-keys。使用者只要能存取這些私密金鑰,就能簽署部署作業信任的任意憑證。

產生伺服器憑證

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

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

建立 Spanner 伺服器憑證

Spanner Omni 伺服器會使用伺服器憑證,加密彼此之間的通訊 (伺服器間通訊)。

建立伺服器憑證:

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

將 SERVER_LIST 替換為以半形逗號分隔的 Spanner 伺服器名稱或後置字串清單。

這個指令會在 certs 目錄中建立兩個檔案:server.crt 和 server.key。

建立 API 憑證

API 憑證會加密與部署作業互動的系統通訊。為 API 和伺服器間通訊使用不同的憑證和 CA,可隔離信任網域,並獨立輪替各種類型。

使用 API CA 建立 API 憑證:

SERVER_NAMES=LB_DNS
spanner certificates create-server \
    --filename-prefix=api \
    --hostnames=${SERVER_NAMES} \
    --ca-certificate-directory=api-certs \
    --ca-private-key-directory=$HOME/.spanner/api-private-keys \
    --output-directory=certs

將 LB_DNS 替換為負載平衡器的 DNS 主機名稱。

這個指令會在 certs 目錄中建立另外兩個檔案:api.crt 和 api.key。如有需要,您可以使用外部信任的 CA 取得 API 憑證。

將憑證發布至所有伺服器

將 certs 目錄複製到部署作業中的所有其他伺服器,以便啟動這些伺服器,並啟用網路安全防護功能。

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

步驟 3:產生用戶端憑證

您可以使用用戶端憑證,在 Spanner 中驗證使用者和應用程式。用戶端憑證可啟用用戶端與伺服器之間的 mTLS。

使用 API 和用戶端 CA (api-certs/ca.crt,與 certs/ca-api.crt 相符) 簽署用戶端憑證,並加入授權使用者名稱。請勿使用內部伺服器 CA (certs/ca.crt) 簽署用戶端憑證。這個範例使用 admin 使用者,這是每個資料庫的預設使用者。如要進一步瞭解使用者、角色和驗證選項,請參閱「Spanner Omni 的驗證與授權」。

建立用戶端憑證:

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory=clientcerts \
    --ca-certificate-directory=api-certs \
    --ca-private-key-directory=$HOME/.spanner/api-private-keys

這個指令會在 clientcerts 目錄中建立 client.crt 和 client.key 檔案。將這些檔案傳送至任何連線至部署作業伺服器的機器。

如果您打算搭配 Java 用戶端程式庫使用用戶端憑證,則必須產生 PKCS#8 格式的憑證金鑰。使用下列指令:

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory=clientcerts \
    --ca-certificate-directory=api-certs \
    --ca-private-key-directory=$HOME/.spanner/api-private-keys \
    --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 &

伺服器現在已在各個機器上執行,可以開始建立部署作業。

步驟 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
    

後續步驟