تأمين بناء الحاويات

1. مقدمة

ead1609267034bf7.png

ثغرات البرامج هي نقاط ضعف يمكن أن تتسبّب في حدوث عطل غير مقصود في النظام أو تتيح للجهات المسيئة اختراق برنامجك. توفّر ميزة Container Analysis نوعَين من عمليات فحص نظام التشغيل للعثور على الثغرات الأمنية في الحاويات:

  • تتيح لك واجهة برمجة التطبيقات "المسح عند الطلب" فحص صور الحاويات يدويًا بحثًا عن ثغرات أمنية في نظام التشغيل، إما على جهاز الكمبيوتر أو عن بُعد في 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. الإعداد والمتطلبات

إعداد بيئة الاختبار الذاتي

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

b35bf95b8bf3d5d8.pnga99b7ace416376c4.pngbd84a6d3004737c5.png

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

  1. افتح Cloud Build في Cloud Console
  2. انقر على الإصدار لعرض المحتوى

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.

  1. افتح Artifact Registry في Cloud Console
  2. انقر على مستودع فحص العناصر لعرض المحتويات
  3. انقر على تفاصيل الصورة
  4. النقر على أحدث ملخّص لصورتك
  5. بعد انتهاء عملية البحث، انقر على علامة التبويب "الثغرات الأمنية" (Vulnerabilities) الخاصة بالصورة.

من علامة التبويب "الثغرات الأمنية"، ستظهر لك نتائج الفحص التلقائي للصورة التي أنشأتها للتو.

361be7b3bf293fca.png

تكون ميزة "أتمتة عملية المسح" مفعّلة تلقائيًا. استكشِف إعدادات Artifact Registry لمعرفة كيفية إيقاف/تفعيل ميزة "المسح التلقائي".

6. On Demand Scanning

هناك سيناريوهات مختلفة قد تحتاج فيها إلى إجراء عملية فحص قبل إرسال الصورة إلى مستودع. على سبيل المثال، يمكن لمطوّر حاوية فحص صورة وإصلاح المشاكل قبل إرسال الرمز إلى نظام التحكّم بالمصادر. في المثال أدناه، ستنشئ الصورة وتحلّلها محليًا قبل اتّخاذ إجراء بشأن النتائج.

إنشاء صورة

في هذه الخطوة، ستستخدم 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) 

تحتوي النتيجة على قدر كبير من البيانات حول جميع الثغرات الأمنية في الصورة.

الإبلاغ عن المشاكل الحرجة

ونادرًا ما يستخدم البشر البيانات المخزّنة في التقرير مباشرةً. ويتم عادةً استخدام النتائج من خلال عملية مبرمَجة. استخدِم الأوامر أدناه لقراءة تفاصيل التقرير وتسجيل أي ثغرات أمنية CRITICAL تم العثور عليها.

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 لاستخدام صورة أساسية لا تحتوي على ثغرات أمنية CRITICAL.

استبدِل 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

تنفيذ عملية CI باستخدام الصورة الجيدة

أرسِل الإصدار للمعالجة للتحقّق من نجاحه في حال عدم العثور على ثغرات أمنية ذات خطورة بالغة.

gcloud builds submit

مراجعة نجاح عملية الإنشاء

ستنجح النسخة التي أرسلتها للتو لأنّ الصورة المعدَّلة لا تحتوي على ثغرات أمنية خطيرة.

راجِع نجاح عملية الإنشاء في صفحة سجلّ Cloud Build.

مراجعة نتائج الفحص

مراجعة الصورة الجيدة في Artifact Registry

  1. افتح Artifact Registry في Cloud Console
  2. انقر على مستودع فحص العناصر لعرض المحتويات
  3. انقر على تفاصيل الصورة
  4. النقر على أحدث ملخّص لصورتك
  5. انقر على علامة التبويب "الثغرات الأمنية" الخاصة بالصورة.

8. تهانينا!

تهانينا، لقد أكملت درس البرمجة.

المواضيع التي تناولناها:

  • إنشاء صور باستخدام Cloud Build
  • ‫Artifact Registry للحاويات
  • البحث الآلي عن الثغرات الأمنية
  • On Demand Scanning
  • إجراء عمليات المسح الضوئي في عملية التكامل المستمر والتسليم المستمر باستخدام Cloud Build

الخطوة التالية:

تَنظيم

لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا البرنامج التعليمي، احذف المشروع الذي يحتوي على الموارد أو احتفظ بالمشروع واحذف الموارد الفردية.

حذف المشروع

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

تاريخ آخر تعديل: 21/3/2023