برنامه امن بدون سرور با پروکسی آگاه از هویت (IAP)

1. بررسی اجمالی

در این آزمایشگاه، پورتال کارمندی را مستقر خواهید کرد که به کارمندان اجازه می دهد تا سفارشات را از برنامه Cymbal Eats مشاهده، به روز رسانی و حذف کنند. شما از Identity Aware Proxy (IAP) برای ایمن کردن دسترسی به پورتال بدون استفاده از شبکه خصوصی مجازی (VPN) استفاده خواهید کرد. IAP پیاده‌سازی یک مدل دسترسی بدون اعتماد را ساده می‌کند و زمان کمتری نسبت به VPN برای کارگران از راه دور، هم در محل و هم در محیط‌های ابری با یک نقطه کنترل واحد برای مدیریت دسترسی به برنامه‌های شما می‌گیرد.

94b06525c85408ad.png

پروکسی با آگاهی از هویت چیست؟

Identity-Aware Proxy (IAP) یک سرویس Google Cloud است که درخواست‌های ارسال شده به برنامه شما را رهگیری می‌کند، کاربر درخواستی را با استفاده از سرویس هویت Google احراز هویت می‌کند و تنها در صورتی به درخواست‌ها اجازه می‌دهد که از طرف کاربری باشند که مجاز به دسترسی به برنامه هستند. علاوه بر این، می‌تواند سرصفحه‌های درخواست را طوری تغییر دهد که اطلاعات مربوط به کاربر تأیید شده را شامل شود.

آنچه خواهید آموخت

  • نحوه پیکربندی یک گروه نقطه پایانی شبکه بدون سرور (NEG)
  • نحوه پیکربندی یک متعادل کننده بار
  • نحوه فعال کردن IAP برای محدود کردن دسترسی
  • نحوه محدود کردن دسترسی با استفاده از IAP

2. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

راه اندازی محیط

  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. پورتال Employee را با استفاده از اسکریپت راه اندازی مستقر کنید. قبل از رفتن به مرحله بعدی منتظر بمانید تا اسکریپت کامل شود
./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. پیکربندی یک گروه نقطه پایانی شبکه بدون سرور (NEG)

شما یک گروه نقطه پایانی شبکه بدون سرور ( NEG بدون سرور ) برای سرویس UI کارمند Cloud Run ایجاد خواهید کرد. NEG های بدون سرور به شما امکان می دهند از برنامه های بدون سرور 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].

یک سرویس Backend ایجاد کنید و NEG بدون سرور را اضافه کنید

یک سرویس Backend نحوه توزیع ترافیک را در 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 بدون سرور را به عنوان یک Backend به سرویس Backend اضافه کنید
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. پیکربندی اجزای Load Balancer

نمودار زیر نشان می دهد که متعادل کننده بار از یک باطن NEG بدون سرور برای هدایت درخواست ها به یک سرویس Cloud Run بدون سرور استفاده می کند.

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. سرویس را به‌روزرسانی کنید تا فقط ترافیک ورودی از درخواست‌ها و درخواست‌های داخلی از طریق Load Balancer 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 است که حاوی اطلاعات نام تجاری برای کاربران است. برندها ممکن است به کاربران داخلی یا عمومی محدود شوند. یک نام تجاری داخلی به جریان OAuth اجازه می دهد تا توسط یکی از اعضای همان سازمان Google Workspace به عنوان پروژه دسترسی پیدا کند. یک نام تجاری عمومی جریان 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. در قسمت User Type روی MAKE EXTERNAL کلیک کنید
  2. Testing را به عنوان وضعیت انتشار انتخاب کنید

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 ACTIVE است
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

اکنون باید به پورتال کارمند دسترسی داشته باشید.

(اختیاری) استقرار همه وابستگی ها، استقرار این میکروسرویس ها ممکن است 20 دقیقه طول بکشد.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

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

7. تبریک می گویم!

تبریک می گویم، شما نرم افزار کد را تمام کردید!

بعدش چیه:

سایر کدهای Cymbal Eats را کاوش کنید:

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، یا پروژه حاوی منابع را حذف کنید یا پروژه را نگه دارید و منابع فردی را حذف کنید.

حذف پروژه

ساده ترین راه برای حذف صورتحساب، حذف پروژه ای است که برای آموزش ایجاد کرده اید.