1. Giriş
Private Service Connect, Google Cloud ağının tüketicilerin üretici hizmetlerine erişmesine olanak tanıyan bir özelliğidir. Buna, kullanıcının(genellikle tüketici) VPC'sinde barındırılan özel bir uç nokta üzerinden Google API'lerine bağlanma olanağı da dahildir.
Ayrıca PSC arka uçları, bölgeye özgü Google API'lerini işaretlemek için Google Cloud proxy yük dengeleyicileriyle birlikte kullanılabilir. PSC arka uçları kullanmak, tüketici tarafında daha ayrıntılı kontroller sağlar. Örneğin:
- URL eşlemesi kullanarak hangi Google API hizmetlerinin kullanılabileceğini seçme
- Daha ayrıntılı gözlemlenebilirlik
- Cloud Armor Entegrasyonu
- Özel URL'ler
- Gelişmiş Trafik Yönetimi
Kullanılabilir hizmetlerin listesini ve bölgesel API'lerini burada bulabilirsiniz.
Bu codelab'de, bölgesel Cloud KMS API'yi işaret eden bir PSC arka ucu oluşturacak ve bu API'ye olan bağlantıyı test edeceksiniz.
Neler öğreneceksiniz?
- Cloud Key Management Service (KMS) anahtarlığı ve anahtarı oluşturun.
- Cloud KMS bölgesel API'sini işaret eden bir PSC arka ucu içeren dahili uygulama yük dengeleyicisi oluşturma
- Cloud DNS Yönetilen Özel Bölge ve A Kaydı oluşturma.
- Bölgesel Cloud KMS'ye erişim
Gerekenler
- İdeal olarak "Sahip" veya tam "Düzenleyici" izinlerine sahip bir Google Cloud projesi.
2. Codelab Topolojisi
Bir sanal makine, dahili bölgesel uygulama yük dengeleyici yönlendirme kuralı, PSC arka ucu ve yük dengeleyiciyle birlikte kullanılmak üzere yalnızca proxy alt ağı barındırmak için europe-west9 bölgesinde bir tüketici VPC oluşturulur. Europe-west bölgesinde Cloud Key Management System (KMS)'de bir anahtar zinciri ve anahtar oluşturacağız. Ardından, europe-west9'daki bölgesel KMS API'sine çözüm üretecek yük dengeleyiciyi ve PSC arka ucunu oluştururuz.
3. Kurulum ve Gereksinimler
Kendine ait tempoda ortam oluşturma
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı değildir. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak istiyorsanız oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.
Cloud Shell'i başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir olsa da bu kod laboratuvarında bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Google Cloud Console'da, sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:
Ortam sağlanıp bağlantı kurulabilmesi için birkaç saniye beklemeniz gerekir. İşlem tamamlandığında aşağıdakine benzer bir ekran görürsünüz:
Bu sanal makinede ihtiyaç duyacağınız tüm geliştirme araçları yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Hiçbir şey yüklemeniz gerekmez.
4. Başlamadan önce
API'leri etkinleştir
Cloud Shell'de proje kimliğinizin ayarlandığından emin olun
gcloud config list project gcloud config set project <project-id> export PROJECT_ID=$(gcloud config get-value project) export REGION=europe-west9 export ZONE=europe-west9-a echo $PROJECT_ID echo $REGION echo $ZONE
Gerekli tüm hizmetleri etkinleştirin
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. VPC ağı, alt ağlar ve güvenlik duvarı kuralları oluşturma
VPC Ağı Oluşturma
Cloud Shell'den
# Set environment variables export VPC_NAME="consumer-vpc" export SUBNET_NAME="consumer-subnet-1" # Create VPC network gcloud compute networks create ${VPC_NAME} \ --subnet-mode=custom \ --bgp-routing-mode=regional
Alt ağ oluşturma
Cloud Shell'den
gcloud compute networks subnets create ${SUBNET_NAME} \ --network=${VPC_NAME} \ --region=${REGION} \ --range=10.0.0.0/24 \ --enable-private-ip-google-access
Bu laboratuvarda, bölgesel API arka uçlarına işaret edecek dahili bir L7 bölgesel yük dengeleyici oluşturacaksınız. Bu yük dengeleyici bir proxy yük dengeleyici olduğundan, proxy'yi gerçekleştirmek için yük dengeleyiciye özel bir "proxy alt ağı" oluşturmanız gerekir. Yalnızca proxy alt ağı hakkında daha fazla bilgiyi burada bulabilirsiniz.
Cloud Shell'den
gcloud compute networks subnets create eu-west9-proxy-subnet \ --network=${VPC_NAME} \ --region=${REGION} \ --range=10.100.100.0/24 \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE
Güvenlik Duvarı Kuralı Oluşturma
Bu laboratuvarda, oluşturduğunuz örneklere bağlanmak için IAP'yi kullanacaksınız. IAP'yi kullanmayı tercih etmiyorsanız bu adımı atlayabilir, bunun yerine örneğe genel IP adresleri ekleyebilir ve 0.0.0.0/0 adresinden 22 numaralı TCP bağlantı noktasında girişe izin veren bir güvenlik duvarı kuralı oluşturabilirsiniz.
IAP'nin sanal makine örneklerinize bağlanmasına izin vermek için aşağıdakileri yapan bir güvenlik duvarı kuralı oluşturun:
- IAP kullanılarak erişilmesini istediğiniz tüm sanal makine örnekleri için geçerlidir.
- 35.235.240.0/20 IP aralığından gelen giriş trafiğine izin verir. Bu aralık, IAP'nin TCP yönlendirme için kullandığı tüm IP adreslerini içerir.
Cloud Shell'den
gcloud compute firewall-rules create allow-ssh-iap \ --network=${VPC_NAME} \ --allow tcp:22 \ --source-ranges=35.235.240.0/20
6. Cloud NAT oluşturma
Linux paketi dağıtımlarını indirmek için bir Cloud NAT oluşturulmalıdır.
Cloud Router oluşturma
Cloud Shell'den
gcloud compute routers create crnat \ --network=${VPC_NAME} \ --region=${REGION}
Cloud NAT oluşturma
Cloud Shell'den
gcloud compute routers nats create europe-nat \ --router=crnat \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges \ --enable-logging \ --region=${REGION}
7. Anahtar Yönetimi Anahtarlığı ve Anahtarı Oluşturma
Cloud Shell'den
gcloud kms keyrings create europe-kr \ --location ${REGION}
Cloud Shell'den
gcloud kms keys create europe-key \ --location ${REGION} \ --keyring europe-kr \ --purpose encryption
Cloud Shell'de, anahtar zincirinin ve anahtarın europe-west bölgesinde başarıyla oluşturulduğunu onaylayın.
gcloud kms keys list \ --location ${REGION} \ --keyring europe-kr
BEKLENEN SONUÇ
NAME: projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key PURPOSE: ENCRYPT_DECRYPT ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION PROTECTION_LEVEL: SOFTWARE LABELS: PRIMARY_ID: 1 PRIMARY_STATE: ENABLED
Daha sonra bağlanmak için kullanacağınız için anahtarlar için verilen tam yol adını not edin.
8. İstemci sanal makinesi oluşturun ve KMS API'ye bağlanın
Ardından, istemci sanal makinesi oluşturup sanal makineye SSH ile bağlanır ve genel KMS API'nin çözünürlüğünü test edersiniz. Bu test, genel Google API'leri için varsayılan çözünürlüğü temsil eder.
Cloud Shell'den
#Create the startup script touch startup.sh #Open the startup.sh file using a text editor of your choice (e.g., nano, vim, gedit, etc.) nano startup.sh #Paste the following script content into the startup.sh file #! /bin/bash sudo apt-get update sudo apt-get install dnsutils -y sudo apt-get install tcpdump -y #Save the changes you made to the startup.sh file #Use the chmod command to make the script executable chmod +x startup.sh #Create the VM instance gcloud compute instances create client-vm \ --network="${VPC_NAME}" \ --subnet="${SUBNET_NAME}" \ --zone="europe-west9-a" \ --machine-type="e2-medium" \ --no-address \ --scopes="https://www.googleapis.com/auth/cloud-platform" \ --image-family="debian-12" \ --image-project="debian-cloud" \ --metadata-from-file="startup-script=./startup.sh"
Ardından, oluşturduğunuz KMS anahtarına erişmek için varsayılan Compute hizmet hesabını güncellemeniz gerekir. Varsayılan Compute hizmet hesabı <Project_Number> -compute@developer.gserviceaccount.com biçiminde olacaktır. Proje numarasını almak için Cloud Shell'de aşağıdaki komutu çalıştırın ve döndürülen sonuçların son satırındaki numarayı kopyalayın.
gcloud projects describe $PROJECT_ID
Oluşturduğunuz KMS anahtarına erişmek için varsayılan Compute hizmet hesabını güncelleyin.
Cloud Shell'den
gcloud kms keys add-iam-policy-binding europe-key \ --location $REGION \ --keyring europe-kr \ --member serviceAccount:<project_number>-compute@developer.gserviceaccount.com \ --role roles/cloudkms.admin
+ simgesini (aşağıdaki ekran görüntüsü) tıklayarak ek bir Cloud Shell terminali oluşturun.
2. sekmede, istemci sanal makinesine SSH üzerinden bağlanmak için IAP üzerinden tünel oluşturun. Ortam değişkenlerinin aktarılmayacağını ve proje kimliğinizi aşağıdaki komuta eklemeniz gerektiğini unutmayın.
Cloud Shell'den
# Set the environment variable export PROJECT_ID=$(gcloud config get-value project) # ssh into the client-vm gcloud beta compute ssh --zone europe-west9-a "client-vm" \ --tunnel-through-iap \ --project $PROJECT_ID
Daha önce not ettiğiniz KMS anahtarı adını kullanarak genel KMS API'ye bağlanın.
2. sekmede client-vm
# Store the access token in a variable TOKEN=$(gcloud auth print-access-token) # Run the full command with maximum verbosity curl -v \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ 'https://cloudkms.googleapis.com/v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key'
BEKLENEN SONUÇ
* Trying 216.58.214.74:443... * Connected to cloudkms.googleapis.com (216.58.214.74) port 443 (#0) * ALPN: offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN: server accepted h2 * Server certificate: * subject: CN=upload.video.google.com * start date: Aug 26 07:12:45 2024 GMT * expire date: Nov 18 07:12:44 2024 GMT * subjectAltName: host "cloudkms.googleapis.com" matched cert's "*.googleapis.com" * issuer: C=US; O=Google Trust Services; CN=WR2 * SSL certificate verify ok. * using HTTP/2 * h2h3 [:method: GET] * h2h3 [:path: /v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key] * h2h3 [:scheme: https] * h2h3 [:authority: cloudkms.googleapis.com] * h2h3 [user-agent: curl/7.88.1] * h2h3 [accept: */*] * h2h3 [authorization: Bearer dsnkjfdnvjfd * h2h3 [content-type: application/json] * Using Stream ID: 1 (easy handle 0x55ed8bb7ece0) > GET /v1/projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key HTTP/2 > Host: cloudkms.googleapis.com > user-agent: curl/7.88.1 > accept: */* > authorization: Bearer dsnkjfdnvjfd > content-type: application/json > < HTTP/2 200 < content-type: application/json; charset=UTF-8 < vary: X-Origin < vary: Referer < vary: Origin,Accept-Encoding < date: Tue, 24 Sep 2024 18:25:42 GMT < server: ESF < cache-control: private < x-xss-protection: 0 < x-frame-options: SAMEORIGIN < x-content-type-options: nosniff < accept-ranges: none < { "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key", "primary": { "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key/cryptoKeyVersions/1", "state": "ENABLED", "createTime": "2024-09-24T17:56:01.905156045Z", "protectionLevel": "SOFTWARE", "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION", "generateTime": "2024-09-24T17:56:01.905156045Z" }, "purpose": "ENCRYPT_DECRYPT", "createTime": "2024-09-24T17:56:01.905156045Z", "versionTemplate": { "protectionLevel": "SOFTWARE", "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION" }, "destroyScheduledDuration": "2592000s" } * Connection #0 to host cloudkms.googleapis.com left intact
DNS'nin KMS uç noktasını nereye çözdüğünü kontrol edin.
sekme2, istemci-vm
dig cloudkms.googleapis.com
BEKLENEN SONUÇ
<<>> DiG 9.18.28-1~deb12u2-Debian <<>> cloudkms.googleapis.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62617 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;cloudkms.googleapis.com. IN A ;; ANSWER SECTION: cloudkms.googleapis.com. 300 IN A 142.250.74.234 cloudkms.googleapis.com. 300 IN A 142.250.75.234 cloudkms.googleapis.com. 300 IN A 216.58.214.170 cloudkms.googleapis.com. 300 IN A 172.217.20.170 cloudkms.googleapis.com. 300 IN A 172.217.20.202 cloudkms.googleapis.com. 300 IN A 216.58.215.42 cloudkms.googleapis.com. 300 IN A 216.58.213.74 cloudkms.googleapis.com. 300 IN A 142.250.179.74 cloudkms.googleapis.com. 300 IN A 142.250.179.106 cloudkms.googleapis.com. 300 IN A 142.250.178.138 cloudkms.googleapis.com. 300 IN A 142.250.201.170 cloudkms.googleapis.com. 300 IN A 172.217.18.202 cloudkms.googleapis.com. 300 IN A 216.58.214.74 ;; Query time: 4 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Wed Oct 23 19:58:58 UTC 2024 ;; MSG SIZE rcvd: 260
sekme2, istemci-vm
dig cloudkms.europe-west9.rep.googleapis.com
BEKLENEN SONUÇ
<<>> DiG 9.18.28-1~deb12u2-Debian <<>> cloudkms.europe-west9.rep.googleapis.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2736 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;cloudkms.europe-west9.rep.googleapis.com. IN A ;; ANSWER SECTION: cloudkms.europe-west9.rep.googleapis.com. 3043 IN A 34.1.65.232 ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Wed Oct 23 20:00:04 UTC 2024 ;; MSG SIZE rcvd: 85
Google API'leri için varsayılan davranış, Global API hizmet uç noktasını kullanmaktır. Bu uç nokta, herkese açık IP adreslerinin listesine çözümlenir. cloudkms.googleapis.com için yapılan dig sorgusu bunu gösterir. (Not: Gördüğünüz IP adresi farklı bir harici IP adresi olabilir. Bu, normal bir Google API'si davranışıdır.)
PSC ile bölgesel Google API uç noktalarını kullanarak API trafiğiyle ilgili bölgesel koşulları karşılayabilir ve çözünürlüğü herkese açıktan özele değiştirebilirsiniz. cloudkms.europe-west9.rep.googleapis.com için yapılan dig sorgusu, bölgesel KSM API uç noktasının çözümünün şu anda hâlâ herkese açık olduğunu gösteriyor.
Aşağıdaki bölümlerde, Global KMS API uç noktasını kullanmayı bölgesel uç noktaya taşıyacağız ve PSC arka uçlarını kullanarak çözünürlüğü özel olarak değiştireceğiz.
9. PSC NEG'yi ve yük dengeleyiciyi oluşturma
Sonraki bölüm için Cloud Shell'de ilk sekmeye geri dönün.
Arka uç hizmeti olarak Avrupa bölgesel KMS uç noktasını işaret eden bir ağ uç noktası grubu(NEG) içeren bir Dahili HTTP(S) Yük Dengeleyici oluşturacaksınız. Yük dengeleyicinin yönlendirme kuralı, Private Service Connect(PSC) uç noktası olarak işlev görür.
Private Service Connect türüne ve europe-west9-cloudkms.example.com hedef hizmetine sahip bir ağ uç noktası grubu (NEG) oluşturun.
Cloud Shell'den
#Set the necessary variables NEG_NAME="l7psc-kms-neg" PSC_TARGET="cloudkms.europe-west9.rep.googleapis.com" #Create the Private Service Connect NEG gcloud compute network-endpoint-groups create ${NEG_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --network-endpoint-type=PRIVATE_SERVICE_CONNECT \ --psc-target-service=${PSC_TARGET} # Verify the NEG creation gcloud compute network-endpoint-groups describe ${NEG_NAME} \ --project=${PROJECT_ID} \ --region=${REGION}
Yük dengeleyici için arka uç hizmetini oluşturun.
Cloud Shell'den
# 1. Set the necessary variables BACKEND_SERVICE_NAME="l7-psc-kms" # 2. Create the backend service gcloud compute backend-services create $BACKEND_SERVICE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=HTTPS \ --region=$REGION \
NEG'yi arka uç hizmetine ekleyin.
Cloud Shell'den
gcloud compute backend-services add-backend $BACKEND_SERVICE_NAME \ --network-endpoint-group=${NEG_NAME} \ --region=$REGION
Yük dengeleyici için URL eşlemesini oluşturun.
Cloud Shell'den
gcloud compute url-maps create l7-psc-url-map \ --default-service=l7-psc-kms \ --region=$REGION
Uç noktanın kullanacağı özel URL için Yol Eşleştirici'yi oluşturun.
Cloud Shell'den
gcloud compute url-maps add-path-matcher l7-psc-url-map \ --path-matcher-name=example \ --default-service=l7-psc-kms \ --region=$REGION
Özel URL (europe-west9-cloudkms.example.com) için ana makine kuralını oluşturun.
Cloud Shell'den
gcloud compute url-maps add-host-rule l7-psc-url-map \ --hosts=europe-west9-cloudkms.example.com \ --path-matcher-name=example \ --region=$REGION
Yük dengeleyici için hedef HTTPS proxy'sini oluşturun. Bunun için bölgesel bir SSL sertifikası kaynağı oluşturmanız gerekir. Kendinden imzalı sertifika oluşturma adımlarını burada bulabilirsiniz. OpenSSL kullanarak kendinden imzalı bir sertifika oluşturacağız ve bunu GCP'de bölgesel sertifika kaynağı oluşturmak için kullanacağız. Hedef https proxy'si bu sertifikayı kullanır.
Cloud Shell'den
# Set environment variables export CERT_NAME="my-ssl-cert" # Generate a private key openssl genrsa -out private.key 2048 # Create a configuration file for the CSR cat > csr_config.cnf << EOF [req] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [dn] CN = example.com O = My Organization C = US [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = example.com DNS.2 = *.example.com EOF # Create a CSR using the configuration openssl req -new -key private.key -out server.csr -config csr_config.cnf # Create a self-signed certificate using the CSR openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt \ -extfile csr_config.cnf -extensions req_ext # Verify the certificate openssl x509 -in server.crt -text -noout #Create a regional SSL certificate resource gcloud compute ssl-certificates create ${CERT_NAME} \ --region=${REGION} \ --certificate=server.crt \ --private-key=private.key #Create the target HTTPS proxy for the load balancer gcloud compute target-https-proxies create psc-http-proxy \ --region=${REGION} \ --url-map=l7-psc-url-map \ --ssl-certificates=${CERT_NAME}
Private Service Connect uç noktası olarak kullanılacak yük dengeleyici için yönlendirme kuralını oluşturun. Yönlendirme kuralının IP adresi, VPC'deki bölgesel bir alt ağa ait olmalıdır. Bu alt ağ, eriştiğiniz API uç noktasının bulunduğu bölgede olmalıdır.
Cloud Shell'den
# Set environment variables export PROXY_NAME="psc-http-proxy" # Create the forwarding rule gcloud compute forwarding-rules create kms-lb-rule \ --project=${PROJECT_ID} \ --region=${REGION} \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=${VPC_NAME} \ --subnet=${SUBNET_NAME} \ --target-https-proxy=${PROXY_NAME} \ --target-https-proxy-region=${REGION} \ --address=10.0.0.100 \ --ports=443
10. DNS Yapılandırması
Bu bölümde, example.com için özel bir DNS alt bölgesi ve son adımda oluşturduğumuz yönlendirme kuralını işaret eden bir A kaydı oluşturacaksınız.
Yönetilen DNS özel bölgesi oluşturun.
Cloud Shell'den
# Set environment variables export LB_RULE_NAME="kms-lb-rule" export DNS_ZONE_NAME="example-com-private-zone" # Create the private DNS zone gcloud dns managed-zones create ${DNS_ZONE_NAME} \ --dns-name="example.com." \ --description="Private DNS zone for example.com" \ --visibility=private \ --networks=${VPC_NAME}
europe-west9-cloudkms.example.com için A kaydı oluşturun.
Cloud Shell'den
gcloud dns record-sets transaction start \ --zone=${DNS_ZONE_NAME} gcloud dns record-sets transaction add 10.0.0.100 \ --name=europe-west9-cloudkms.example.com \ --ttl=300 \ --type=A \ --zone=${DNS_ZONE_NAME} gcloud dns record-sets transaction execute \ --zone=${DNS_ZONE_NAME}
11. PSC üzerinden Bölgesel KMS API'ye bağlanma
Tüm bağlantı ayrıntılarını görmek ve PSC arka ucu üzerinden bölgesel KMS uç noktasıyla olan bağlantıları test etmek için 2. sekmede istemci-sanal makineye geri dönün ve tcpdump'u çalıştırın.
sudo tcpdump -i any net 10.0.0.100 or port 53 -n
Cloud Shell'de 3. bir sekme açın ve client-vm'ye SSH üzerinden bağlanın.
# Set environment variables export PROJECT_ID=$(gcloud config get-value project) export KMS_HOSTNAME="europe-west9-cloudkms.example.com" export KEY_RING="europe-kr" export KEY_NAME="europe-key" export REGION="europe-west9" # Command to access the specific key curl -k "https://${KMS_HOSTNAME}/v1/projects/${PROJECT_ID}/locations/${REGION}/keyRings/${KEY_RING}/cryptoKeys/${KEY_NAME}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)"
curl komutu + TCPDUMP için BEKLENEN SONUÇ
{ "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key", "primary": { "name": "projects/<project-id>/locations/europe-west9/keyRings/europe-kr/cryptoKeys/europe-key/cryptoKeyVersions/1", "state": "ENABLED", "createTime": "2024-10-10T18:50:24.357027036Z", "protectionLevel": "SOFTWARE", "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION", "generateTime": "2024-10-10T18:50:24.357027036Z" }, "purpose": "ENCRYPT_DECRYPT", "createTime": "2024-10-10T18:50:24.357027036Z", "versionTemplate": { "protectionLevel": "SOFTWARE", "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION" }, "destroyScheduledDuration": "2592000s" } Tcpdump output listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 18:13:51.220209 lo In IP 127.0.0.1.48873 > 127.0.0.53.53: 2086+ [1au] A? europe-west9-cloudkms.example.com. (62) 18:13:51.220230 lo In IP 127.0.0.1.48873 > 127.0.0.53.53: 24619+ [1au] AAAA? europe-west9-cloudkms.example.com. (62) 18:13:51.220669 ens4 Out IP 10.0.0.2.52121 > 169.254.169.254.53: 8885+ [1au] A? europe-west9-cloudkms.example.com. (62) 18:13:51.220784 ens4 Out IP 10.0.0.2.53041 > 169.254.169.254.53: 57748+ [1au] AAAA? europe-west9-cloudkms.example.com. (62) 18:13:51.229638 ens4 In IP 169.254.169.254.53 > 10.0.0.2.52121: 8885 1/0/1 A 10.0.0.100 (78) 18:13:51.229945 lo In IP 127.0.0.53.53 > 127.0.0.1.48873: 2086 1/0/1 A 10.0.0.100 (78) 18:13:51.230068 ens4 In IP 169.254.169.254.53 > 10.0.0.2.53041: 57748 0/1/1 (155) 18:13:51.230203 lo In IP 127.0.0.53.53 > 127.0.0.1.48873: 24619 0/1/1 (155) 18:13:51.230390 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [S], seq 1606150798, win 65320, options [mss 1420,sackOK,TS val 4135800856 ecr 0,nop,wscale 7], length 0 18:13:51.232565 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [S.], seq 1041507402, ack 1606150799, win 65535, options [mss 1420,sackOK,TS val 2276748382 ecr 4135800856,nop,wscale 8], length 0 18:13:51.232583 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [.], ack 1, win 511, options [nop,nop,TS val 4135800859 ecr 2276748382], length 0 18:13:51.235494 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 1:518, ack 1, win 511, options [nop,nop,TS val 4135800862 ecr 2276748382], length 517 18:13:51.236571 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 518, win 267, options [nop,nop,TS val 2276748387 ecr 4135800862], length 0 18:13:51.239119 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1:1356, ack 518, win 267, options [nop,nop,TS val 2276748389 ecr 4135800862], length 1355 18:13:51.239140 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [.], ack 1356, win 501, options [nop,nop,TS val 4135800865 ecr 2276748389], length 0 18:13:51.240978 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 518:598, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 80 18:13:51.241266 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 598:684, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 86 18:13:51.241366 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 684:1646, ack 1356, win 501, options [nop,nop,TS val 4135800867 ecr 2276748389], length 962 18:13:51.242370 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 684, win 267, options [nop,nop,TS val 2276748392 ecr 4135800867], length 0 18:13:51.242619 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1356:1433, ack 1646, win 278, options [nop,nop,TS val 2276748393 ecr 4135800867], length 77 18:13:51.242730 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [P.], seq 1646:1677, ack 1433, win 501, options [nop,nop,TS val 4135800869 ecr 2276748393], length 31 18:13:51.248724 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [.], ack 1677, win 278, options [nop,nop,TS val 2276748399 ecr 4135800869], length 0 18:13:51.296676 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 1433:2357, ack 1677, win 278, options [nop,nop,TS val 2276748447 ecr 4135800869], length 924 18:13:51.297223 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [F.], seq 1677, ack 2357, win 501, options [nop,nop,TS val 4135800923 ecr 2276748447], length 0 18:13:51.298304 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [P.], seq 2357:2381, ack 1678, win 278, options [nop,nop,TS val 2276748448 ecr 4135800923], length 24 18:13:51.298305 ens4 In IP 10.0.0.100.443 > 10.0.0.2.59474: Flags [F.], seq 2381, ack 1678, win 278, options [nop,nop,TS val 2276748448 ecr 4135800923], length 0 18:13:51.298336 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [R], seq 1606152476, win 0, length 0 18:13:51.298343 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [R], seq 1606152476, win 0, length 0
2. sekme penceresine geri dönüp tcpdump bilgilerini inceleyin. Oluşturduğunuz PSC uç noktası üzerinden Cloud KMS bölgesel uç noktasına erişebildiğinizi ve europe-west9 bölgesel uç noktasının, oluşturduğunuz Managed Cloud DNS alt bölgesine özel olarak çözüme ulaştırıldığını görürsünüz. tcpdump çıkışındaki ilgili satırlar yukarıda vurgulanmış ve aşağıda referans verilmiştir:
18:13:51.229638 ens4 In IP 169.254.169.254.53 > 10.0.0.2.52121: 8885 1/0/1 A 10.0.0.100 (78)
(GCP meta veri sunucusu, A kaydı ile yanıt verir: 10.0.0.100 (yük dengeleyici IP'si). DNS çözümü düzgün çalışıyor. europe-west9-cloudkms.example.com, yük dengeleyici IP'niz olan 10.0.0.100 adresine çözümleniyor)
18:13:51.230390 ens4 Out IP 10.0.0.2.59474 > 10.0.0.100.443: Flags [S], seq 1606150798, win 65320, options [mss 1420,sackOK,TS val 4135800856 ecr 0,nop,wscale 7], length 0
(Bu, yük dengeleyici IP'sine yapılan HTTPS bağlantısı için TCP el sıkışmasını gösterir)
3. sekmede, client-vm
dig europe-west9-cloudkms.example.com
BEKLENEN SONUÇ
; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> europe-west9-cloudkms.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7008 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;europe-west9-cloudkms.example.com. IN A ;; ANSWER SECTION: europe-west9-cloudkms.example.com. 300 IN A 10.0.0.100 ;; Query time: 12 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Fri Oct 11 20:03:00 UTC 2024 ;; MSG SIZE rcvd: 78
dig komutunun çıktısı, europe-west9-cloudkms.example.com için oluşturduğumuz özel URL'nin, dahili yük dengeleyici IP'niz olan 10.0.0.100 adresine doğru şekilde çözümlendiğini gösterir. europe-west9-cloudkms.example.com adresine gelen istekler dahili yük dengeleyicinize yönlendirilir. Yük dengeleyici, istekleri Private Service Connect üzerinden KMS bölgesel uç noktasına yönlendirir.
Artık client-vm için her iki SSH sekmesini de kapatabilirsiniz.
12. Temizleme adımları
Tek bir Cloud Shell terminalinden laboratuvar bileşenlerini silme
# Set environment variables export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)") export REGION=europe-west9 export ZONE=europe-west9-a export VPC_NAME="consumer-vpc" export SUBNET_NAME="consumer-subnet-1" export NEG_NAME="l7psc-kms-neg" export BACKEND_SERVICE_NAME="l7-psc-kms" export CERT_NAME="my-ssl-cert" export PROXY_NAME="psc-http-proxy" export LB_RULE_NAME="kms-lb-rule" export DNS_ZONE_NAME="example-com-private-zone" # Delete DNS records and zone gcloud dns record-sets delete europe-west9-cloudkms.example.com. \ --zone=${DNS_ZONE_NAME} --type=A --quiet gcloud dns managed-zones delete ${DNS_ZONE_NAME} --quiet # Delete Load Balancer components gcloud compute forwarding-rules delete ${LB_RULE_NAME} --region=${REGION} --quiet gcloud compute target-https-proxies delete ${PROXY_NAME} --region=${REGION} --quiet gcloud compute url-maps delete l7-psc-url-map --region=${REGION} --quiet gcloud compute backend-services delete ${BACKEND_SERVICE_NAME} --region=${REGION} --quiet gcloud compute network-endpoint-groups delete ${NEG_NAME} --region=${REGION} --quiet # Delete SSL certificate gcloud compute ssl-certificates delete ${CERT_NAME} --region=${REGION} --quiet # Delete VM instance gcloud compute instances delete client-vm --zone=${ZONE} --quiet # Delete firewall rules gcloud compute firewall-rules delete allow-ssh-iap --quiet # Delete Cloud NAT and router gcloud compute routers nats delete europe-nat --router=crnat --region=${REGION} --quiet gcloud compute routers delete crnat --region=${REGION} --quiet # Delete subnets and VPC gcloud compute networks subnets delete ${SUBNET_NAME} --region=${REGION} --quiet gcloud compute networks subnets delete eu-west9-proxy-subnet --region=${REGION} --quiet gcloud compute networks delete ${VPC_NAME} --quiet # Schedule KMS key for deletion and provide instructions for keyring deletion gcloud kms keys remove-iam-policy-binding europe-key \ --location ${REGION} \ --keyring europe-kr \ --member serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role roles/cloudkms.admin gcloud kms keys versions destroy 1 --location=${REGION} --keyring=europe-kr --key=europe-key # Disable services (optional, only if you want to completely disable these APIs) gcloud services disable compute.googleapis.com --force gcloud services disable servicedirectory.googleapis.com --force gcloud services disable dns.googleapis.com --force gcloud services disable cloudkms.googleapis.com --force # Clean up local files rm -f private.key server.csr server.crt csr_config.cnf startup.sh
13. Tebrikler!
Kod laboratuvarını tamamladığınız için tebrikler.