אימות המקור של ה-build

חבילות Assured Open Source Software (Assured OSS) עומדות בדרישות של רמה 2 של Supply-chain Levels for Software Artifacts (SLSA), שדורשת אישור מקור של Build כחלק מהמטא-נתונים של האבטחה. כדי לוודא שהחבילה תקינה, אתם יכולים לאמת את המטא-נתונים של אישור המקור של ה-build.

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

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

  • מתקינים את cosign כדי לאמת את החתימה באישור המקור של Build.

מגדירים אימות

למידע נוסף על הגדרת אימות, ראו הגדרת אימות.

אימות של אישור המקור של Build

אישור המקור של ה-build נחתם באמצעות אישור in-toto, שמשתמש בפורמט מעטפת dsse. כלומר, החתימה שנוצרת מכילה את החתימה העטופה ואת הנתונים הגולמיים.

שימוש בכלי aoss-verifier

  1. כדי לאמת את אישור המקור של Build, מתקינים את הכלי aoss-verifier.

  2. מייצאים את $(go env GOPATH)/bin ומריצים את הפקודה aoss-verifier verify-package עם הדגל --verify_build_provenance.

    aoss-verifier verify-package \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       --artifact_path ARTIFACT_PATH \
       --verify_build_provenance \
       [--disable_certificate_verification] \
       [--temp_downloads_path TEMP_DOWNLOADS_DIR_PATH] \
       [--disable_deletes]
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫LANGUAGE: שפת החבילה. הערך חייב להיות באותיות קטנות.
    • ‫PACKAGE_ID: ב-Java, הפורמט הוא groupId:artifactId. ב-Python, הפורמט הוא packageName. הערך חייב להיות באותיות קטנות.
    • ‫VERSION: גרסת החבילה.
    • ‫ARTIFACT_PATH: הנתיב לקובץ הנתונים בספרייה המקומית שרוצים לאמת. משתמשים בסיומות הקבצים הבאות:
      • סיומת הקובץ jar של חבילת Java
      • סיומת הקובץ whl של חבילת Python

    ‫--disable_certificate_verification הוא דגל אופציונלי שמאפשר לדלג על ההתאמה של אישור הקצה לאישור הבסיס דרך שרשרת האישורים, אם משתמשים בו.

    ‫--temp_downloads_path הוא דגל אופציונלי להגדרת הנתיב שבו רוצים להוריד את הקבצים. החלפת TEMP_DOWNLOADS_DIR_PATH. אם לא מגדירים את הדגל הזה, הקבצים יורדים לתיקייה tmp_downloads בספרייה הנוכחית.

    ‫--disable_deletes הוא דגל אופציונלי ששומר את הקבצים שהורדתם. כברירת מחדל, הכלי מנקה את כל הקבצים שהורדו.

מידע נוסף זמין בקובץ README של הכלי.

אימות ידני

כדי לאמת את אישור המקור של Build:

  1. אחזור של אישור המקור של Build.

    הדרך לגשת לאישור המקור של ה-Build תלויה באופן שבו אתם ניגשים למטא-נתונים של האבטחה.

    מידע נוסף זמין בקטע הקוד לדוגמה של המטא-נתונים:

    {
      "creationTime": "2023-03-25T05:32:23Z",
      "buildDetails": [
       {
         "packageFileName": "jackson-databind-2.13.3.jar",
         "envelope": {
         "payload": "eyJfdHlwZSI6Imh0d……………",
         "payloadType": "application/vnd.in-toto+json",
         "signatures": [
            "sig": "eyJwYXlsb2FkVHlwZSI6Im……",
            "keyid": "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
           }
         ]
       },
      "buildProvenance": "{\"_type\":\"https://in-toto.io/Statement/v0.1…"
    .....
    
    

    קטע קוד לדוגמה של מטא-נתונים:

    {'BuildOccurrence': name: "projects/cloud-aoss/occurrences/06c514bb-1069-4cde-8d68-b1306f19535a"
    resource_uri: "jackson-databind-2.13.3.jar@sha256:4c01a14673bc1cd4a2df337a3b4e695af0a6ed8ac6be19c9e4077377fb8adf92"
    note_name: "projects/cloud-aoss/notes/tekton-cloudbuild-intoto"
    kind: BUILD
    create_time {
      seconds: 1665556616
      nanos: 891004000
    }
    ……
    ……
    }
    envelope {
      payload: "{\"_type\":\"https://in-toto.io/Statement/v0.1\", ….."
      payload_type: "application/vnd.in-toto+json"
      signatures {
        sig: "{\"payloadType\":\"application/vnd.in-toto+json\",....."
        keyid: "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
      }
    }
    ,
    …
    
    
  2. מאחזרים את החתימה של אישור המקור של ה-build.

    אישור המקור של ה-Build מכיל קטע בשם Envelope, שמכיל חתימות בתור EnvelopeSignature. כדי לאחזר את החתימה, פועלים לפי השלבים הבאים:

    1. שומרים את הנתונים של sig בקובץ בשם signature.txt.
    2. בודקים אם המטא-נתונים הורדו באמצעות הסקריפט של המטא-נתונים.

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

      כדי לשנות את החתימה, מריצים את הפקודה הבאה:

      cat signature.txt | sed -e 's/\\"/"/g' > signature.sig
      

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

      כדי לפענח את החתימה, משתמשים בפקודה הבאה:

      cat signature.txt | tr '\-_' '+/' | base64 -d > signature.sig
      
  3. מאחזרים את המפתח הציבורי של אישור המקור של ה-build.

    הקטע EnvelopeSignature באישור המקור של ה-build מכיל את ההפניה למפתח שמשמש לחתימה על אישור המקור של ה-build. המפתח מאוחסן באחד מהפורמטים הבאים:

    1. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME
    2. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION

      כאשר KEY_NAME ו-KEY_VERSION הם השם והגרסה של המפתח של Cloud Key Management Service.

    המפתח הציבורי מאוחסן בקטגוריה של Cloud Storage שבבעלות Assured OSS.

    מאחזרים את המפתח הציבורי באמצעות Google Cloud CLI. משתמשים באחת מהפקודות הבאות:

    • אם רק KEY_NAME קיים:

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-public.pem PATH_TO_LOCAL_STORE
      
    • אם גם KEY_NAME וגם KEY_VERSION קיימים:

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-KEY_VERSION-public.pem PATH_TO_LOCAL_STORE
      

    מחליפים את הערכים הבאים :

    • ‫KEY_NAME בשם של המפתח ב-Cloud Key Management Service.
    • ‫KEY_VERSION בגרסה של המפתח ב-Cloud Key Management Service.
    • ‫PATH_TO_LOCAL_STORE מחליפים בשם של הנתיב המקומי לאחסון המפתח הציבורי.
  4. מאמתים את החתימה של המקור.

    1. כדי לאמת את החתימה, מריצים את הפקודה הבאה:

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=false /dev/null
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫KEY_REF: הנתיב למפתח הציבורי שהורדתם בשלב הקודם.
      • ‫signature.sig: הקובץ שמכיל את החתימה שאוחזרה בשלב הקודם.

      אחרי שהפקודה פועלת בהצלחה, מתקבל הפלט הבא:

      Verified OK

    2. כדי לאמת גם את גיבוב פריט המידע שמשויך למקור, משתמשים בפקודה הבאה:

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=true ARTIFACT_PATH 
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫KEY_REF: הנתיב למפתח הציבורי שהורדתם בשלב הקודם.
      • ‫signature.sig: הקובץ שמכיל את החתימה שאוחזרה בשלב הקודם.
      • ‫ARTIFACT_PATH: הנתיב לקובץ ה-artifact.

      אחרי שהפקודה פועלת בהצלחה, מתקבל הפלט הבא:

      Verified OK

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