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

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

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

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

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

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

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

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

אישור המקור של Build נחתם באמצעות אימות (attestation) 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 של הכלי.

אימות ידני

כדי לאמת את מקור הבנייה:

  1. אחזור אישור המקור של 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 מכיל קטע בשם 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: הנתיב לארטיפקט.

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

      Verified OK

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