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

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

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

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

מטרות

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

עלויות

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

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

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

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

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

  1. 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

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

  3. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  4. Install the Google Cloud CLI.

  5. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

    gcloud init

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

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

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

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

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

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

  1. פותחים טרמינל, יוצרים ספרייה חדשה בשם 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. אם לא נמצאו נקודות חולשה תואמות בקובץ האימג', ה-build יצליח ו-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

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