Private Service Connect - استفاده از PSC Backends برای دسترسی به APIهای منطقه ای Google

۱. مقدمه

اتصال سرویس خصوصی قابلیتی از شبکه گوگل کلود است که به مصرف‌کنندگان اجازه می‌دهد به سرویس‌های تولیدکننده دسترسی داشته باشند. این شامل قابلیت اتصال به APIهای گوگل از طریق یک نقطه پایانی خصوصی است که در VPC کاربر (معمولاً مصرف‌کننده) میزبانی می‌شود.

علاوه بر این، می‌توان از PSC Backends در کنار متعادل‌کننده‌های بار پروکسی Google Cloud برای اشاره به APIهای گوگل با منطقه خاص استفاده کرد. استفاده از PSC Backends کنترل‌های جزئی‌تری را در سمت مصرف‌کننده فراهم می‌کند، مانند:

  • انتخاب سرویس‌های API گوگل با استفاده از نقشه URL
  • مشاهده‌پذیری عمیق‌تر
  • ادغام زره ابری
  • آدرس‌های اینترنتی سفارشی
  • مدیریت ترافیک پیشرفته

فهرست سرویس‌های موجود و APIهای منطقه‌ای آنها را می‌توانید اینجا بیابید.

در این آزمایشگاه کد، شما یک PSC Backend ایجاد خواهید کرد که به API منطقه‌ای Cloud KMS اشاره می‌کند و اتصال به آن API را آزمایش خواهید کرد.

آنچه یاد خواهید گرفت

  • یک حلقه کلید و کلید سرویس مدیریت کلید ابری (KMS) ایجاد کنید.
  • ایجاد یک متعادل‌کننده بار برنامه داخلی با یک PSC Backend که به یک API منطقه‌ای Cloud KMS اشاره می‌کند
  • ایجاد یک منطقه خصوصی مدیریت‌شده با Cloud DNS و یک رکورد.
  • دسترسی به KMS ابری منطقه‌ای

آنچه نیاز دارید

  • یک پروژه گوگل کلود با مجوزهای ایده‌آل «مالک» یا «ویرایشگر».

۲. توپولوژی Codelab

۱a18ae253213e215.png

یک VPC مصرف‌کننده با یک زیرشبکه در منطقه europe-west9 برای میزبانی یک ماشین مجازی، قانون ارسال متعادل‌کننده بار برنامه منطقه‌ای داخلی و PSC Backend و یک زیرشبکه فقط پروکسی برای استفاده با متعادل‌کننده بار ایجاد خواهد شد. ما یک حلقه کلید و سیستم مدیریت کلید ابری (KMS) در منطقه europe-west ایجاد خواهیم کرد. سپس متعادل‌کننده بار و PSC Backend را برای اتصال به API منطقه‌ای KMS در europe-west9 ایجاد خواهیم کرد.

۳. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول گوگل کلود ، روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه کد را می‌توان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.

۴. قبل از شروع

فعال کردن APIها

داخل Cloud Shell، مطمئن شوید که شناسه پروژه شما تنظیم شده است

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

فعال کردن تمام سرویس‌های لازم

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

۵. ایجاد شبکه VPC، زیرشبکه‌ها و قوانین فایروال

ایجاد شبکه VPC

از پوسته ابری

# 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

ایجاد زیرشبکه‌ها

از پوسته ابری

gcloud compute networks subnets create ${SUBNET_NAME} \
    --network=${VPC_NAME} \
    --region=${REGION} \
    --range=10.0.0.0/24 \
    --enable-private-ip-google-access

در این آزمایش، شما یک متعادل‌کننده بار منطقه‌ای L7 داخلی ایجاد خواهید کرد تا به APIهای پشتیبان منطقه‌ای اشاره کند. این متعادل‌کننده بار، یک متعادل‌کننده بار پروکسی است، بنابراین شما باید یک "زیرشبکه پروکسی" ایجاد کنید که به متعادل‌کننده بار اختصاص داده شده باشد تا پروکسی را انجام دهد. اطلاعات بیشتر در مورد زیرشبکه فقط پروکسی را می‌توانید اینجا بیابید.

از پوسته ابری

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

ایجاد قوانین فایروال

برای این آزمایش، شما از IAP برای اتصال به نمونه‌هایی که ایجاد می‌کنید استفاده خواهید کرد. اگر ترجیح می‌دهید از IAP استفاده نکنید، می‌توانید از این مرحله صرف نظر کنید و در عوض آدرس‌های IP عمومی را به نمونه اضافه کنید و یک قانون فایروال ایجاد کنید که اجازه ورود از پورت TCP 22 از 0.0.0.0/0 را بدهد.

برای اینکه به IAP اجازه دهید به ماشین‌های مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال می‌شود.
  • اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را می‌دهد. این محدوده شامل تمام آدرس‌های IP است که IAP برای ارسال TCP استفاده می‌کند.

از پوسته ابری

gcloud compute firewall-rules create allow-ssh-iap \
    --network=${VPC_NAME} \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

۶. ایجاد NAT ابری

برای دانلود توزیع‌های بسته لینوکس، باید یک Cloud NAT ایجاد شود.

ایجاد روتر ابری

از پوسته ابری

gcloud compute routers create crnat \
    --network=${VPC_NAME} \
    --region=${REGION}

ایجاد NAT ابری

از پوسته ابری

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

7. Create Key Management Key Ring and Key

از پوسته ابری

gcloud kms keyrings create europe-kr \
    --location ${REGION}

از پوسته ابری

gcloud kms keys create europe-key \
    --location ${REGION} \
    --keyring europe-kr \
    --purpose encryption

از طرف Cloud Shell، تأیید کنید که حلقه کلید و کلید با موفقیت در منطقه غرب اروپا ایجاد شده‌اند.

gcloud kms keys list \
    --location ${REGION} \
    --keyring europe-kr

نتیجه مورد انتظار

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

نام کامل مسیر داده شده برای کلیدها را یادداشت کنید زیرا بعداً از این برای اتصال استفاده خواهید کرد.

۸. ماشین مجازی کلاینت ایجاد کنید و به KMS API متصل شوید

در مرحله بعد، یک ماشین مجازی کلاینت ایجاد خواهید کرد، به ماشین مجازی SSH متصل می‌شوید و وضوح API سراسری KMS را آزمایش می‌کنید. این آزمایش، گزینه پیش‌فرض برای وضوح APIهای سراسری گوگل را نشان می‌دهد.

از پوسته ابری

#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" 

در مرحله بعد، برای دسترسی به کلید KMS که ایجاد کرده‌اید، باید حساب کاربری پیش‌فرض سرویس Compute را به‌روزرسانی کنید. حساب کاربری پیش‌فرض سرویس Compute در قالب <Project_Number> -compute@developer.gserviceaccount.com خواهد بود. برای دریافت شماره پروژه، دستور زیر را از Cloud Shell اجرا کنید و شماره را در آخرین خط نتایج بازگشتی کپی کنید.

 gcloud projects describe $PROJECT_ID

برای دسترسی به کلید KMS که ایجاد کرده‌اید، حساب کاربری پیش‌فرض سرویس Compute را به‌روزرسانی کنید.

از پوسته ابری

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

با کلیک روی + (تصویر زیر) یک ترمینال cloud shell اضافی ایجاد کنید.

a36edc967333315a.png

در تب ۲، از طریق IAP به SSH در client-vm تونل بزنید. توجه داشته باشید که متغیرهای محیطی حمل نمی‌شوند و باید project-id خود را به دستور زیر اضافه کنید.

از پوسته ابری

# 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

با استفاده از نام کلید KMS که قبلاً یادداشت کرده‌اید، به API جهانی KMS متصل شوید.

از تب ۲، 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'

نتیجه مورد انتظار

*   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 کجا نقطه پایانی KMS را حل می‌کند.

از تب ۲، client-vm

dig cloudkms.googleapis.com

نتیجه مورد انتظار

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

از تب ۲، client-vm

dig cloudkms.europe-west9.rep.googleapis.com

نتیجه مورد انتظار

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

رفتار پیش‌فرض برای APIهای گوگل، استفاده از نقطه پایانی سرویس Global API است. این نقطه پایانی به فهرستی از IPهای عمومی تبدیل می‌شود. جستجوی cloudkms.googleapis.com این را نشان می‌دهد. (توجه: آدرس IP که می‌بینید ممکن است یک آدرس IP خارجی متفاوت باشد. این رفتار عادی APIهای گوگل است.)

با استفاده از نقاط پایانی منطقه‌ای API گوگل به همراه PSC، می‌توانید الزامات منطقه‌ای برای ترافیک API را برآورده کنید و همچنین وضوح را از عمومی به خصوصی تغییر دهید. بررسی cloudkms.europe-west9.rep.googleapis.com نشان می‌دهد که در این مرحله، وضوح برای نقطه پایانی منطقه‌ای KSM API هنوز عمومی است.

در بخش‌های بعدی، ما از استفاده از نقطه پایانی API جهانی KMS به نقطه پایانی منطقه‌ای مهاجرت خواهیم کرد و وضوح را با استفاده از PSC Backends به خصوصی تغییر خواهیم داد.

۹. ایجاد PSC NEG و متعادل‌کننده بار

برای بخش بعدی، به اولین تب در Cloud Shell برگردید.

شما یک متعادل‌کننده بار داخلی HTTP(S) با یک گروه نقطه پایانی شبکه (NEG) ایجاد خواهید کرد که به نقطه پایانی KMS منطقه‌ای اروپا به عنوان یک سرویس backend اشاره می‌کند. قانون ارسال متعادل‌کننده بار به عنوان نقطه پایانی Private Service Connect(PSC) عمل می‌کند.

گروه نقطه پایانی شبکه (NEG) را با نوع Private Service Connect ایجاد کنید و سرویس europe-west9-cloudkms.example.com را هدف قرار دهید.

از پوسته ابری

#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}

سرویس backend را برای متعادل‌کننده بار ایجاد کنید.

از پوسته ابری

# 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 را به سرویس backend اضافه کنید.

از پوسته ابری

gcloud compute backend-services add-backend $BACKEND_SERVICE_NAME \
  --network-endpoint-group=${NEG_NAME} \
  --region=$REGION

نقشه URL را برای متعادل کننده بار ایجاد کنید.

از پوسته ابری

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

تطبیق‌دهنده مسیر را برای URL سفارشی که نقطه پایانی از آن استفاده خواهد کرد، ایجاد کنید.

از پوسته ابری

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

قانون میزبان را برای آدرس اینترنتی سفارشی europe-west9-cloudkms.example.com ایجاد کنید.

از پوسته ابری

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

پروکسی HTTPS هدف را برای متعادل‌کننده بار ایجاد کنید. این کار نیاز به ایجاد یک منبع گواهی SSL منطقه‌ای دارد. لطفاً مراحل ایجاد یک گواهی خودامضا را اینجا ببینید. ما یک گواهی خودامضا با استفاده از openssl ایجاد می‌کنیم و از آن برای ایجاد یک منبع گواهی منطقه‌ای در GCP استفاده خواهیم کرد. پروکسی https هدف از این گواهی استفاده خواهد کرد.

از پوسته ابری

# 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}

یک قانون ارسال برای متعادل‌کننده بار ایجاد کنید که به عنوان نقطه پایانی اتصال سرویس خصوصی عمل خواهد کرد. آدرس IP برای قانون ارسال باید متعلق به یک زیرشبکه منطقه‌ای در VPC باشد که در همان منطقه نقطه پایانی API است که به آن دسترسی دارید.

از پوسته ابری

# 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

۱۰. پیکربندی DNS

در این بخش، یک منطقه DNS خصوصی برای example.com و یک رکورد A که به قانون ارسالی که در مرحله قبل ایجاد کردیم اشاره می‌کند، ایجاد خواهید کرد.

ایجاد یک منطقه خصوصی DNS مدیریت شده

از پوسته ابری

# 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 ایجاد کنید.

از پوسته ابری

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}

۱۱. از طریق PSC به API منطقه‌ای KMS متصل شوید

برای اجرای tcpdump جهت مشاهده تمام جزئیات اتصال و آزمایش اتصالات به نقطه پایانی KMS منطقه‌ای از طریق PSC Backend، در تب ۲ به client-vm برگردید .

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

یک تب سوم در Cloud Shell باز کنید و از طریق SSH به client-vm متصل شوید.

# 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 + TCPDUMP

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


دوباره به پنجره تب ۲ مراجعه کنید و اطلاعات tcpdump را بررسی کنید. خواهید دید که از طریق نقطه پایانی PSC که ایجاد کرده‌اید، توانسته‌اید به نقطه پایانی منطقه‌ای Cloud KMS دسترسی پیدا کنید و نقطه پایانی منطقه‌ای europe-west9 به صورت خصوصی به منطقه Managed Cloud DNS که ایجاد کرده‌اید، متصل می‌شود. خطوط مربوطه در خروجی tcpdump در بالا هایلایت شده و در زیر به آنها ارجاع داده شده است:

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 با رکورد A پاسخ می‌دهد: 10.0.0.100- IP متعادل‌کننده بار. وضوح DNS به درستی کار می‌کند. europe-west9-cloudkms.example.com به 10.0.0.100 که IP متعادل‌کننده بار شماست، وضوح می‌دهد.)

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 (این نشان دهنده‌ی TCP handshake برای اتصال HTTPS به IP متعادل کننده بار است)

در تب ۳، client-vm

dig europe-west9-cloudkms.example.com

نتیجه مورد انتظار

; <<>> 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 نشان می‌دهد که URL سفارشی که برای europe-west9-cloudkms.example.com ایجاد کردیم، به درستی به 10.0.0.100 تبدیل می‌شود که IP داخلی متعادل‌کننده بار شماست. درخواست‌های ارسالی به europe-west9-cloudkms.example.com به متعادل‌کننده بار داخلی شما هدایت می‌شوند و سپس از طریق Private Service Connect به نقطه پایانی منطقه‌ای KMS ارسال می‌شوند.

اکنون می‌توانید هر دو تب SSH مربوط به client-vm را ببندید.

۱۲. مراحل پاکسازی

از یک ترمینال Cloud Shell، اجزای آزمایشگاه را حذف کنید

# 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

۱۳. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.