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

1. مقدمة

ead1609267034bf7.png

ثغرات البرامج هي نقاط ضعف يمكن أن تتسبّب في حدوث عطل غير مقصود في النظام أو تتيح للجهات المسيئة اختراق برنامجك. توفّر ميزة 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. الإعداد والمتطلبات

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

  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 دولار أمريكي.

إعداد البيئة

في 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. الفحص عند الطلب

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

إنشاء صورة

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

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

8. تهانينا!

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

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

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

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

تَنظيم

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

حذف المشروع

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

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