แอปพลิเคชัน 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 จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าฟีเจอร์นี้พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้ไม่น่าจะเสียค่าใช้จ่ายมากนัก หากต้องการปิดใช้ทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างไว้หรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ 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. เปิดใช้ IAP และ Cloud Resource Manager Service API
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 ช่วยให้คุณใช้แอป 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 แบบ 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) ใน 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

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

(ไม่บังคับ) ติดตั้งใช้งาน 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 สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

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

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