本文說明如何在虛擬機器 (VM) 上,為 Spanner Omni 部署作業新增 TLS 加密功能。部署作業若採用網路安全功能,會使用傳輸層安全標準 (TLS) 1.3 加密及驗證部署作業內部和與用戶端之間的通訊。Spanner Omni 提供相互傳輸層安全標準 (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 伺服器之間的通訊。
API 憑證:加密與部署作業互動的系統通訊內容。
這種設定方式可更靈活地管理這些憑證,例如憑證輪替。
建立 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。如有需要,您可以為 API 憑證使用外部信任的 CA。
將憑證發布至所有伺服器
將 certs 目錄複製到部署作業中的所有其他伺服器,即可啟動這些伺服器並使用網路安全功能。
scp -r certs REMOTE_HOST:SPANNER_DIR/certs
步驟 3:產生用戶端憑證
您可以使用用戶端憑證,在 Spanner 中驗證使用者和應用程式。用戶端憑證可啟用用戶端與伺服器之間的 mTLS。
用戶端憑證必須由與 API 憑證相同的 CA 簽署,且必須包含授權用的使用者名稱。這個範例使用 admin
user,這是每個資料庫的預設使用者。如要進一步瞭解使用者、角色和驗證選項,請參閱「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:啟動伺服器
產生憑證並複製到部署作業中的所有伺服器後,請啟動各個伺服器。在每部伺服器上建立基本目錄,用於儲存資料、中繼資料和記錄。如果伺服器需要重新啟動,請指定相同的目錄,確保作業能持續進行。
單一伺服器部署作業
如要開始進行加密的單一伺服器部署作業,請為初始 admin 使用者建立密碼檔案,並使用支援的驗證方法和憑證啟動伺服器。
建立密碼檔案,並將權限設為 600,這樣只有擁有者可以讀取:
printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt密碼必須符合下列規定:
- 長度介於 8 到 32 個半形字元。
- 至少一個大寫字元。
- 至少一個小寫字元。
- 至少一個數字。
- 至少一個特殊字元。
啟動已設定 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會設定支援的驗證方法和密碼通訊協定,並使用指定的密碼檔案建立初始管理員user with theroles/spanner.admin` 角色。
如要瞭解如何與部署作業互動,請參閱「步驟 7:與部署作業互動」。
向外擴充部署
如果是向外擴充部署作業,請在每部機器上啟動伺服器。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 &
現在每部機器都已執行伺服器,您可以開始建立部署作業。
步驟 5:建立採用 TLS 加密的部署作業
如要建立部署作業,請按照下列步驟操作:
建立密碼檔案,內含預設
admin使用者的密碼,並將權限設為 600 (只有擁有者可讀取):printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt密碼必須符合下列規定:
- 長度介於 8 到 32 個半形字元。
- 至少一個大寫字元。
- 至少一個小寫字元。
- 至少一個數字。
- 至少一個特殊字元。
確認
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 通訊協定
從其中一個根伺服器執行
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 加密。所有伺服器都會透過加密管道相互通訊。
步驟 6:(選用) 設定負載平衡器
如要管理及分配部署作業中伺服器的用戶端流量,請設定負載平衡器。請確認負載平衡器的健康狀態檢查設定使用 HTTPS,而非 HTTP。請使用下列設定詳細資料:
| 參數 | 值 |
|---|---|
| 通訊協定 | TCP |
| 後端 IP | 伺服器的 IP 位址。 |
| 通訊埠 | 15000 (這是預設通訊埠。(如果您在 --server-address 旗標中使用了其他連接埠,請改用該連接埠)。 |
| 健康狀態檢查網址 | https://IP_ADDRESS:15012/healthz |
| 平衡策略 | 輪詢 (依序將要求分配至伺服器) |
步驟 7:與部署作業互動
您可以使用 Spanner Omni CLI,從任何 VM 與 Spanner Omni 部署作業互動。
您必須在每個指令中加入下列旗標,才能建立加密連線:
--ca-certificate-file=certs/ca-api.crt
如果您為用戶端啟用 mTLS,請在每個指令中加入下列旗標:
--client-certificate-directory=clientcerts
如要登入並與部署作業互動,請按照下列步驟操作:
登入 Spanner Omni
spanner auth login admin \ --ca-certificate-file=certs/ca-api.crt \ --deployment-endpoint=ENDPOINT按照系統提示輸入在
admin_password.txt中設定的密碼。Successfully logged in as "admin"建立資料庫
spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crtCreating database...done.開啟 SQL Shell
spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crtConnected. spanner>建立資料表並新增資料
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)驗證資料
列出資料庫:
spanner databases list --ca-certificate-file=certs/ca-api.crtNAME 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.crtConnected. 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
後續步驟
- 使用用戶端程式庫和 JDBC 驅動程式,將應用程式連線至部署作業。
- 管理使用者和角色。