Private Service Connect - 針對區域 Google API 使用消費者 HTTP(S) Service Controls

1. 簡介

有了 Private Service Connect,您就能透過虛擬私有雲網路中的全域內部 IP 位址,建立私人端點來存取 Google API。根據這個概念,您現在可以透過內部 HTTP(S) 負載平衡器,建立含有用戶端 HTTP(S) 服務控制項的 Private Service Connect 端點。取得以下功能:

  • 您可利用網址對應來選擇可用的服務。您可以按照路徑進行篩選,進行更精細的檢查。
  • 您可以重新命名服務,並將其對應至您選擇的網址。
  • 可以使用客戶自行管理的 TLS 憑證。
  • 您可以從相同區域的工作負載連線至 Google API 的區域端點,啟用傳輸中的資料落地機制。

這些名稱和 IP 位址屬於您的虛擬私有雲網路內部,以及透過 Cloud VPN 通道或 Cloud Interconnect 連結 (VLAN) 連線的任何地端部署網路。

課程內容

  • 使用 Consumer HTTP(S) Service Controls 建立 Private Service Connect 端點
  • 建立 Cloud Key Management Service (KMS) 金鑰環和金鑰。
  • 建立 Cloud DNS 代管私人區域和 A 記錄。
  • 存取已針對公用 API 解析的 KMS API (區域性和全域性)。
  • 透過 PSC 端點存取 KMS API (區域和全域)。

軟硬體需求

  • 具備部署執行個體與設定網路元件的知識

2. 測試環境

系統會建立用戶端虛擬私有雲,其中含有 us-central1 區域中的一個用於託管 VM 的子網路,另一個用於託管 VM 的 HTTP(S) 內部負載平衡器轉送規則,另一個則是用於與 HTTP(S) 內部負載平衡器搭配使用的 Proxy 專屬子網路。我們會先在金鑰管理系統 (KMS) 中建立金鑰環和金鑰,並解析公用 API 端點。接著,我們會建立 PSC 端點,以解析位於 us-central1 的區域 KMS 端點。

13681df518662ba.png

3. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為 PROJECT_ID),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後
  • 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。這個研究室中的所有工作都可以透過瀏覽器完成。

4. 事前準備

啟用 API

在 Cloud Shell 中,確認您已設定專案 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
export zone=us-central1-a
echo $project
echo $region
echo $zone

啟用所有必要服務

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable cloudkms.googleapis.com

5. 建立虛擬私有雲網路、子網路和防火牆規則

虛擬私有雲網路

透過 Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

建立子網路

透過 Cloud Shell

gcloud compute networks subnets create consumer-subnet-1 \
--network consumer-vpc \
--range 10.0.0.0/24 \
--region $region \
--enable-private-ip-google-access

在本研究室中,您將建立指向區域 API 後端的內部 L7 區域性負載平衡器。Google 內部 L7 負載平衡器是 Proxy 負載平衡器,因此您需要建立負載平衡器專用的 Proxy 子網路才能執行 Proxy。如要進一步瞭解僅限 Proxy 的子網路,請按這裡

透過 Cloud Shell

gcloud compute networks subnets create proxy-subnet1 \
--purpose=INTERNAL_HTTPS_LOAD_BALANCER \
--role=ACTIVE \
--network consumer-vpc \
--range 10.100.100.0/24 \
--region $region

建立防火牆規則

在本研究室中,您將使用 IAP 連線至您建立的執行個體。下列防火牆規則可讓您透過 IAP 連線至執行個體。如果您不想使用 IAP,可以略過這個步驟,改為在執行個體中新增公開 IP 位址,並建立防火牆規則,允許從 0.0.0.0/0 的 TCP 通訊埠 22 輸入。

如要允許 IAP 連線至您的 VM 執行個體,請建立下列防火牆規則:

  • 適用於您要透過 IAP 存取的所有 VM 執行個體。
  • 允許來自 IP 範圍 35.235.240.0/20 的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。

透過 Cloud Shell

gcloud compute firewall-rules create allow-ssh-iap \
    --network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

建立 Cloud NAT 執行個體

必須建立 Cloud NAT,才能下載 Linux 套件發行版。

建立 Cloud Router

透過 Cloud Shell

gcloud compute routers create crnat \
    --network consumer-vpc \
    --region $region

建立 Cloud NAT

透過 Cloud Shell

gcloud compute routers nats create central-nat \
    --router=crnat \
    --auto-allocate-nat-external-ips \
    --nat-all-subnet-ip-ranges \
    --enable-logging \
    --region $region

6. 建立金鑰管理金鑰環和金鑰

透過 Cloud Shell

gcloud kms keyrings create central-keyring \
    --location $region

gcloud kms keyrings create global-keyring \
    --location global

透過 Cloud Shell

gcloud kms keys create central-key \
    --location $region \
    --keyring central-keyring \
    --purpose encryption

gcloud kms keys create global-key \
    --location global \
    --keyring global-keyring \
    --purpose encryption

在 Cloud Shell 中,確認已成功在 us-central1 區域建立金鑰環和金鑰。

gcloud kms keys list \
    --location $region \
    --keyring central-keyring

預期結果

NAME: projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

透過 Cloud Shell

gcloud kms keys list \
    --location global \
    --keyring global-keyring

預期結果

NAME: projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

記下為金鑰提供的「完整路徑」名稱,因為稍後連線時會用到這個名稱。

7. 建立用戶端 VM 並連線至 KMS 區域端點

接下來,請建立用戶端 VM、透過 SSH 登入 VM,並測試 us-central1 區域 KMS API 端點的解析度。

透過 Cloud Shell

gcloud compute instances create client-vm \
    --network=consumer-vpc \
    --subnet=consumer-subnet-1 \
    --zone=$zone \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install dnsutils -y
    sudo apt-get install tcpdump -y'

接下來,您必須更新預設 Compute 服務帳戶,才能存取您建立的 KMS 金鑰。預設運算服務帳戶的格式為 <Project_Number>-compute@developer.gserviceaccount.com.如要取得專案編號,請透過 Cloud Shell 執行下列指令,然後複製傳回結果最後一行的數字。

 gcloud projects describe $project

請更新預設的 Compute 服務帳戶,以便存取您建立的 KMS 金鑰。

透過 Cloud Shell

 gcloud kms keys add-iam-policy-binding central-key \
    --location $region \
    --keyring central-keyring \
    --member serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin


gcloud kms keys add-iam-policy-binding global-key \
    --location global \
    --keyring global-keyring \
    --member serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin

按一下「+」(螢幕截圖如下) ,建立其他 Cloud Shell 終端機

a36edc967333315a.png

在分頁 2 中,透過通道透過 SSH 進入 client-vm。請注意,環境變數不會攜帶,您必須在下列指令中新增專案 ID。

透過 Cloud Shell

gcloud beta compute ssh --zone us-central1-a "client-vm" \
--tunnel-through-iap \
--project <PROJECT_ID>

使用您先前記下的 KMS 金鑰名稱連線至 KMS Regional API 端點。

從分頁 2,client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:us-central1-cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

預期結果

{
  "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

從分頁 2,client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

預期結果

{
  "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-22T19:19:43.271238847Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-22T19:19:43.271238847Z"
  },  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-22T19:19:43.271238847Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"}

查看與全球端點相比,DNS 解析 us-central KMS 端點的位置。

從 Tab2、client-vm

dig us-central1-cloudkms.googleapis.com

預期結果

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> us-central1-cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4383
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.googleapis.com. IN        A

;; ANSWER SECTION:
us-central1-cloudkms.googleapis.com. 300 IN A   142.250.125.95

;; Query time: 4 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Fri Nov 12 20:40:05 UTC 2021
;; MSG SIZE  rcvd: 80

從分頁 2,client-vm

dig cloudkms.googleapis.com

預期結果

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49528
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cloudkms.googleapis.com.       IN      A

;; ANSWER SECTION:
cloudkms.googleapis.com. 300    IN      A       209.85.200.95

;; Query time: 8 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon Nov 22 15:26:17 UTC 2021
;; MSG SIZE  rcvd: 68

從摘要結果中,我們可以看到 us-central1 區域 KMS 端點和全域 KMS 端點的 DNS 解析為外部 IP 位址。(注意:您看到的 IP 位址可能是不同的外部 IP 位址。這是正常的 Google API 行為)。

在下一節中,切換回 Cloud Shell 的第一個分頁。

8. 建立 Private Service Connect 端點

您會建立內部 HTTP(S) 負載平衡器,當中的網路端點群組會指向做為後端服務的 us-central1 區域性 KMS 端點。負載平衡器的轉送規則會以 Private Service Connect 端點的形式運作。

建立採用 Privet Service Connect 類型和目標服務 us-central1-cloudkms.googleapis.com 的網路端點群組 (NEG)。

透過 Cloud Shell

gcloud beta compute network-endpoint-groups create l7psc-kms-neg \
  --network-endpoint-type=private-service-connect \
  --psc-target-service=us-central1-cloudkms.googleapis.com \
  --region=$region

為負載平衡器建立後端服務。

透過 Cloud Shell

gcloud compute backend-services create l7-psc-kms \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --region=$region

將 NEG 新增至後端服務。

透過 Cloud Shell

gcloud beta compute backend-services add-backend l7-psc-kms \
  --network-endpoint-group=l7psc-kms-neg \
  --region=$region

建立負載平衡器的網址對應。

透過 Cloud Shell

gcloud compute url-maps create l7-psc-url-map \
  --default-service=l7-psc-kms \
  --region=$region

為端點要使用的自訂網址建立路徑比對器。

透過 Cloud Shell

gcloud compute url-maps add-path-matcher l7-psc-url-map \
 --path-matcher-name=example \
 --default-service=l7-psc-kms \
 --region=$region

為自訂網址 us-central1-cloudkms.example.com 建立主機規則。

透過 Cloud Shell

gcloud compute url-maps add-host-rule l7-psc-url-map \
--hosts=us-central1-cloudkms.example.com \
--path-matcher-name=example \
--region=$region

建立負載平衡器的目標 Proxy。在實際工作環境中,針對您在上一個指令中設定的主機,建議使用 HTTP(S) 和自訂憑證。

透過 Cloud Shell

gcloud compute target-http-proxies create psc-http-proxy \
    --url-map=l7-psc-url-map \
    --region=$region

為負載平衡器建立轉送規則,用來做為 Private Service Connect 端點。

透過 Cloud Shell

gcloud beta compute forwarding-rules create l7-psc-forwarding-rule \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=consumer-vpc \
  --subnet=consumer-subnet-1 \
  --address=10.0.0.100 \
  --ports=80 \
  --region=$region \
  --target-http-proxy=psc-http-proxy \
  --target-http-proxy-region=$region

9. DNS 設定

在本節中,您將建立一個私人 DNS 區域 (例如 example.com) 及 A 記錄,指向我們在上一個步驟中建立的轉送規則。

建立代管 DNS 私人區域。

透過 Cloud Shell

gcloud dns managed-zones create example \
    --description="example domain for KMS" \
    --dns-name=example.com \
    --networks=consumer-vpc \
    --visibility=private

為 us-central1-cloudkms.example.com 建立 A 記錄。

透過 Cloud Shell

gcloud dns record-sets transaction start \
   --zone=example

gcloud dns record-sets transaction add 10.0.0.100 \
   --name=us-central1-cloudkms.example.com \
   --ttl=300 \
   --type=A \
   --zone=example

gcloud dns record-sets transaction execute \
   --zone=example

10. 透過 PSC 連線至區域性 KMS 端點

切換回分頁 2 中的 client-vm,執行 tcpdump,查看所有連線詳細資料,並透過 PSC 端點測試與區域性和全域端點的連線。

sudo tcpdump -i any net 10.0.0.100 or port 53 -n

在 Cloud Shell 中開啟第 3 個分頁,並透過 SSH 進入 client-vm。

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

預期結果 + TCPDUMP

{
  "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

---

19:54:42.924923 IP 10.0.0.3.55290 > 169.254.169.254.53: 26132+ A? cloudkms.googleapis.com. (41)
19:54:42.925137 IP 10.0.0.3.55290 > 169.254.169.254.53: 40734+ AAAA? cloudkms.googleapis.com. (41)
19:54:42.931480 IP 169.254.169.254.53 > 10.0.0.3.55290: 26132 1/0/0 A 10.0.0.100 (57)
19:54:42.931781 IP 169.254.169.254.53 > 10.0.0.3.55290: 40734 1/0/0 AAAA 2607:f8b0:4001:c0d::5f (69)
19:54:42.932285 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [S], seq 3382081170, win 65320, options [mss 1420,sackOK,TS val 1907763603 ecr 0,nop,wscale 7], length 0
19:54:42.934951 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [S.], seq 3147938658, ack 3382081171, win 65535, options [mss 1420,sackOK,TS val 3206048204 ecr 1907763603,nop,wscale 8], length 0
19:54:42.934978 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 0
19:54:42.935182 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [P.], seq 1:422, ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 421: HTTP: GET /v1/projects/<PROJECT_ID/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key HTTP/1.1
19:54:42.935614 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [.], ack 422, win 261, options [nop,nop,TS val 3206048205 ecr 1907763606], length 0
19:54:43.010268 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [P.], seq 1:1072, ack 422, win 261, options [nop,nop,TS val 3206048280 ecr 1907763606], length 1071: HTTP: HTTP/1.1 200 OK
19:54:43.010295 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1072, win 503, options [nop,nop,TS val 1907763681 ecr 3206048280], length 0
19:54:43.011545 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [F.], seq 422, ack 1072, win 503, options [nop,nop,TS val 1907763683 ecr 3206048280], length 0
19:54:43.012013 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [F.], seq 1072, ack 423, win 261, options [nop,nop,TS val 3206048282 ecr 1907763683], length 0
19:54:43.012021 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1073, win 503, options [nop,nop,TS val 1907763683 ecr 3206048282], length 0

返回分頁 2 視窗並檢查 tcpdump 資訊。您會發現您可以透過您建立的 PSC 端點存取 Cloud KMS 區域端點,而 us-central1 區域端點會以不公開的方式解析您建立的代管 Cloud DNS 區域。

從分頁 3,client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

預期結果 + TCPDUMP

{
  "error": {
    "code": 404,
    "message": "The request concerns location 'global' but was sent to location 'us-central1'. Either Cloud KMS is not available in 'global' or the request was misrouted. gRPC clients must ensure that 'x-goog-request-params' is specified in request metadata. See https://cloud.google.com/kms/docs/grpc for more information.",
    "status": "NOT_FOUND"
  }
}

---

20:04:32.199247 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [S], seq 2782317346, win 65320, options [mss 1420,sackOK,TS val 1908352831 ecr 0,nop,wscale 7], length 0
20:04:32.201643 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [S.], seq 1927472124, ack 2782317347, win 65535, options [mss 1420,sackOK,TS val 3731555085 ecr 1908352831,nop,wscale 8], length 0
20:04:32.201666 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 0
20:04:32.201812 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [P.], seq 1:415, ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 414: HTTP: GET /v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key HTTP/1.1
20:04:32.202308 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [.], ack 415, win 261, options [nop,nop,TS val 3731555086 ecr 1908352834], length 0
20:04:32.237629 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [P.], seq 1:760, ack 415, win 261, options [nop,nop,TS val 3731555121 ecr 1908352834], length 759: HTTP: HTTP/1.1 404 Not Found
20:04:32.237656 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238283 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [F.], seq 415, ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238833 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [F.], seq 760, ack 416, win 261, options [nop,nop,TS val 3731555122 ecr 1908352870], length 0
20:04:32.238851 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 761, win 506, options [nop,nop,TS val 1908352871 ecr 3731555122], length 0

嘗試存取全域 Cloud KMS 金鑰/金鑰環會導致錯誤。您也會在 tcpdump 中看見這些連線嘗試。

在分頁 3 中,client-vm

dig us-central1-cloudkms.example.com

預期結果

; <<>> DiG 9.11.5-P4-5.1+deb10u7-Debian <<>> us-central1-cloudkms.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27474
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.example.com. IN   A

;; ANSWER SECTION:
us-central1-cloudkms.example.com. 300 IN A      10.0.0.100

;; Query time: 7 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon May 23 16:22:12 UTC 2022
;; MSG SIZE  rcvd: 77

透過摘要,您現在會看見我們為 us-central1-cloudkms.googleapis.com 建立的自訂網址現在指向 PSC 端點,而且只會解析在該區域中建立的資源。

您現在可以關閉傳送至 client-vm 的兩個 SSH 分頁。

11. 清除步驟

從單一 Cloud Shell 終端機刪除研究室元件

gcloud dns record-sets transaction start --zone=example

gcloud dns record-sets transaction remove 10.0.0.100 \
    --name=us-central1-cloudkms.example.com \
    --ttl=300 \
    --type=A \
    --zone=example

gcloud dns record-sets transaction execute --zone=example

gcloud dns managed-zones delete example

gcloud compute forwarding-rules delete l7-psc-forwarding-rule --region=$region --quiet

gcloud compute target-http-proxies delete psc-http-proxy --region=$region --quiet

gcloud compute url-maps delete l7-psc-url-map --region=$region --quiet

gcloud compute backend-services delete l7-psc-kms --region=$region --quiet

gcloud compute network-endpoint-groups delete l7psc-kms-neg --region=$region --quiet

gcloud compute instances delete client-vm --zone=$zone --quiet

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding global-key --keyring=global-keyring --location=global \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding central-key --keyring=central-keyring --location=$region \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

gcloud kms keys versions destroy 1 --location=global --keyring=global-keyring --key=global-key

gcloud kms keys versions destroy 1 --location=$region --keyring=central-keyring --key=central-key

gcloud compute routers nats delete central-nat --router=crnat --region=$region --quiet

gcloud compute routers delete crnat --region=$region --quiet

gcloud compute firewall-rules delete allow-ssh-iap --quiet

gcloud compute networks subnets delete proxy-subnet1 --region=$region --quiet

gcloud compute networks subnets delete consumer-subnet-1 --region=$region --quiet

gcloud compute networks delete consumer-vpc --quiet

12. 恭喜!

恭喜您完成本程式碼研究室。

涵蓋內容

  • 使用消費者 HTTP(S) Service Controls 建立 Private Service Connect 端點
  • 建立 Cloud Key Management Service (KMS) 金鑰環和金鑰。
  • 建立 Cloud DNS 代管私人區域和 A 記錄。
  • 存取 KMS API (區域性和全域性) 會根據公用 API 解析。
  • 透過 PSC 端點存取 KMS API (區域和全域)。