แอปพลิเคชัน 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 ของระบบคลาวด์ การใช้งาน 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
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 Serverless ที่มีการจัดสรรภาระงาน 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 แบบ Serverless เป็นแบ็กเอนด์ไปยังบริการแบ็กเอนด์
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) บนตัวจัดสรรภาระงาน

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

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

  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

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

(ไม่บังคับ) ทำให้ทรัพยากร Dependency ทั้งหมดใช้งานได้ โดยการทำให้ 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 สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้ โปรดลบโปรเจ็กต์ที่มีทรัพยากรดังกล่าวหรือเก็บโปรเจ็กต์ไว้และลบทรัพยากรแต่ละรายการ

กำลังลบโปรเจ็กต์

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