1. مقدمه
Private Service Connect یک قابلیت شبکه Google Cloud است که به مصرف کنندگان اجازه می دهد به خدمات تولید کننده دسترسی داشته باشند. این شامل توانایی اتصال به Google API از طریق یک نقطه پایانی خصوصی است که در VPC کاربر (معمولاً مصرف کننده) میزبانی می شود.
علاوه بر این، PSC Backends را می توان همراه با متعادل کننده بار پروکسی Google Cloud برای اشاره به APIهای Google خاص منطقه استفاده کرد. استفاده از PSC Backends کنترل های جانبی مصرف کننده ریزتری را فراهم می کند مانند:
- انتخاب خدمات Google API با استفاده از URL Map
- قابلیت مشاهده عمیق تر
- یکپارچه سازی زره ابری
- URL های سفارشی
- مدیریت ترافیک پیشرفته
لیست خدمات موجود و APIهای منطقه ای آنها را می توانید در اینجا بیابید.
در این نرم افزار کد، یک PSC Backend ایجاد می کنید که به API منطقه ای Cloud KMS اشاره می کند و اتصال به آن API را آزمایش می کنید.
چیزی که یاد خواهید گرفت
- یک حلقه کلید و کلید سرویس مدیریت کلید ابری (KMS) ایجاد کنید.
- ایجاد یک متعادل کننده بار داخلی برنامه با یک Backend PSC که به یک API منطقه ای Cloud KMS اشاره می کند.
- ایجاد یک Cloud DNS Managed Private Zone و یک رکورد.
- به Cloud KMS منطقه ای دسترسی پیدا کنید
آنچه شما نیاز دارید
- یک پروژه Google Cloud با مجوزهای ایدهآل "مالک" یا "ویرایشگر" کامل.
2. توپولوژی Codelab
یک VPC مصرفکننده با یک زیرشبکه در منطقه اروپا-غرب برای میزبانی یک ماشین مجازی، قانون حمل و نقل بار برنامههای داخلی منطقهای و Backend PSC و تنها یک زیرشبکه پراکسی برای استفاده با متعادلکننده بار ایجاد میشود. ما یک حلقه کلید و کلید در سیستم مدیریت کلید ابری (KMS) در منطقه اروپا-غرب ایجاد خواهیم کرد. سپس Load Balanser و PSC Backend را ایجاد می کنیم تا به API منطقه ای KMS در europe-west9 حل شود.
3. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.
4. قبل از شروع
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
5. شبکه VPC، زیرشبکه ها و قوانین فایروال ایجاد کنید
شبکه VPC ایجاد کنید
از Cloud Shell
# 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
ایجاد زیرشبکه
از Cloud Shell
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 منطقه ای ایجاد می کنید. این load balancer یک متعادل کننده بار پروکسی است، بنابراین شما باید یک "subnet proxy" ایجاد کنید که برای انجام پروکسی به Load Balanser اختصاص داده شده است. اطلاعات بیشتر در مورد زیرشبکه فقط پروکسی را میتوانید در اینجا بیابید.
از Cloud Shell
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 اجازه دهید به نمونه های VM شما متصل شود، یک قانون فایروال ایجاد کنید که:
- برای تمام نمونه های VM که می خواهید با استفاده از IAP در دسترس باشند، اعمال می شود.
- به ترافیک ورودی از محدوده IP 35.235.240.0/20 اجازه می دهد. این محدوده شامل تمام آدرس های IP است که IAP برای ارسال TCP استفاده می کند.
از Cloud Shell
gcloud compute firewall-rules create allow-ssh-iap \ --network=${VPC_NAME} \ --allow tcp:22 \ --source-ranges=35.235.240.0/20
6. Cloud NAT را ایجاد کنید
برای دانلود توزیع های بسته لینوکس باید یک Cloud NAT ایجاد شود.
ایجاد Cloud Router
از Cloud Shell
gcloud compute routers create crnat \ --network=${VPC_NAME} \ --region=${REGION}
Cloud NAT را ایجاد کنید
از Cloud Shell
gcloud compute routers nats create europe-nat \ --router=crnat \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges \ --enable-logging \ --region=${REGION}
7. کلید و کلید مدیریت کلید را ایجاد کنید
از Cloud Shell
gcloud kms keyrings create europe-kr \ --location ${REGION}
از Cloud Shell
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
به نام مسیر کامل داده شده برای کلیدها توجه کنید زیرا بعداً از آن برای اتصال به آن استفاده خواهید کرد.
8. Client VM را ایجاد کنید و به KMS API متصل شوید
سپس یک مشتری VM، SSH در VM ایجاد میکنید و وضوح API جهانی KMS را آزمایش میکنید. این تست گزینه پیشفرض برای تفکیک APIهای جهانی Google را نشان میدهد.
از Cloud Shell
#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 را به روز کنید. حساب سرویس محاسباتی پیشفرض در قالب <Project_Number> -compute@developer.gserviceaccount.com خواهد بود. برای دریافت Project Number دستور زیر را از Cloud Shell اجرا کنید و عدد را در آخرین خط نتایج برگشتی کپی کنید.
gcloud projects describe $PROJECT_ID
برای دسترسی به کلید KMS که ایجاد کردهاید، حساب پیشفرض خدمات محاسبه را بهروزرسانی کنید.
از Cloud Shell
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
با کلیک کردن روی + یک ترمینال پوسته ابری اضافی ایجاد کنید (تصویر زیر)
در برگه 2، از طریق IAP به SSH به کلاینت-vm تونل کنید. توجه داشته باشید که متغیرهای محیطی حمل نمی شوند و باید ID پروژه خود را به دستور زیر اضافه کنید.
از Cloud Shell
# 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 متصل شوید.
از تب 2، 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 را کجا حل می کند.
از tab2، 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
از tab2، 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های Google استفاده از نقطه پایانی سرویس API جهانی است. این نقطه پایانی به لیستی از IP های عمومی حل می شود. حفاری برای cloudkms.googleapis.com این را نشان می دهد. (توجه: آدرس IP که میبینید ممکن است یک آدرس IP خارجی متفاوت باشد. این رفتار عادی APIهای Google است.)
با استفاده از نقاط پایانی API منطقه ای Google با PSC، می توانید الزامات منطقه ای برای ترافیک API را برآورده کنید و همچنین وضوح را از عمومی به خصوصی تغییر دهید. بررسی cloudkms.europe-west9.rep.googleapis.com نشان می دهد که در این مرحله، وضوح نقطه پایانی KSM API منطقه ای هنوز عمومی است.
در بخشهای بعدی، از استفاده از نقطه پایانی Global KMS API به نقطه پایانی منطقهای مهاجرت میکنیم و وضوح را با استفاده از PSC Backends به خصوصی تغییر میدهیم.
9. PSC NEG و Load Balancer را ایجاد کنید
برای بخش بعدی، به تب اول در Cloud Shell برگردید.
شما یک HTTP(S) Load Balancer داخلی با گروه نقطه پایانی شبکه (NEG) ایجاد خواهید کرد که به نقطه پایانی KMS منطقه ای اروپا به عنوان یک سرویس باطن اشاره می کند. قانون حمل و نقل بار متعادل کننده به عنوان نقطه پایانی اتصال سرویس خصوصی (PSC) عمل می کند.
گروه نقطه پایانی شبکه (NEG) را با نوع Private Service Connect ایجاد کنید و سرویس را هدف قرار دهید europe-west9-cloudkms.example.com
از Cloud Shell
#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}
سرویس باطن را برای متعادل کننده بار ایجاد کنید.
از Cloud Shell
# 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 اضافه کنید.
از Cloud Shell
gcloud compute backend-services add-backend $BACKEND_SERVICE_NAME \ --network-endpoint-group=${NEG_NAME} \ --region=$REGION
نقشه URL را برای متعادل کننده بار ایجاد کنید.
از Cloud Shell
gcloud compute url-maps create l7-psc-url-map \ --default-service=l7-psc-kms \ --region=$REGION
Path Matcher را برای URL سفارشی که نقطه پایانی استفاده خواهد کرد ایجاد کنید.
از Cloud Shell
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 ایجاد کنید.
از Cloud Shell
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 هدف از این گواهی استفاده خواهد کرد.
از Cloud Shell
# 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 است که شما به آن دسترسی دارید.
از Cloud Shell
# 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
در این بخش شما یک منطقه DNS خصوصی به عنوان مثال.com و یک رکورد A ایجاد میکنید که به قانون ارسالی که در مرحله آخر ایجاد کردیم اشاره میکند.
ایجاد منطقه خصوصی مدیریت شده DNS.
از Cloud Shell
# 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 ایجاد کنید.
از Cloud Shell
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 به منطقه ای KMS API متصل شوید
در تب 2 به client-vm برگردید تا tcpdump را اجرا کنید تا تمام جزئیات اتصال را ببینید و اتصالات به نقطه پایانی KMS منطقه ای را از طریق PSC Backend آزمایش کنید.
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
دوباره پنجره تب 2 را بررسی کنید و اطلاعات tcpdump را بررسی کنید. خواهید دید که می توانید از طریق نقطه پایانی PSC که ایجاد کرده اید، به نقطه پایانی منطقه ای Cloud KMS دسترسی پیدا کنید و نقطه پایانی منطقه ای europe-west9 به طور خصوصی به منطقه مدیریت شده 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)
. متعادل کننده رزولوشن DNS به درستی کار میکند.
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 برای اتصال HTTPS به IP متعادل کننده بار است)
در تب 3، 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 ببندید.
12. مراحل پاکسازی
از یک ترمینال 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
13. تبریک می گویم!
بابت تکمیل کد لبه تبریک می گویم.