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

1. مقدمة

ead1609267034bf7.png

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

  • تتيح لك واجهة برمجة التطبيقات On-Demand Scanning API فحص صور الحاويات يدويًا بحثًا عن الثغرات الأمنية في نظام التشغيل، إما على جهاز الكمبيوتر أو عن بُعد في Container Registry أو Artifact Registry.
  • تتيح لك واجهة برمجة التطبيقات Container Scanning API تنفيذ ميزة الكشف التلقائي عن الثغرات الأمنية في نظام التشغيل، وذلك من خلال إجراء عمليات مسح ضوئي في كل مرة تُحمِّل فيها صورة إلى Container Registry أو Artifact Registry. يؤدي تفعيل واجهة برمجة التطبيقات هذه أيضًا إلى تفعيل عمليات فحص حِزم اللغات بحثًا عن الثغرات الأمنية في Go وJava.

تتيح لك واجهة برمجة التطبيقات On-Demand Scanning API مسح الصور المخزّنة على جهاز الكمبيوتر محليًا أو عن بُعد في Container Registry أو Artifact Registry. يمنحك ذلك إمكانية التحكّم بشكل دقيق في الحاويات التي تريد فحصها بحثًا عن الثغرات. يمكنك استخدام ميزة "المسح الضوئي عند الطلب" لمسح الصور في مسار عملية التطوير المتكامل/النشر المبرمَج قبل تحديد ما إذا كنت تريد تخزينها في قاعدة بيانات مسجّلة.

ما ستتعرّف عليه

في هذا الدرس التطبيقي، ستتمكّن من تنفيذ ما يلي:

  • إنشاء صور باستخدام Cloud Build
  • استخدام Artifact Registry للحاويات
  • استخدام ميزة البحث التلقائي عن الثغرات الأمنية
  • ضبط ميزة "المسح الضوئي عند الطلب"
  • إضافة ميزة فحص الصور في عملية التطوير المستمر والمتكامل (CICD) في Cloud Build

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

إعداد البيئة حسب وتيرة الطالب واحتياجاته

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديله في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع 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

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

منح إذن الوصول لحساب خدمة 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

تعديل مسار الإنشاء لدفع الصورة الناتجة إلى "مستودع العناصر"

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.

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

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

361be7b3bf293fca.png

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

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

تشغيل مسار عملية الدمج المستمر

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

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

تشغيل عملية التكامل المستمر باستخدام الصورة الصالحة

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

gcloud builds submit

اكتمال عملية مراجعة الإصدار

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

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

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

مراجعة الصورة الصالحة في سجلّ العناصر

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

8. تهانينا!

تهانينا، لقد أكملت دورة codelab.

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

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

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

تَنظيم

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

حذف المشروع

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

تاريخ آخر تعديل: 21 آذار (مارس) 2023