แอปพลิเคชัน Serverless ที่ปลอดภัยด้วย Identity Aware Proxy (IAP)

1. ภาพรวม

ในแล็บนี้ คุณจะติดตั้งใช้งานพอร์ทัลสำหรับพนักงานที่ช่วยให้พนักงานดู อัปเดต และลบคำสั่งซื้อจากแอป Cymbal Eats ได้ โดยคุณจะใช้ Identity Aware Proxy (IAP) เพื่อรักษาความปลอดภัยในการเข้าถึงพอร์ทัลโดยไม่ต้องใช้เครือข่ายส่วนตัวเสมือน (VPN) IAP ช่วยให้การใช้โมเดลการเข้าถึงแบบ Zero Trust เป็นเรื่องง่ายและใช้เวลาน้อยกว่า VPN สำหรับผู้ปฏิบัติงานระยะไกลทั้งในสภาพแวดล้อมภายในองค์กรและในสภาพแวดล้อมระบบคลาวด์ โดยมีจุดควบคุมเดียวสำหรับการจัดการการเข้าถึงแอป

94b06525c85408ad.png

Identity-Aware Proxy คืออะไร

Identity-Aware Proxy (IAP) เป็นบริการของ Google Cloud ที่สกัดกั้นคำขอที่ส่งไปยังแอปพลิเคชันของคุณ โดยจะตรวจสอบสิทธิ์ผู้ใช้ที่ส่งคำขอโดยใช้บริการข้อมูลประจำตัวของ Google และอนุญาตให้คำขอผ่านได้ก็ต่อเมื่อมาจากผู้ใช้ที่มีสิทธิ์เข้าถึงแอปพลิเคชันเท่านั้น นอกจากนี้ ยังสามารถแก้ไขส่วนหัวของคำขอให้มีข้อมูลเกี่ยวกับผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ได้ด้วย

สิ่งที่คุณจะได้เรียนรู้

  • วิธีกำหนดค่ากลุ่มปลายทางเครือข่ายแบบ Serverless (NEG)
  • วิธีกำหนดค่าตัวจัดสรรภาระงาน
  • วิธีเปิดใช้ IAP เพื่อจำกัดการเข้าถึง
  • วิธีจำกัดการเข้าถึงโดยใช้ IAP

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

การตั้งค่าสภาพแวดล้อม

  1. สร้างตัวแปรสภาพแวดล้อมที่เกี่ยวข้องกับโปรเจ็กต์และทรัพยากร
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. เปิดใช้ API ของบริการ IAP และ Cloud Resource Manager
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. โคลนที่เก็บแอปตัวอย่างแล้วไปที่ไดเรกทอรี
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. ทำให้พอร์ทัลพนักงานใช้งานได้โดยใช้สคริปต์การตั้งค่า รอให้สคริปต์ทำงานเสร็จก่อนทำขั้นตอนถัดไป
./setup.sh

ตัวอย่างเอาต์พุต

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. คลิกลิงก์ URL ของบริการ

86416f68c0b8152a.png

3. การกำหนดค่ากลุ่มปลายทางเครือข่ายแบบ Serverless (NEG)

คุณจะสร้างกลุ่มปลายทางของเครือข่ายแบบ Serverless( NEG แบบ Serverless) สำหรับบริการ Cloud Run ของ UI สำหรับพนักงาน NEG แบบ Serverless ช่วยให้คุณใช้แอป Google Cloud แบบไร้เซิร์ฟเวอร์กับการจัดสรรภาระงาน HTTP(S) ภายนอกได้

2abe669e53c27186.png

  1. สร้างกลุ่มปลายทางของเครือข่ายสำหรับบริการ UI ของพนักงาน
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

สร้างบริการแบ็กเอนด์และเพิ่ม NEG แบบ Serverless

บริการแบ็กเอนด์จะกำหนดวิธีที่ Cloud Load Balancing กระจายการรับส่งข้อมูล การกำหนดค่าบริการแบ็กเอนด์ประกอบด้วยชุดค่าต่างๆ เช่น โปรโตคอลที่ใช้ในการเชื่อมต่อกับแบ็กเอนด์ การตั้งค่าการกระจายและเซสชันต่างๆ การตรวจสอบประสิทธิภาพการทำงาน และการหมดเวลา การตั้งค่าเหล่านี้ช่วยให้คุณควบคุมลักษณะการทำงานของตัวจัดสรรภาระงานได้อย่างละเอียด

  1. สร้างบริการแบ็กเอนด์
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. เพิ่ม NEG แบบไร้เซิร์ฟเวอร์เป็นแบ็กเอนด์ให้กับบริการแบ็กเอนด์
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

ตัวอย่างเอาต์พุต

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. สร้างแผนที่ URL เพื่อกำหนดเส้นทางคำขอขาเข้าไปยังบริการแบ็กเอนด์
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. การกำหนดค่าคอมโพเนนต์ของตัวจัดสรรภาระงาน

แผนภาพต่อไปนี้แสดงให้เห็นว่าตัวจัดสรรภาระงานใช้แบ็กเอนด์ NEG แบบ Serverless เพื่อนำคำขอไปยังบริการ Cloud Run แบบ Serverless

335f4674737a6514.png

สำรองที่อยู่ IP แบบคงที่

  1. สำรองที่อยู่ IPv4 แบบคงที่และจัดเก็บโดเมน
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. จัดเก็บโดเมน nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

สร้างทรัพยากรใบรับรอง SSL ที่จัดการโดย Google

  1. สร้างทรัพยากรใบรับรอง SSL ที่จัดการโดย Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

สร้างพร็อกซี HTTPS เป้าหมาย

  1. สร้างพร็อกซี HTTPS เป้าหมายเพื่อกำหนดเส้นทางคำขอไปยังแผนที่ URL
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

กำหนดค่ากฎการส่งต่อ

  1. สร้างกฎการส่งต่อเพื่อกำหนดเส้นทางคำขอขาเข้าไปยังพร็อกซี
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

ตัวอย่างเอาต์พุต

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

การจำกัดการรับส่งข้อมูลขาเข้าไปยังบริการ Cloud Run

จำกัดการรับส่งข้อมูลขาเข้าให้ยอมรับเฉพาะคำขอภายในและคำขอที่มาจากการจัดสรรภาระงาน HTTP(S)

26cb0b2a9162e7ab.png

  1. อัปเดตบริการเพื่ออนุญาตการรับส่งข้อมูลขาเข้าจากคำขอภายในและคำขอผ่านตัวจัดสรรภาระงาน HTTP(S) เท่านั้น
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

ตัวอย่างเอาต์พุต

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. คลิกลิงก์ URL ของบริการ

8505fde7e0784bf1.png

ตอนนี้สิทธิ์เข้าถึง URL ของบริการ Cloud Run จะแสดงเป็น "ห้าม"

5. การเปิดใช้ Cloud Identity-Aware Proxy (IAP) ใน Load Balancer

IAP ช่วยให้คุณสร้างเลเยอร์การให้สิทธิ์ส่วนกลางสำหรับแอปพลิเคชันที่เข้าถึงผ่าน HTTPS คุณสามารถใช้โมเดลการควบคุมการเข้าถึงระดับแอปพลิเคชันแทนไฟร์วอลล์ระดับเครือข่ายได้

d9740402a74370a8.png

แบรนด์คือหน้าจอคำยินยอม OAuth ที่มีข้อมูลการสร้างแบรนด์สำหรับผู้ใช้ แบรนด์อาจจำกัดไว้สำหรับผู้ใช้ภายในหรือผู้ใช้สาธารณะ แบรนด์ภายในช่วยให้สมาชิกในองค์กร Google Workspace เดียวกันกับโปรเจ็กต์เข้าถึงโฟลว์ OAuth ได้ แบรนด์สาธารณะทำให้ทุกคนที่มีสิทธิ์เข้าถึงอินเทอร์เน็ตเข้าถึงขั้นตอน OAuth ได้

  1. สร้างแบรนด์
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

ตัวอย่างเอาต์พุต

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

การสร้างไคลเอ็นต์ OAuth ของ IAP

  1. สร้างไคลเอ็นต์โดยใช้ชื่อแบรนด์จากขั้นตอนก่อนหน้า
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

ตัวอย่างเอาต์พุต

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. จัดเก็บชื่อ รหัส และรหัสลับของไคลเอ็นต์
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. ใน Cloud Console ให้เลือกโปรเจ็กต์จากเมนูแบบเลื่อนลงเพื่อเลือกโปรเจ็กต์
  2. ไปที่หน้าจอขอความยินยอม OAuth ใน Cloud Console

bcb460f3ab5241f4.png

  1. คลิก "ทําให้เป็นภายนอก" ในส่วนประเภทผู้ใช้
  2. เลือก "การทดสอบ" เป็นสถานะการเผยแพร่

27fd7de6e7b7ef21.png

  1. คลิกยืนยัน

6. การจำกัดการเข้าถึงด้วย IAP

จำกัดการเข้าถึงบริการแบ็กเอนด์โดยใช้ IAP จากนั้นยืนยันว่าแอปพลิเคชันเข้าถึงไม่ได้

  1. เปิดใช้ IAP ในบริการแบ็กเอนด์
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

ยืนยันการกำหนดค่า IAP

  1. ตรวจสอบว่าใบรับรอง SSL ใช้งานได้
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. รับ URL ของบริการ
echo https://$DOMAIN

ตัวอย่างเอาต์พุต

https://34.102.234.98.nip.io
  1. คลิก URL ของบริการเพื่อเปิดพอร์ทัลพนักงาน

352b600209c3fb33.png

  1. เข้าสู่ระบบโดยใช้ข้อมูลเข้าสู่ระบบของห้องทดลอง

f7e0318388aa0739.png

  1. ปิดเบราว์เซอร์

ให้สิทธิ์ผู้ใช้เข้าถึงพอร์ทัลพนักงาน

  1. เพิ่มการเชื่อมโยงนโยบาย IAM สำหรับบทบาทของ 'roles/iap.httpsResourceAccessor' สำหรับผู้ใช้ที่สร้างไว้ในขั้นตอนก่อนหน้า
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

ตัวอย่างเอาต์พุต

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

การทดสอบการเข้าถึงบริการ

ยืนยันว่าได้รับสิทธิ์เข้าถึงพอร์ทัลพนักงานแล้ว

  1. รับ URL ของบริการ
echo https://$DOMAIN

ตัวอย่างเอาต์พุต

https://34.102.234.98.nip.io
  1. คลิก URL ของบริการเพื่อเปิดพอร์ทัลพนักงาน

86416f68c0b8152a.png

ตอนนี้คุณควรมีสิทธิ์เข้าถึงพอร์ทัลพนักงานแล้ว

(ไม่บังคับ) ทำให้การขึ้นต่อกันทั้งหมดใช้งานได้ การทำให้ Microservice เหล่านี้ใช้งานได้อาจใช้เวลาประมาณ 20 นาที

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. ยินดีด้วย

ยินดีด้วย คุณทำ Codelab เสร็จแล้ว

ขั้นตอนต่อไปที่ทำได้

ดู Codelab อื่นๆ ของ Cymbal Eats

ล้างข้อมูล

โปรดลบโปรเจ็กต์ที่มีทรัพยากรหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

การลบโปรเจ็กต์

วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างขึ้นสำหรับบทแนะนำ