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

۱. مرور کلی

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

94b06525c85408ad.png

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

پروکسی آگاه از هویت (IAP) یک سرویس ابری گوگل است که درخواست‌های ارسالی به برنامه شما را رهگیری می‌کند، کاربری را که با استفاده از سرویس هویت گوگل درخواست را ارسال می‌کند، احراز هویت می‌کند و فقط به درخواست‌هایی اجازه عبور می‌دهد که از طرف کاربری باشند که مجاز به دسترسی به برنامه است. علاوه بر این، می‌تواند هدرهای درخواست را تغییر دهد تا شامل اطلاعات مربوط به کاربر احراز هویت شده باشد.

آنچه یاد خواهید گرفت

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

۲. تنظیمات و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

تنظیمات محیط

  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) سرویس مدیریت منابع ابری (Cloud resource manager) و IAP
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. روی لینک آدرس اینترنتی سرویس کلیک کنید

۸۶۴۱۶f۶۸c۰b۸۱۵۲a.png

۳. پیکربندی یک گروه نقطه پایانی شبکه بدون سرور (NEG)

شما یک گروه نقطه پایانی شبکه بدون سرور ( Serverless Network Endpoint Group) برای سرویس Cloud Run رابط کاربری کارمندان ایجاد خواهید کرد. NEG های بدون سرور به شما امکان می‌دهند از برنامه‌های بدون سرور Google Cloud با متعادل‌سازی بار HTTP(S) خارجی استفاده کنید.

2abe669e53c27186.png

  1. یک گروه نقطه پایانی شبکه برای سرویس رابط کاربری کارمندان ایجاد کنید.
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 را تعریف می‌کند. پیکربندی سرویس backend شامل مجموعه‌ای از مقادیر، مانند پروتکل مورد استفاده برای اتصال به backendها، تنظیمات مختلف توزیع و session، بررسی‌های سلامت و timeoutها است. این تنظیمات کنترل دقیقی بر نحوه رفتار load balancer شما ارائه می‌دهند.

  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 برای هدایت درخواست‌های ورودی به سرویس backend
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

۴. پیکربندی اجزای متعادل‌کننده بار

نمودار زیر نشان می‌دهد که متعادل‌کننده بار از یک سرور NEG backend برای هدایت درخواست‌ها به یک سرویس 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 تحت مدیریت گوگل ایجاد کنید

  1. یک منبع گواهی SSL تحت مدیریت گوگل ایجاد کنید
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) Load Balancing می‌آیند را بپذیرد.

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. روی لینک آدرس اینترنتی سرویس کلیک کنید

8505fde7e0784bf1.png

دسترسی به آدرس اینترنتی سرویس Cloud Run اکنون به عنوان ممنوعه نمایش داده می‌شود.

۵. فعال کردن پروکسی ابری آگاه از هویت (IAP) روی متعادل‌کننده بار

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. در کنسول ابری، پروژه را از منوی کشویی انتخاب پروژه انتخاب کنید
  2. به صفحه رضایت OAuth در کنسول ابری بروید

bcb460f3ab5241f4.png

  1. در قسمت نوع کاربر، روی «خارجی‌سازی» کلیک کنید.
  2. گزینه «در حال آزمایش» را به عنوان وضعیت انتشار انتخاب کنید.

۲۷fd7de6e7b7ef21.png

  1. روی تأیید کلیک کنید

۶. محدود کردن دسترسی با IAP

دسترسی به سرویس backend را با استفاده از IAP محدود کنید و سپس تأیید کنید که برنامه غیرقابل دسترس است.

  1. فعال کردن IAP در سرویس backend
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. دریافت آدرس اینترنتی سرویس
echo https://$DOMAIN

خروجی مثال

https://34.102.234.98.nip.io
  1. برای باز کردن پورتال کارمندان، روی آدرس اینترنتی سرویس کلیک کنید.

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. دریافت آدرس اینترنتی سرویس
echo https://$DOMAIN

خروجی مثال

https://34.102.234.98.nip.io
  1. برای باز کردن پورتال کارمندان، روی آدرس اینترنتی سرویس کلیک کنید.

۸۶۴۱۶f۶۸c۰b۸۱۵۲a.png

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

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

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

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

۷. تبریک می‌گویم!

تبریک می‌گویم، شما codelab را تمام کردید!

قدم بعدی چیست؟

سایر آزمایشگاه‌های کد Cymbal Eats را کاوش کنید:

تمیز کردن

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

حذف پروژه

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