חבילות Assured OSS נוצרות בהתאם לתקן SLSA ברמה 2. הוכחת מקוריות של בנייה מסופקת כחלק ממטא-נתוני האבטחה. בדף הזה מוסבר איך לאמת את המטא-נתונים של מקור הבנייה.
המסמך הזה רלוונטי לתוכנית בחינם. מידע על מקורות הבנייה בגרסת Premium זמין במאמר גישה למטא-נתונים של אבטחה ואימות חבילות.
לפני שמתחילים
- מתקינים את cosign כדי לאמת את החתימה במקור של הבנייה.
מגדירים אימות
למידע על הגדרת אימות, ראו הגדרת אימות.
אימות המקור של ה-build
אישור המקור של Build נחתם באמצעות אימות (attestation) in-toto, שבתורו משתמש בפורמט המעטפה dsse. המשמעות היא שהחתימה שנוצרה מכילה את החתימה העוטפת ואת הנתונים הגולמיים.
שימוש בכלי aoss-verifier
כדי לאמת את אישור המקור של Build, צריך להתקין את הכלי aoss-verifier.
מייצאים את
$(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.
הגישה למוצא של הגרסה משתנה בהתאם לאופן שבו ניגשים למטא-נתונים של האבטחה.
- אם ניגשים למטא-נתונים של אבטחה באמצעות Cloud Storage, נתוני השושלת של הבנייה זמינים כחלק מהמטא-נתונים של
Build InformationבשדהbuildDetails.
מידע נוסף זמין בקטע הקוד לדוגמה של מטא-נתונים שבהמשך:
{ "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…" .....- אם ניגשים למטא-נתונים של אבטחה באמצעות Artifact Analysis API, אישור המקור של Build מאוחסן בקטע
BuildOccurrenceשל המטא-נתונים של האבטחה.
דוגמה לקטע קוד של מטא-נתונים:
{'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" } } , …- אם ניגשים למטא-נתונים של אבטחה באמצעות Cloud Storage, נתוני השושלת של הבנייה זמינים כחלק מהמטא-נתונים של
אחזור החתימה של מקור הבנייה.
אישור המקור של Build מכיל קטע בשם Envelope שמכיל חתימות בתור EnvelopeSignature. כדי לאחזר את החתימה:
- מאחסנים את נתוני
sigבקובץ בשםsignature.txt. בודקים אם המטא-נתונים הורדו באמצעות סקריפט המטא-נתונים.
אם המטא-נתונים הורדו באמצעות סקריפט המטא-נתונים, צריך לשנות את החתימה ולאחסן אותה בקובץ אחר בשם
signature.sig.כדי לשנות את החתימה, מריצים את הפקודה הבאה:
cat signature.txt | sed -e 's/\\"/"/g' > signature.sigאם המטא-נתונים לא הורדו באמצעות סקריפט המטא-נתונים, צריך לפענח את החתימה ולאחסן אותה בקובץ אחר בשם
signature.sig.כדי לפענח את החתימה, משתמשים בפקודה הבאה:
cat signature.txt | tr '\-_' '+/' | base64 -d > signature.sig
- מאחסנים את נתוני
שליפה של המפתח הציבורי של מקור ה-build.
הקטע EnvelopeSignature באישור המקור של Build מכיל את ההפניה למפתח שמשמש לחתימה על אישור המקור של Build. המפתח מאוחסן באחד מהפורמטים הבאים:
gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAMEgcpkms://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 מחליפים בשם של הנתיב המקומי לאחסון המפתח הציבורי.
מאמתים את חתימת המקור.
כדי לאמת את החתימה, מריצים את הפקודה הבאה:
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כדי לאמת גם את הגיבוב של הארטיפקט שמשויך למוצא, משתמשים בפקודה הבאה:
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