1. مقدمة

ثغرات البرامج هي نقاط ضعف يمكن أن تتسبّب في حدوث عطل غير مقصود في النظام أو تتيح للجهات المسيئة اختراق برنامجك. توفّر ميزة Container Analysis نوعَين من عمليات فحص نظام التشغيل للعثور على الثغرات الأمنية في الحاويات:
- تتيح لك واجهة برمجة التطبيقات On-Demand Scanning فحص صور الحاويات يدويًا بحثًا عن ثغرات أمنية في نظام التشغيل، إما على جهاز الكمبيوتر أو عن بُعد في Container Registry أو Artifact Registry.
- تتيح لك واجهة برمجة التطبيقات Container Scanning API إمكانية إعداد عملية رصد الثغرات الأمنية في نظام التشغيل بشكل آلي، وذلك من خلال فحص كل صورة في كل مرة تنشر فيها صورة إلى Container Registry أو Artifact Registry. يؤدي تفعيل واجهة برمجة التطبيقات هذه إلى تفعيل عمليات فحص حِزم اللغات بحثًا عن الثغرات الأمنية في Go وJava.
تتيح لك واجهة برمجة التطبيقات "المسح الضوئي عند الطلب" فحص الصور المخزّنة محليًا على جهاز الكمبيوتر أو عن بُعد في Container Registry أو Artifact Registry. يتيح لك ذلك التحكّم بدقة في الحاويات التي تريد فحصها بحثًا عن الثغرات الأمنية. يمكنك استخدام ميزة "الفحص عند الطلب" لفحص الصور في مسار CI/CD قبل تحديد ما إذا كنت تريد تخزينها في سجلّ.
ما ستتعلمه
في هذا الدرس التطبيقي، ستتعلّم كيفية تنفيذ ما يلي:
- إنشاء صور باستخدام Cloud Build
- استخدام Artifact Registry للحاويات
- استخدام ميزة البحث التلقائي عن الثغرات الأمنية
- ضبط ميزة "المسح الضوئي عند الطلب"
- إضافة ميزة فحص الصور في عملية التكامل المستمر والتسليم المستمر (CICD) في Cloud Build
2. الإعداد والمتطلبات
إعداد البيئة بوتيرة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
إعداد البيئة
في Cloud Shell، اضبط رقم تعريف مشروعك ورقم المشروع. احفظها كمتغيرات PROJECT_ID وPROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
تفعيل الخدمات
فعِّل جميع الخدمات اللازمة:
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
3- إنشاء صور باستخدام Cloud Build
في هذا القسم، ستنشئ مسار إنشاء آليًا لإنشاء صورة الحاوية وفحصها ثم تقييم النتائج. إذا لم يتم العثور على ثغرات أمنية خطيرة، سيتم إرسال الصورة إلى المستودع. في حال العثور على ثغرات أمنية CRITICAL، سيتعذّر إنشاء الإصدار وسيتم الخروج منه.
منح إذن الوصول إلى حساب خدمة Cloud Build
سيحتاج Cloud Build إلى أذونات للوصول إلى واجهة برمجة التطبيقات الخاصة بالفحص عند الطلب. امنح الإذن بالوصول باستخدام الأوامر التالية.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
إنشاء دليل عمل والانتقال إليه
mkdir vuln-scan && cd vuln-scan
تحديد صورة نموذجية
أنشئ ملفًا باسم Dockerfile يتضمّن المحتوى التالي.
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
أنشئ ملفًا باسم main.py يتضمّن المحتوى التالي
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
إنشاء مسار Cloud Build
سينشئ الأمر التالي ملف cloudbuild.yaml في الدليل الذي سيتم استخدامه في العملية المبرمَجة. في هذا المثال، تقتصر الخطوات على عملية التصميم للحاوية. ومع ذلك، في الواقع، عليك تضمين تعليمات واختبارات خاصة بالتطبيق بالإضافة إلى خطوات الحاوية.
أنشئ الملف باستخدام الأمر التالي.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
تشغيل مسار التكامل المستمر
إرسال الإصدار للمعالجة
gcloud builds submit
مراجعة تفاصيل الإصدار
بعد بدء عملية التصميم، راجِع مستوى التقدّم في لوحة بيانات Cloud Build.
- افتح Cloud Build في Cloud Console
- انقر على الإصدار لعرض المحتوى
4. Artifact Registry للحاويات
إنشاء مستودع Artifact Registry
في هذا الدرس التطبيقي، ستستخدم Artifact Registry لتخزين صورك وفحصها. أنشئ المستودع باستخدام الأمر التالي.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
اضبط Docker لاستخدام بيانات اعتماد gcloud عند الوصول إلى Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
تعديل مسار Cloud Build
عدِّل مسار الإنشاء لدفع الصورة الناتجة إلى Artifact Registry.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
تشغيل مسار التكامل المستمر
إرسال الإصدار للمعالجة
gcloud builds submit
5- البحث الآلي عن الثغرات الأمنية
يتم تشغيل عملية فحص العناصر تلقائيًا في كل مرة ترسل فيها صورة جديدة إلى Artifact Registry أو Container Registry. يتم تعديل معلومات الثغرات الأمنية باستمرار عند اكتشاف ثغرات جديدة. في هذا القسم، ستراجع الصورة التي أنشأتها للتوّ ونقلتها إلى Artifact Registry، وستستكشف نتائج الثغرات الأمنية.
مراجعة تفاصيل الصورة
بعد اكتمال عملية الإنشاء السابقة، راجِع نتائج الصورة والثغرات الأمنية في لوحة بيانات Artifact Registry.
- افتح Artifact Registry في Cloud Console
- انقر على مستودع فحص العناصر لعرض المحتوى
- انقر على تفاصيل الصورة
- النقر على أحدث ملخّص لصورتك
- بعد انتهاء عملية البحث، انقر على علامة التبويب "الثغرات الأمنية" (Vulnerabilities) الخاصة بالصورة.
من علامة التبويب "الثغرات الأمنية"، ستظهر لك نتائج الفحص التلقائي للصورة التي أنشأتها للتو.

تكون ميزة "أتمتة عملية المسح" مفعّلة تلقائيًا. استكشِف إعدادات Artifact Registry لمعرفة كيفية إيقاف/تفعيل ميزة "المسح التلقائي".
6. الفحص عند الطلب
هناك سيناريوهات مختلفة قد تحتاج فيها إلى إجراء فحص قبل إرسال الصورة إلى مستودع. على سبيل المثال، يمكن لمطوّر حاوية فحص صورة وإصلاح المشاكل قبل إرسال الرمز إلى نظام التحكّم بالمصادر. في المثال أدناه، ستنشئ الصورة وتحلّلها محليًا قبل اتّخاذ إجراء بشأن النتائج.
إنشاء صورة
في هذه الخطوة، ستستخدم Docker المحلي لإنشاء الصورة في ذاكرة التخزين المؤقت المحلية.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
مسح الصورة ضوئيًا
بعد إنشاء الصورة، اطلب إجراء فحص لها. يتم تخزين نتائج الفحص في خادم بيانات وصفية. يكتمل العمل مع تحديد موقع النتائج في خادم البيانات الوصفية.
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
مراجعة ملف المخرجات
يُرجى تخصيص بعض الوقت لمراجعة نتائج الخطوة السابقة التي تم تخزينها في ملف scan_id.txt. لاحظ الموقع الجغرافي لنتائج الفحص في خادم البيانات الوصفية.
cat scan_id.txt
مراجعة نتائج الفحص التفصيلية
لعرض النتائج الفعلية لعملية الفحص، استخدِم الأمر list-vulnerabilities في موقع التقرير المذكور في ملف الإخراج.
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
تحتوي النتيجة على قدر كبير من البيانات حول جميع الثغرات الأمنية في الصورة.
الإبلاغ عن المشاكل الحرجة
ونادرًا ما يستخدم البشر البيانات المخزّنة في التقرير مباشرةً. ويتم عادةً استخدام النتائج من خلال عملية مبرمَجة. استخدِم الأوامر أدناه لقراءة تفاصيل التقرير وتسجيل أي ثغرات أمنية تم العثور عليها
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
ستكون نتيجة هذا الأمر
Failed vulnerability check for CRITICAL level
7. إجراء عمليات المسح الضوئي في عملية التكامل المستمر والتسليم المستمر باستخدام Cloud Build
منح إذن الوصول إلى حساب خدمة Cloud Build
سيحتاج Cloud Build إلى أذونات للوصول إلى واجهة برمجة التطبيقات الخاصة بالفحص عند الطلب. امنح الإذن بالوصول باستخدام الأوامر التالية.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
تعديل مسار Cloud Build
سينشئ الأمر التالي ملف cloudbuild.yaml في الدليل الذي سيتم استخدامه في العملية المبرمَجة. في هذا المثال، تقتصر الخطوات على عملية التصميم للحاوية. ومع ذلك، في الواقع، عليك تضمين تعليمات واختبارات خاصة بالتطبيق بالإضافة إلى خطوات الحاوية.
أنشئ الملف باستخدام الأمر التالي.
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
تشغيل مسار التكامل المستمر
أرسِل الإصدار للمعالجة للتحقّق من تعطُّل الإصدار عند العثور على ثغرة أمنية ذات خطورة بالغة.
gcloud builds submit
تعذُّر إنشاء المراجعة
ستتعذّر عملية إنشاء الإصدار الذي أرسلته للتو لأنّ الصورة تحتوي على ثغرات أمنية خطيرة.
مراجعة خطأ الإنشاء في صفحة سجلّ Cloud Build
إصلاح الثغرة الأمنية
عدِّل Dockerfile لاستخدام صورة أساسية لا تحتوي على ثغرات أمنية خطيرة.
استبدِل Dockerfile لاستخدام صورة Debian 10 باستخدام الأمر التالي
cat > ./Dockerfile << EOF
from python:3.8-slim
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
تنفيذ عملية التكامل المستمر باستخدام الصورة الجيدة
أرسِل الإصدار للمعالجة للتحقّق من نجاحه في حال عدم العثور على ثغرات أمنية ذات خطورة بالغة.
gcloud builds submit
مراجعة نجاح عملية الإنشاء
سيكون الإصدار الذي أرسلته للتو ناجحًا لأنّ الصورة المعدَّلة لا تحتوي على ثغرات أمنية CRITICAL.
راجِع نجاح عملية الإنشاء في صفحة سجلّ Cloud Build.
مراجعة نتائج الفحص
مراجعة الصورة الجيدة في Artifact Registry
- افتح Artifact Registry في Cloud Console
- انقر على مستودع فحص العناصر لعرض المحتوى
- انقر على تفاصيل الصورة
- النقر على أحدث ملخّص لصورتك
- انقر على علامة التبويب "الثغرات الأمنية" الخاصة بالصورة.
8. تهانينا!
تهانينا، لقد أكملت درس البرمجة.
المواضيع التي تناولناها:
- إنشاء صور باستخدام Cloud Build
- Artifact Registry للحاويات
- البحث الآلي عن الثغرات الأمنية
- الفحص عند الطلب
- إجراء عمليات المسح الضوئي في عملية التكامل المستمر والتسليم المستمر باستخدام Cloud Build
الخطوة التالية:
- تأمين عمليات نشر الصور في Cloud Run وGoogle Kubernetes Engine | مستندات Cloud Build
- بدء الاستخدام السريع: ضبط سياسة Binary Authorization باستخدام GKE | Google Cloud
تَنظيم
لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا البرنامج التعليمي، احذف المشروع الذي يحتوي على الموارد أو احتفظ بالمشروع واحذف الموارد الفردية.
حذف المشروع
أسهل طريقة لإيقاف الفوترة هي حذف المشروع الذي أنشأته لتنفيذ البرنامج التعليمي.
—
تاريخ آخر تعديل: 21/3/2023