שימוש בסריקה על פי דרישה בצינור עיבוד הנתונים של Cloud Build

שימוש בסריקה על פי דרישה כחלק מפייפליין Cloud Build מאפשר לכם לחסום גרסאות build אם בקובץ אימג' של קונטיינר יש נקודות חולשה ברמת חומרה שתואמת לרמה מוגדרת מראש.

במדריך הזה נלמד איך להשתמש ב-Cloud Build כדי ליצור קובץ אימג' של קונטיינר מקוד המקור, לסרוק אותו כדי לזהות פגיעויות, לבדוק את רמות החומרה של הפגיעויות ולהעביר את קובץ האימג' בדחיפה ל-Artifact Registry אם לא נמצאו פגיעויות ברמת חומרה ספציפית.

מומלץ ליצור Google Cloud פרויקט חדש לצורך המדריך הזה, ולבצע את השלבים בסביבה מבודדת.

מטרות

  • יצירת קובץ אימג' באמצעות Cloud Build.
  • סורקים את התמונה שנוצרה באמצעות סריקה לפי דרישה.
  • הערכה של רמות נקודות החולשה המקובלות.
  • אחסון התמונה ב-Artifact Registry.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. התקינו את ה-CLI של Google Cloud.

  12. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  13. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init

התפקידים הנדרשים

חשבון השירות שבו משתמשים ב-Cloud Build צריך לכלול את התפקידים הבאים:

לחשבון השירות שמוגדר כברירת מחדל ב-Cloud Build יש את ההרשאות הנדרשות למאגרי Artifact Registry באותו פרויקט. אם המאגרים נמצאים באותו פרויקט שבו אתם משתמשים ב-Cloud Build, אתם צריכים להעניק רק את התפקיד On-Demand Scanning Admin (אדמין של סריקה לפי דרישה).

אם אתם משתמשים בחשבון שירות שסופק על ידי המשתמש עבור Cloud Build, אתם צריכים להעניק את שני התפקידים.

הכנת קובץ המקור

במדריך הזה תיצרו תמונה מקובץ Docker. קובץ Dockerfile הוא קובץ מקור שמכיל הוראות ל-Docker ליצירת אימג'.

  1. פותחים חלון של Terminal, יוצרים ספרייה חדשה בשם ods-tutorial ועוברים אליה:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. יוצרים קובץ בשם Dockerfile עם התוכן הבא:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

יצירת מאגר Artifact Registry

  1. מגדירים את מזהה הפרויקט לאותו פרויקט שבו הפעלתם את ממשקי ה-API:

    gcloud config set project PROJECT_ID
    
  2. יוצרים מאגר Docker בשם ods-build-repo במיקום us-central1:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. מוודאים שהמאגר נוצר בהצלחה:

    gcloud artifacts repositories list
    

יצירה וסריקה

בקטע הזה תריצו את צינור עיבוד הנתונים שלכם באמצעות קובץ הגדרות build. קובץ תצורת build מורה ל-Cloud Build איך לבצע כמה משימות על סמך המפרט שלכם.

  1. בתיקייה ods-tutorial/, יוצרים את הקובץ cloudbuild.yaml עם התוכן הבא:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    הקובץ הזה כולל את המיקום והמאגר שנוצרו קודם ב-Artifact Registry. אם מחליטים להשתמש בערכים שונים, צריך לשנות את הקובץ cloudbuild.yaml בהתאם. הערכים של PROJECT_ID ושל SEVERITY מועברים לסקריפט בפקודת ה-build.

  2. מציינים את הרמות של הפגיעותSEVERITY שרוצים לחסום ומתחילים את הבנייה.

    אפשר להשתמש בערכים הבאים עבור SEVERITY:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    אפשר לציין כמה רמות חומרה באמצעות ביטוי רגולרי.

    בדוגמה הבאה, מציינים את ערכי החומרה CRITICAL ו-HIGH. ההוראה הזו גורמת ל-Cloud Build לבדוק אם יש נקודות חולשה שמסווגות ברמת החומרה HIGH ומעלה.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    כאשר:

    • PROJECT_ID הוא מזהה הפרויקט.
    • SEVERITY מאפשרת להגדיר את רמות החומרה שרוצים לחסום. אם הסריקה על פי דרישה מוצאת נקודות חולשה שתואמות לאחת מרמות החומרה שצוינו, ה-build ייכשל.

הסבר על התוצאות

כשמגדירים את הערך של SEVERITY ל-CRITICAL|HIGH, אחרי שהסריקה לפי דרישה סורקת פגיעויות, היא בודקת אם יש פגיעויות ברמה HIGH וברמה החמורה יותר CRITICAL. אם לא נמצאו פגיעויות תואמות בתמונה, הבנייה תצליח ו-Cloud Build יעביר את התמונה ל-Artifact Registry.

הפלט אמור להיראות כך:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

אם סריקה לפי דרישה מוצאת פגיעויות מסוג HIGH או CRITICAL בתמונה, שלב ה-build‏ scan נכשל, שלבי ה-build הבאים לא מתחילים ו-Cloud Build לא מעביר תמונה ל-Artifact Registry.

הפלט אמור להיראות כך:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

יכול להיות שהתוצאות שלכם יהיו שונות, כי קוד המקור לדוגמה הוא הפצת Linux שזמינה לציבור, debian10:latest. העדכונים של הפצות Linux ונתוני הפגיעות שקשורים אליהן מתבצעים באופן שוטף.

במאמר אבטחת שרשרת אספקת התוכנה אפשר לקרוא על כלים נוספים ושיטות מומלצות שיעזרו לכם להגן על שרשרת אספקת התוכנה. Google Cloud

למידע נוסף על שיטות מומלצות לניהול פגיעויות ב-Linux, אפשר להשתמש בהדרכה בחינם באינטרנט שמספקת Linux Foundation. מידע נוסף זמין במאמר בנושא פיתוח תוכנה מאובטחת.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים בודדים

לפני שמסירים את המאגר, צריך לוודא שכל התמונות שרוצים לשמור זמינות במיקום אחר.

כדי למחוק את המאגר:

המסוף

  1. פותחים את הדף Repositories במסוף Google Cloud .

    פתיחת הדף Repositories

  2. ברשימת המאגרים, בוחרים במאגר ods-build-repo.

  3. לוחצים על Delete.

gcloud

כדי למחוק את המאגר ods-build-repo, מריצים את הפקודה הבאה:

gcloud artifacts repositories delete ods-build-repo --location=us-central1

המאמרים הבאים