本頁面說明如何為執行個體強制執行 SSL/TLS 加密,確保所有連線都已加密。您也可以進一步瞭解 Cloud SQL 如何使用自行管理的 SSL/TLS 憑證,安全地連線至 Cloud SQL 執行個體。
總覽
建立執行個體時,Cloud SQL 會自動建立伺服器憑證。建議您強制所有連線使用 SSL/TLS。
如要使用 SSL/TLS 憑證驗證用戶端/伺服器身分,您必須建立用戶端憑證,並將憑證下載至 PostgreSQL 用戶端主機機器。 如果您為執行個體強制執行 SSL,執行個體就不需要重新啟動。不過,變更 SSL/TLS 憑證可能會導致執行個體自動重新啟動,並造成服務中斷。變更 SSL 模式設定只會套用至新的連線。如果您強制執行 SSL,且執行個體已有未加密的連線,則連線會保持連線狀態且未加密。如要關閉所有未加密的連線,並強制執行所有連線的 SSL,您必須重新啟動執行個體。
強制執行 SSL/TLS 加密機制
您可以使用 SSL 模式設定,以下列方式強制執行 SSL 加密:
允許非 SSL/非 TLS 和 SSL/TLS 連線。系統不會驗證 SSL/TLS 連線的用戶端憑證。這是目前的預設做法。
僅允許使用 SSL/TLS 加密的連線。系統不會驗證 SSL 連線的用戶端憑證。
- 僅允許使用 SSL/TLS 加密的連線,並具備有效的用戶端憑證。
如果您為 Cloud SQL 執行個體選取「允許非 SSL/非 TLS 和 SSL/TLS 連線」,系統會接受 SSL/TLS 連線,以及未加密和不安全的連線。如果您不需要針對所有連線使用安全資料傳輸層 (SSL)/傳輸層安全標準 (TLS),系統仍會允許未加密的連線。因此,如果您要使用公開 IP 存取執行個體,強烈建議您針對所有連線強制執行 SSL。
您可以使用 SSL/TLS 憑證直接連線至執行個體,也可以使用 Cloud SQL 驗證 Proxy 或 Cloud SQL 連接器連線。如果您使用 Cloud SQL 驗證 Proxy 或 Cloud SQL 連接器連線,系統會自動使用 SSL/TLS 加密連線。無論 SSL 模式設定為何,Cloud SQL Auth Proxy 和 Cloud SQL 連接器也會自動驗證用戶端和伺服器身分。
如要啟用 SSL/TLS 要求,請按照下列步驟操作:
控制台
-
前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 SQL 導覽選單中的「連結」。
- 選取「安全性」分頁標籤。
- 請選取下列其中一種做法:
- 允許未加密的網路流量 (不建議)
- 僅允許 SSL 連線。這個選項只允許使用 SSL/TLS 加密的連線。系統不會驗證憑證。
- 要求使用信任的用戶端憑證。這個選項只允許使用有效用戶端憑證並經過 SSL 加密的用戶端連線。如果用戶端或使用者使用 IAM 資料庫驗證連線,則必須使用 Cloud SQL Auth Proxy 或 Cloud SQL 連接器來強制執行用戶端身分驗證。
gcloud
gcloud sql instances patch INSTANCE_NAME \ --ssl-mode=SSL_ENFORCEMENT_MODE
請使用下列其中一個選項取代 SSL_ENFORCEMENT_MODE:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
允許非 SSL/非 TLS 和 SSL/TLS 連線。對於 SSL 連線,系統不會驗證用戶端憑證。這是預設值。ENCRYPTED_ONLY
僅允許使用 SSL/TLS 加密的連線。系統未針對 SSL 連線驗證用戶端憑證。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
只允許使用 SSL/TLS 加密的連線,且必須具備有效的用戶端憑證。如果用戶端或使用者使用 IAM 資料庫驗證連線,則必須使用 Cloud SQL Auth Proxy 或 Cloud SQL 連接器來強制執行用戶端身分驗證。
詳情請參閱「
PostgreSQL 適用的 Cloud SQL 設定」。
Terraform
如要強制執行 SSL/TLS 加密機制,請使用 Terraform 資源:
套用變更
如要在 Google Cloud 專案中套用 Terraform 設定,請完成下列各節中的步驟。
準備 Cloud Shell
- 啟動 Cloud Shell。
-
設定要套用 Terraform 設定的預設 Google Cloud 專案。
您只需為每個專案執行這個指令一次,而且可以在任何目錄中執行。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 設定檔中設定明確的值,系統就會覆寫環境變數。
準備目錄
每個 Terraform 設定檔都必須有自己的目錄 (也稱為根模組)。
-
在 Cloud Shell 中建立目錄,並在該目錄中建立新檔案。檔案名稱必須包含
.tf
副檔名,例如main.tf
。在本教學課程中,檔案稱為main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您正在參考教學課程,可以複製各個章節或步驟中的程式碼範例。
將範例程式碼複製到新建立的
main.tf
中。您可以視需要從 GitHub 複製程式碼。如果 Terraform 程式碼片段是端對端解決方案的一部分,建議您採用這種做法。
- 查看並修改要套用至環境的範例參數。
- 儲存變更。
-
初始化 Terraform。這項操作只需對每個目錄執行一次。
terraform init
如要使用最新版的 Google 供應器,請視需要加入
-upgrade
選項:terraform init -upgrade
套用變更
-
檢查設定,並確認 Terraform 要建立或更新的資源是否符合您的預期:
terraform plan
視需要修正設定。
-
執行下列指令,並在提示中輸入
yes
,即可套用 Terraform 設定:terraform apply
等待 Terraform 顯示「Apply complete!」(套用完成) 訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
刪除變更
如要刪除變更,請按照下列步驟操作:
- 如要停用防刪除功能,請在 Terraform 設定檔中將
deletion_protection
引數設為false
。deletion_protection = "false"
- 執行下列指令,並在提示中輸入
yes
,即可套用更新的 Terraform 設定:terraform apply
-
如要移除先前透過 Terraform 設定套用的資源,請執行下列指令,並在提示中輸入
yes
:terraform destroy
REST v1
-
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:專案 ID
- SSL_ENFORCEMENT_MODE:請使用下列其中一個選項:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
:允許非 SSL/非 TLS 和 SSL/TLS 連線。對於 SSL 連線,系統不會驗證用戶端憑證。這是預設值。ENCRYPTED_ONLY
:只允許使用 SSL/TLS 加密的連線。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
:只允許使用 SSL/TLS 加密的連線,且具備有效的用戶端憑證。如果用戶端或使用者使用 IAM 資料庫驗證連線,則必須使用 Cloud SQL Auth Proxy 或 Cloud SQL 連接器來強制執行用戶端身分驗證。
- INSTANCE_ID:執行個體 ID
HTTP 方法和網址:
PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID
JSON 要求主體:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
REST v1beta4
-
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:專案 ID
- SSL_ENFORCEMENT_MODE:請使用下列其中一個選項:
ALLOW_UNENCRYPTED_AND_ENCRYPTED
:允許非 SSL/非 TLS 和 SSL/TLS 連線。對於 SSL 連線,系統不會驗證用戶端憑證。這是預設值。ENCRYPTED_ONLY
:只允許使用 SSL/TLS 加密的連線。TRUSTED_CLIENT_CERTIFICATE_REQUIRED
:只允許使用 SSL/TLS 加密的連線,且具備有效的用戶端憑證。如果用戶端或使用者使用 IAM 資料庫驗證連線,則必須使用 Cloud SQL Auth Proxy 或 Cloud SQL 連接器來強制執行用戶端身分驗證。
- INSTANCE_ID:執行個體 ID
HTTP 方法和網址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
JSON 要求主體:
{ "settings": { "ipConfiguration": {"sslMode": "SSL_ENFORCEMENT_MODE"} } }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
伺服器憑證
Cloud SQL 會在您建立執行個體時自動建立伺服器憑證。只要伺服器憑證有效,您就不需要主動管理伺服器憑證。Cloud SQL 提供三種不同的憑證授權單位 (CA) 階層供您選擇。您選取的 CA 階層會成為執行個體的伺服器 CA 模式。如果您將每個執行個體 CA 用於執行個體的伺服器 CA 模式,則伺服器憑證的到期日為 10 年。如果您使用共用 CA 或客戶管理 CA 做為執行個體的伺服器 CA 模式,則伺服器憑證的到期日為 1 年*。到期日過後,伺服器憑證就會失效,用戶端就無法再使用該憑證建立與執行個體的安全連線。如果用戶端已設定為驗證 CA 或伺服器憑證中的主機名稱,則該用戶端連線至 Cloud SQL 執行個體時,如果伺服器憑證已過期,連線就會失敗。為避免用戶端連線中斷,請在憑證到期前輪替伺服器憑證。系統會定期通知您伺服器憑證即將到期。系統會在到期日的 90、30、10、2 和 1 天前傳送通知。
* 如果您為客戶管理的 CA 選取較短的有效期限,伺服器憑證的到期日可能會少於 1 年。
列出及建立伺服器憑證
如要在 Google Cloud 控制台中查看伺服器憑證的詳細資料,請前往「連線」頁面,然後按一下「安全性」分頁標籤。
在證照表格中,您可以看到下列詳細資料:
- 憑證狀態:即將發布、有效或舊版
- 即將到期:憑證可供使用,但尚未啟用。如要讓憑證生效,請使用旋轉程序。
- 有效:憑證正在使用中。
- 舊版:憑證已不再使用。 如要讓憑證生效,請使用回溯程序。
- Created:憑證建立的日期和時間
- 到期日:憑證到期日的日期和時間
您可以在有效憑證到期前,手動建立新的憑證。
控制台
如果是使用自行簽署的伺服器憑證 (個別例項 CA) 的例項:
-
前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 SQL 導覽選單中的「連結」。
- 選取「安全性」分頁標籤。
- 前往「管理伺服器 CA 憑證」部分。
- 按一下「管理憑證」展開。
- 按一下「建立新的 CA 憑證」。
新的伺服器 CA 憑證會顯示在「即將推出」的空格中。如果您想立即輪替至新的伺服器 CA 憑證,請更新用戶端並完成輪替作業,以便繼續輪替伺服器 CA 憑證。
如果是使用共用 CA 核發的伺服器憑證的例項:
-
前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 SQL 導覽選單中的「連結」。
- 選取「安全性」分頁標籤。
- 前往「管理伺服器憑證」部分。
- 按一下「管理憑證」展開。
- 按一下「建立伺服器憑證」。
新的伺服器憑證會顯示在「即將到期」的空格中。如果您想立即使用新的伺服器憑證,請更新用戶端並完成伺服器憑證輪替。
gcloud
如果是使用自行簽署的伺服器憑證 (個別例項 CA) 的例項:
- 如要取得伺服器憑證的相關資訊,請使用 sql ssl server-ca-certs list 指令:
gcloud sql ssl server-ca-certs list \ --instance=INSTANCE_NAME
- 如要建立伺服器憑證,請使用 sql ssl server-ca-certs create 指令:
gcloud sql ssl server-ca-certs create \ --instance=INSTANCE_NAME
- 將憑證資訊下載至本機 PEM 檔案:
gcloud sql ssl server-ca-certs list \ --format="value(cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- 將下載的檔案複製到用戶端主機,取代現有的
server-ca.pem
檔案,藉此更新所有用戶端以使用新資訊。
如果是使用共用 CA 核發的伺服器憑證的例項:
- 如要取得伺服器憑證的相關資訊,請使用 sql ssl server-certs list 指令:
gcloud sql ssl server-certs list \ --instance=INSTANCE_NAME
- 如要建立伺服器憑證,請使用 sql ssl server-certs create 指令:
gcloud sql ssl server-certs create \ --instance=INSTANCE_NAME
- 將憑證資訊下載至本機 PEM 檔案:
gcloud sql ssl server-certs list \ --format="value(ca_cert.cert)" \ --instance=INSTANCE_NAME > \ FILE_PATH/FILE_NAME.pem
- 將下載的檔案複製到用戶端主機,取代現有的
server-ca.pem
檔案,藉此更新所有用戶端以使用新資訊。
Terraform
如要將伺服器憑證資訊做為輸出內容,請使用 Terraform 資料來源:
- 在 Terraform 設定檔中新增下列內容:
data "google_sql_ca_certs" "ca_certs" { instance = google_sql_database_instance.default.name } locals { furthest_expiration_time = reverse(sort([for k, v in data.google_sql_ca_certs.ca_certs.certs : v.expiration_time]))[0] latest_ca_cert = [for v in data.google_sql_ca_certs.ca_certs.certs : v.cert if v.expiration_time == local.furthest_expiration_time] } output "db_latest_ca_cert" { description = "Latest CA certificate used by the primary database server" value = local.latest_ca_cert sensitive = true }
- 如要建立
server-ca.pem
檔案,請執行下列指令:terraform output db_latest_ca_cert > server-ca.pem
用戶端憑證
建立新的用戶端憑證
您最多可以為每個執行個體建立 10 個用戶端憑證。如要建立用戶端憑證,您必須具備 Cloud SQL Admin
IAM 角色。
以下是關於用戶端憑證的幾點重要注意事項:
- 如果您遺失憑證的私密金鑰,則必須建立新的金鑰,因為私密金鑰無法復原。
- 根據預設,用戶端憑證的有效期限為 10 年。
- 用戶端憑證即將到期時,系統不會通知您。
- 您必須在 Cloud SQL 執行個體處於執行狀態時,才能建立安全資料傳輸層 (SSL) 憑證。
主控台
-
前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。
- 如要開啟執行個體的「總覽」頁面,請按一下執行個體名稱。
- 按一下 SQL 導覽選單中的「連結」。
- 選取「安全性」分頁標籤。
- 按一下「建立用戶端憑證」。
- 在「Create a client certificate」對話方塊中,新增專屬名稱。
- 按一下 [建立]。
- 在「New SSL certificate created」對話方塊的第一個區段中,按一下「Download client-key.pem」,將私密金鑰下載到名為
client-key.pem
的檔案中。 - 按一下第二個區段中的「Download client-cert.pem」(下載 client-cert.pem),將用戶端憑證下載到名為
client-cert.pem
的檔案中。 - 按一下第三個區段中的「Download server-ca.pem」(下載 server-ca.pem),將伺服器憑證下載到名為
server-ca.pem
的檔案中。 - 按一下「關閉」。
gcloud
使用
ssl client-certs create
指令建立用戶端憑證:gcloud sql ssl client-certs create CERT_NAME client-key.pem \ --instance=INSTANCE_NAME
擷取您剛建立的憑證公開金鑰,然後使用
ssl client-certs describe
指令將其複製到client-cert.pem
檔案中:gcloud sql ssl client-certs describe CERT_NAME \ --instance=INSTANCE_NAME \ --format="value(cert)" > client-cert.pem
使用
instances describe
指令,將伺服器憑證複製到server-ca.pem
檔案中:gcloud sql instances describe INSTANCE_NAME \ --format="value(serverCaCert.cert)" > server-ca.pem
Terraform
如要建立用戶端憑證,請使用 Terraform 資源:
REST v1
建立 SSL/TLS 憑證,為它提供對此執行個體唯一的名稱:
使用任何要求資料之前,請先替換以下項目:
- project-id:專案 ID
- instance-id:執行個體 ID
- client-cert-name:用戶端憑證名稱
HTTP 方法和網址:
POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/sslCerts
JSON 要求主體:
{ "commonName" : "client-cert-name" }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
-
複製回應中引號內的所有憑證內容 (但不包含引號本身) 到本機檔案中,如下所示:
- 將
serverCaCert.cert
複製到server-ca.pem
。 - 將
clientCert.cert
複製到client-cert.pem
。 - 將
certPrivateKey
複製到client-key.pem
。
- 將
REST v1beta4
建立 SSL/TLS 憑證,為它提供對此執行個體唯一的名稱:
使用任何要求資料之前,請先替換以下項目:
- project-id:專案 ID
- instance-id:執行個體 ID
- client-cert-name:用戶端憑證名稱
HTTP 方法和網址:
POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/sslCerts
JSON 要求主體:
{ "commonName" : "client-cert-name" }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
-
複製回應中引號內的所有憑證內容 (但不包含引號本身) 到本機檔案中,如下所示:
- 將
serverCaCert.cert
複製到server-ca.pem
。 - 將
clientCert.cert
複製到client-cert.pem
。 - 將
certPrivateKey
複製到client-key.pem
。
- 將
這時候,您已有:
- 另存為
server-ca.pem
的伺服器憑證。 - 另存為
client-cert.pem
的用戶端公用金鑰憑證。 - 另存為
client-key.pem
的用戶端私密金鑰。
sslrootcert
、sslcert
和 sslkey
參數值。如需使用 psql 用戶端和 SSL/TLS 連線的範例,請參閱「使用 psql 用戶端連線」。伺服器身分驗證
伺服器身分驗證功能取決於 Cloud SQL 執行個體的憑證授權單位 (CA) 階層設定。
對於使用個別執行個體 CA 的執行個體,驗證 CA 也會驗證伺服器身分,因為每個執行個體都有專屬的 CA。對於使用共用 CA 的執行個體,由於伺服器 CA 會在各個執行個體之間共用,因此必須驗證主機名稱,才能驗證伺服器身分。
如果您有個別執行個體 CA,則只能針對已設定 Private Service Connect 的執行個體,執行 DNS 名稱為基礎的伺服器身分驗證。如果您有共用 CA,就可以為所有類型的執行個體執行 DNS 名稱為準的伺服器身分驗證,包括 Private Service Connect、私人服務存取權和公用 IP 執行個體。
如果您使用的是客戶管理的 CA,則可以驗證 CA 信任鏈結,並針對任何類型的執行個體執行 DNS 名稱伺服器身分驗證,這些執行個體會將 serverCAmode
設為客戶管理的 CA。
為執行個體選取客戶管理的 CA 選項時,您可以在伺服器憑證的 SAN 欄位中插入自訂 DNS 名稱。詳情請參閱「編輯自訂 SAN 欄位」。
您可以查看 Cloud SQL 執行個體的詳細資料,瞭解為該執行個體設定了哪個 CA 階層。詳情請參閱「查看執行個體資訊」。
啟用伺服器身分驗證
如果您選取共用 CA 做為 Cloud SQL 執行個體的伺服器 CA 模式,或是使用自訂 SAN 值設定自訂 DNS 名稱,建議您也啟用伺服器身分驗證。
以共用 CA 做為伺服器 CA 模式的執行個體,會在伺服器憑證的主體別名 (SAN) 欄位中包含執行個體 DNS 名稱。您可以使用執行個體查詢 API,並將回應做為伺服器身分驗證的主機名稱,藉此取得此 DNS 名稱。您必須為 DNS 名稱設定 DNS 解析。
如要為使用共用 CA 的執行個體啟用伺服器身分驗證功能,請完成下列步驟:
擷取 DNS 名稱。
如要查看 Cloud SQL 執行個體的摘要資訊 (包括執行個體的 DNS 名稱),請使用
gcloud sql instances describe
指令:gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
請將以下項目改為對應的值:
- INSTANCE_NAME:Cloud SQL 執行個體的名稱
- PROJECT_ID:包含執行個體的 Google Cloud 專案 ID 或專案編號
在回應中找出
dnsNames:
欄位。這個欄位可傳回多個 DNS 名稱,格式如下:網路設定 DNS 名稱格式 名稱層級 Private Service Connect 或 公開 IP 位址 INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.
示例:
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.
執行個體 私人服務存取權 INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql-psa.goog。
示例:
1a23b4cd5e67.1a2b345c6d27.us-central1.sql-psa.goog.
執行個體
在 DNS 區域中建立 DNS 記錄。如果您要進行私人連線,請在對應的虛擬私有雲 (VPC) 網路中的私人 DNS 區域中建立 DNS 記錄。
連線至 PostgreSQL 適用的 Cloud SQL 執行個體時,請將 DNS 名稱設為主機名稱。然後在用戶端中啟用伺服器身分驗證。
舉例來說,使用
psql
用戶端時,請指定sslmode=verify-full
標記。其他 PostgreSQL 用戶端驅動程式也有類似的設定旗標。
後續步驟
- 管理 Cloud SQL 執行個體的 SSL/TLS 憑證。
- 進一步瞭解 Google Cloud中加密功能的處理方式。
- 使用 SSL/TLS 憑證連線至 Cloud SQL 執行個體。
- 進一步瞭解 PostgreSQL 如何使用 SSL/TLS 憑證。