Private Service Connect – korzystanie z ustawień usługi HTTP(S) konsumenta dla regionalnych interfejsów API Google

1. Wprowadzenie

Private Service Connect pozwala tworzyć prywatne punkty końcowe przy użyciu globalnych wewnętrznych adresów IP w sieci VPC, aby uzyskiwać dostęp do interfejsów API Google. Zgodnie z tą koncepcją możesz teraz utworzyć punkt końcowy Private Service Connect z ustawieniami usługi HTTP(S) konsumenta za pomocą wewnętrznego systemu równoważenia obciążenia HTTP(S). Dzięki temu uzyskasz dostęp do tych funkcji:

  • Możesz wybrać, które usługi są dostępne, za pomocą mapy URL. filtrowanie według ścieżki pozwala na bardziej szczegółową kontrolę.
  • Możesz zmieniać nazwy usług i mapować je na wybrane adresy URL.
  • Możesz używać certyfikatów TLS zarządzanych przez klienta.
  • Możesz włączyć przechowywanie danych podczas przesyłania, łącząc się z regionalnymi punktami końcowymi dla interfejsów API Google z zadań w tym samym regionie.

Te nazwy i adresy IP są wewnętrzne w Twojej sieci VPC i we wszystkich sieciach lokalnych połączonych z nią przy użyciu tuneli Cloud VPN lub przyłączy Cloud Interconnect (VLAN).

Czego się nauczysz

  • Tworzenie punktu końcowego Private Service Connect z ustawieniami usługi klienta HTTP(S)
  • Utwórz pęk kluczy i klucz usługi Cloud Key Management Service (KMS).
  • Tworzę strefę prywatną zarządzaną w Cloud DNS i rekord A.
  • Uzyskaj dostęp do interfejsu KMS API (zarówno regionalnego, jak i globalnego) obsługiwanego przez publiczny interfejs API.
  • Uzyskaj dostęp do interfejsu KMS API (regionalnego i globalnego) z poziomu punktu końcowego PSC.

Czego potrzebujesz

  • Wiedza na temat wdrażania instancji i konfigurowania komponentów sieci

2. Środowisko testowe

Zostanie utworzona sieć VPC klienta z 1 podsiecią w regionie us-central1 na potrzeby hostowania maszyny wirtualnej, regułą przekierowania wewnętrznego systemu równoważenia obciążenia HTTP(S) i 1 podsiecią tylko z serwerem proxy na potrzeby wewnętrznego systemu równoważenia obciążenia HTTP(S). Zaczniemy od utworzenia pęku kluczy i klucza w systemie zarządzania kluczami (KMS), a następnie przejdziemy do publicznego punktu końcowego interfejsu API. Następnie utworzymy punkt końcowy PSC, który trafi do regionalnego punktu końcowego KMS w regionie us-central1.

13681df518662ba.png

3. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google i w każdej chwili możesz go zaktualizować.
  • Identyfikator projektu musi być unikalny we wszystkich projektach Google Cloud i nie można go zmienić (nie można go zmienić po ustawieniu). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń w Codelabs musisz odwoływać się do identyfikatora projektu (który zwykle nazywa się PROJECT_ID), więc jeśli Ci się nie podoba, wygeneruj kolejny losowy projekt lub wypróbuj swój własny identyfikator i sprawdź, czy jest dostępny. Potem urządzenie jest „zawieszone”. po utworzeniu projektu.
  • Występuje trzecia wartość – numer projektu – używany przez niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów i interfejsów API Cloud. Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, wykonaj czynności „wyczyść” znajdziesz na końcu tego ćwiczenia. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Uruchamianie Cloud Shell

Google Cloud można obsługiwać zdalnie z laptopa, ale w ramach tego ćwiczenia z programowania wykorzystasz Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

W konsoli Google Cloud kliknij ikonę Cloud Shell na górnym pasku narzędzi:

55efc1aaa7a4d3ad.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil. Po zakończeniu powinno pojawić się coś takiego:

7ffe5cbb04455448.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, znacząco zwiększając wydajność sieci i uwierzytelnianie. Wszystkie zadania w tym module możesz wykonać w przeglądarce.

4. Zanim zaczniesz

Włącz interfejsy API

Sprawdź w Cloud Shell, czy identyfikator projektu jest skonfigurowany

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

Włącz wszystkie niezbędne usługi

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. Tworzenie sieci VPC, podsieci i reguł zapory sieciowej

Sieć VPC

Z Cloud Shell

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

Utwórz podsieci

Z 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

W tym module utworzysz wewnętrzny regionalny system równoważenia obciążenia L7, który będzie wskazywać regionalne backendy interfejsu API. Wewnętrzny system równoważenia obciążenia Google L7 to system równoważenia obciążenia serwera proxy, dlatego musisz utworzyć podsieć serwera proxy, która będzie dedykowana systemowi równoważenia obciążenia, aby obsługiwał serwer proxy. Więcej informacji o podsieci tylko-proxy znajdziesz tutaj.

Z 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

Tworzenie reguł zapory sieciowej

W tym module do łączenia się z utworzonymi przez Ciebie instancjami będziesz używać IAP. Poniższa reguła zapory sieciowej pozwoli Ci łączyć się z instancjami przez IAP. Jeśli nie chcesz używać IAP, możesz pominąć ten krok i zamiast tego dodać publiczne adresy IP w instancji oraz utworzyć regułę zapory sieciowej, która zezwala na ruch przychodzący na porcie TCP 22 od 0.0.0.0/0.

Aby umożliwić IAP nawiązywanie połączeń z maszynami wirtualnymi, utwórz regułę zapory sieciowej, która:

  • Dotyczy wszystkich instancji maszyn wirtualnych, które mają być dostępne za pomocą IAP.
  • Zezwala na ruch przychodzący z zakresu adresów IP 35.235.240.0/20. Ten zakres zawiera wszystkie adresy IP używane przez IAP do przekierowywania TCP.

Z Cloud Shell

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

Utwórz instancję Cloud NAT

Aby pobrać dystrybucje pakietów Linuksa, musisz utworzyć Cloud NAT.

Tworzenie routera Cloud Router

Z Cloud Shell

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

Tworzenie Cloud NAT

Z 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. Utwórz pęk kluczy i klucz zarządzania kluczami

Z Cloud Shell

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

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

Z 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

W Cloud Shell sprawdź, czy pęk kluczy i klucz zostały utworzone w regionie us-central1.

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

OCZEKIWANY WYNIK

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

Z Cloud Shell

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

OCZEKIWANY WYNIK

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

Zanotuj pełne nazwy ścieżek podane dla kluczy, ponieważ będziesz ich później używać do łączenia się z tymi kluczami.

7. Utwórz maszynę wirtualną klienta i połącz się z regionalnym punktem końcowym KMS

Następnie utworzysz kliencką maszynę wirtualną, połączysz się z nią przez SSH i przetestujesz rozdzielczość regionalnego punktu końcowego interfejsu KMS API us-central1.

Z 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'

Następnie musisz zaktualizować domyślne konto usługi Compute, aby uzyskać dostęp do utworzonego klucza KMS. Domyślne konto usługi Compute będzie w formacie <numer_projektu> -compute@developer.gserviceaccount.com. Aby uzyskać numer projektu, uruchom w Cloud Shell to polecenie i skopiuj liczbę z ostatniego wiersza zwróconych wyników.

 gcloud projects describe $project

Zaktualizuj domyślne konto usługi Compute, aby uzyskać dostęp do utworzonego klucza KMS.

Z 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

Utwórz dodatkowy terminal Cloud Shell, klikając + (zrzut ekranu poniżej)

a36edc967333315a.png

Na karcie 2 przeprowadź tunelowanie przez IAP, aby nawiązać połączenie SSH z instancją client-vm. Pamiętaj, że zmienne środowiskowe nie zostaną przeniesione i musisz dodać do poniższego polecenia swój identyfikator projektu.

Z Cloud Shell

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

Połącz się z punktem końcowym interfejsu KMS regionalnego interfejsu API przy użyciu zanotowanej wcześniej nazwy klucza KMS.

Z karty 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

OCZEKIWANY WYNIK

{
  "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"
}

Z karty 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

OCZEKIWANY WYNIK

{
  "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"}

Sprawdź, gdzie DNS identyfikuje punkt końcowy KMS us-central w porównaniu z globalnym punktem końcowym.

Z karty 2, client-vm

dig us-central1-cloudkms.googleapis.com

OCZEKIWANY WYNIK

; <<>> 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

Z karty 2, client-vm

dig cloudkms.googleapis.com

OCZEKIWANY WYNIK

; <<>> 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

Z wyników kopiowania widać, że rozpoznawanie nazw DNS regionalnego punktu końcowego KMS us-central1 i globalnego punktu końcowego KMS wskazuje zewnętrzny adres IP. Uwaga: wyświetlany adres IP może być innym zewnętrznym adresem IP. To normalne zjawisko interfejsów API Google).

W następnej sekcji wróć do pierwszej karty w Cloud Shell.

8. Utwórz punkt końcowy Private Service Connect

Utworzysz wewnętrzny system równoważenia obciążenia HTTP(S) z grupą punktów końcowych sieci wskazującą regionalny punkt końcowy KMS jako us-central1 jako usługę backendu. Reguła przekierowania systemu równoważenia obciążenia działa jako punkt końcowy Private Service Connect.

Utwórz grupę punktów końcowych sieci (NEG) typu Privet Service Connect i usługę docelową us-central1-cloudkms.googleapis.com.

Z 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

Utwórz usługę backendu dla systemu równoważenia obciążenia.

Z Cloud Shell

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

Dodaj grupę punktów końcowych sieci do usługi backendu.

Z Cloud Shell

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

Utwórz mapę URL systemu równoważenia obciążenia.

Z Cloud Shell

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

Utwórz dopasowanie ścieżki dla niestandardowego adresu URL, którego będzie używać punkt końcowy.

Z Cloud Shell

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

Utwórz regułę hosta dla niestandardowego adresu URL us-central1-cloudkms.example.com.

Z 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

Utwórz docelowe serwery proxy dla systemu równoważenia obciążenia. W przypadku użycia w środowisku produkcyjnym zaleca się użycie certyfikatów HTTP(S) i certyfikatów niestandardowych dla hosta skonfigurowanego w ostatnim poleceniu.

Z Cloud Shell

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

Utwórz regułę przekierowania dla systemu równoważenia obciążenia, który będzie działać jako punkt końcowy usługi Private Service Connect.

Z 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. Konfiguracja DNS

W tej sekcji utworzysz prywatną strefę DNS dla domeny example.com oraz rekord A wskazujący regułę przekierowania, którą utworzyliśmy w ostatnim kroku.

Utworzenie prywatnej strefy zarządzanej DNS.

Z Cloud Shell

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

Utwórz rekord A dla us-central1-cloudkms.example.com.

Z 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. Połącz się z regionalnym punktem końcowym KMS przez PSC

Wróć do instancji client-vm na karcie 2, aby uruchomić narzędzie tcpdump i wyświetlić wszystkie szczegóły połączenia oraz przetestować połączenia z regionalnymi i globalnymi punktami końcowymi przez punkt końcowy PSC.

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

Otwórz trzecią kartę w Cloud Shell i połączenie SSH z instancją 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

OCZEKIWANY WYNIK + 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

Wróć na kartę 2 w oknie karty i sprawdź informacje dotyczące tcpdump. Zobaczysz, że można uzyskać dostęp do regionalnego punktu końcowego Cloud KMS przez utworzony przez siebie punkt końcowy PSC i że regionalny punkt końcowy us-central1 jest dostępny prywatnie do utworzonej przez Ciebie strefy zarządzanej Cloud DNS.

Na karcie 3 klient-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

OCZEKIWANY WYNIK + 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

Próba uzyskania dostępu do globalnego klucza/pęku kluczy Cloud KMS spowoduje błąd. Informacje o próbach nawiązania połączenia znajdziesz również w tcpdump.

Na karcie 3 klient-vm

dig us-central1-cloudkms.example.com

OCZEKIWANY WYNIK

; <<>> 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

Dzięki temu możesz zauważyć, że niestandardowy URL, który utworzyliśmy dla us-central1-cloudkms.googleapis.com, wskazuje teraz punkt końcowy PSC i weryfikuje tylko zasoby utworzone w tym regionie.

Możesz teraz zamknąć obie karty SSH w maszynie klienckiej.

11. Procedura czyszczenia

Usuń komponenty modułu z jednego terminala 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. Gratulacje!

Gratulujemy ukończenia ćwiczeń z programowania.

Omówione zagadnienia

  • Tworzenie punktu końcowego Private Service Connect z ustawieniami usługi HTTP(S) konsumenta
  • Tworzę pęk kluczy i klucz usługi Cloud Key Management Service (KMS).
  • Tworzę strefę prywatną zarządzaną w Cloud DNS i rekord A.
  • Dostęp do interfejsu KMS API (zarówno regionalnego, jak i globalnego) odbył się za pomocą publicznego interfejsu API.
  • Dostęp do interfejsu KMS API (regionalnego i globalnego) z punktu końcowego PSC.