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

1. نظرة عامة

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

94b06525c85408ad.png

ما هي خدمة Identity-Aware Proxy؟

Identity-Aware Proxy (IAP) هي خدمة من Google Cloud تعترض الطلبات المُرسَلة إلى تطبيقك، وتصادق على المستخدم الذي يرسل الطلب باستخدام خدمة Google Identity، ولا تسمح إلا للطلبات التي تأتي من مستخدم لديه إذن بالوصول إلى التطبيق. بالإضافة إلى ذلك، يمكنه تعديل العناوين الخاصة بالطلب لتضمين معلومات عن المستخدم الذي تمت مصادقته.

ما ستتعلمه

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

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 و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. انشر "بوابة الموظفين" باستخدام نص الإعداد البرمجي. انتظِر حتى يكتمل النص البرمجي قبل الانتقال إلى الخطوة التالية.
./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 الخاصة بواجهة مستخدم الموظف. تتيح لك مجموعات NEGs بدون خادم استخدام تطبيقات 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. إضافة مجموعة NEG بلا خادم كخادم خلفي إلى خدمة الخادم الخلفي
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 بدون خادم لتوجيه الطلبات إلى خدمة 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

إنشاء مورد شهادة طبقة المقابس الآمنة التي تديرها Google

  1. إنشاء مورد شهادة طبقة المقابس الآمنة التي تديرها 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

إنشاء عميل 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. انقر على MAKE EXTERNAL (إنشاء مستخدم خارجي) ضمن User Type (نوع المستخدم)
  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 مقابل الموارد المستخدَمة في هذا البرنامج التعليمي، احذف المشروع الذي يحتوي على الموارد أو احتفظ بالمشروع واحذف الموارد الفردية.

حذف المشروع

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