تطبيق آمن بدون خادم مع خادم وكيل يستخدم الهوية (IAP)

1. نظرة عامة

وفي هذا التمرين المعملي، ستقوم بنشر بوابة الموظفين التي تسمح للموظفين بعرض الطلبات وتحديثها وحذفها من تطبيق Cymbal Eats. عليك استخدام الخادم الوكيل Identity Aware (IAP) لتأمين الوصول إلى البوابة بدون استخدام شبكة افتراضية خاصة (VPN). تساعد عمليات الشراء داخل التطبيق في تبسيط تنفيذ نموذج الوصول المعدوم، وتستغرق وقتًا أقل من استخدام شبكة VPN للعاملين عن بُعد في البيئات داخل الشركة وفي البيئات السحابية مع توفّر نقطة تحكُّم واحدة لإدارة الوصول إلى التطبيقات.

94b06525c85408ad.png

ما هو Identity-Aware Proxy؟

IAP (الخادم الوكيل للهوية) هي خدمة من Google Cloud تعترض الطلبات المُرسَلة إلى تطبيقك، وتصادق على المستخدم الذي يُجري الطلب باستخدام "خدمة تحديد الهوية من Google"، ولا تسمح بإرسال الطلبات إلا إذا كانت واردة من مستخدم مصرَّح له بالوصول إلى التطبيق. بالإضافة إلى ذلك، يمكنه تعديل رؤوس الطلبات لتضمين معلومات عن المستخدم الذي تمت مصادقته.

ما سوف تتعلمه

  • طريقة ضبط مجموعة نقاط نهاية لشبكة بدون خادم (NEG)
  • كيفية ضبط جهاز موازنة الحمل
  • كيفية تمكين الشراء داخل التطبيق لتقييد الوصول
  • كيفية تقييد الوصول باستخدام الشراء داخل التطبيق

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في 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. تفعيل واجهات برمجة التطبيقات لخدمة "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. النقر على رابط "عنوان URL للخدمة"

86416f68c0b8152a.png

3- ضبط مجموعة نقاط نهاية شبكة بدون خادم (NEG)

عليك إنشاء مجموعة نقاط نهاية في شبكة بدون خادم( Serverless NEG) لخدمة 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].

إنشاء خدمة خلفية وإضافة مجموعة نقاط نهاية الشبكة بدون خادم

وتحدِّد خدمة الخلفية كيفية توزيع 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. إضافة مجموعة نقاط نهاية الشبكة بدون خادم كخلفية لخدمة الخلفية
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 بدون خادم لتوجيه الطلبات إلى خدمة تشغيل سحابي بدون خادم.

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].

تقييد الدخول إلى خدمة تشغيل السحابة الإلكترونية

يمكنك تقييد عدد الزيارات الواردة من أجل قبول الطلبات الداخلية والطلبات الواردة من خلال موازنة الحمل لبروتوكول 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) على جهاز موازنة الحمل

يتيح لك الشراء داخل التطبيق إنشاء طبقة تفويض مركزية للتطبيقات التي يتم الوصول إليها عن طريق 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 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- تقييد الوصول من خلال الشراء داخل التطبيق

تقييد الوصول إلى خدمة الخلفية باستخدام الشراء داخل التطبيق ثم التحقُّق من عدم إمكانية الوصول إلى التطبيق.

  1. تفعيل الشراء داخل التطبيق في خدمة الخلفية
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

التحقّق من ضبط الشراء داخل التطبيق

  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. إضافة التزام سياسة إدارة الهوية وإمكانية الوصول لدور "'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 مقابل الموارد المُستخدَمة في هذا الدليل التوجيهي، يمكنك إما حذف المشروع الذي يحتوي على الموارد أو الاحتفاظ بالمشروع وحذف الموارد الفردية.

حذف المشروع

أسهل طريقة لإزالة الفوترة هي حذف المشروع الذي أنشأته للبرنامج التعليمي.