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

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

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: مارس 23, 2023
account_circleتأليف: Christopher Grant

1. مقدمة

ead1609267034bf7.png

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

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

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

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

تشغيل مسار CI

إرسال الإصدار لتتم معالجته

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

عدِّل مسار الإصدار لإرسال الصورة الناتجة إلى 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

تشغيل مسار CI

إرسال الإصدار لتتم معالجته

gcloud builds submit

5. الفحص الآلي للثغرات الأمنية

يتم تشغيل فحص العناصر تلقائيًا في كل مرة ترسل فيها صورة جديدة إلى Artifact Registry أو Container Registry. يتم تحديث معلومات الثغرات الأمنية باستمرار عند اكتشاف ثغرات جديدة. في هذا القسم، ستراجع الصورة التي أنشأتها للتو وأرسلتها إلى Artifact Registry وتستكشف نتائج الثغرات الأمنية.

مراجعة تفاصيل الصورة

بعد اكتمال عملية التصميم السابقة، راجِع الصورة ونتائج الثغرات الأمنية في لوحة بيانات Artifact Registry.

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

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

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

مراجعة ملف الإخراج

يُرجى تخصيص بعض الوقت لمراجعة نتائج الخطوة السابقة التي تم تخزينها في ملف delivery_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. الفحص في CICD باستخدام 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

سيؤدي الأمر التالي إلى إنشاء ملف 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

تشغيل مسار CI

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

gcloud builds submit

تعذّر إصدار المراجعة

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

مراجعة المشاكل التي تعذّر تنفيذها في صفحة سجلّ إنشاء Cloud

إصلاح الثغرة الأمنية

عليك تعديل الملف الشامل لاستخدام صورة أساسية لا تحتوي على ثغرات أمنية خطيرة.

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

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

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

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

8. تهانينا

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز.

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

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

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

تَنظيم

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

حذف المشروع

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

تاريخ التعديل الأخير: 21/3/23