גישה למטא-נתונים של אבטחה ואימות חבילות

ב-Assured Open Source Software (או Assured OSS) יש מטא-נתונים של אבטחה לכל חבילה ולכל גרסת חבילה שזמינות. אפשר לגשת למטא-נתונים האלה בקטגוריה של Cloud Storage ב-assuredoss-metadata כדי לבדוק את פרטי ה-build, סטטוס נקודות החולשה, תוצאות הבדיקה ופרטי הרישיון. לתיאור של המטא-נתונים של האבטחה, ראו שדות של מטא-נתונים של אבטחה.

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

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

  1. שילוב של Assured OSS עם Security Command Center.

  2. מאמתים את הקישוריות ל-Assured OSS של חשבונות השירות המבוקשים.

חילוץ המטא-נתונים

כדי להוריד את המטא-נתונים, אפשר להשתמש בפקודות gcloud או curl. כדי ליצור את כתובת ה-URL של שניהם, משתמשים בפרטים הבאים:

  • שפה: java,‏ python,‏ golang או javascript. הערך חייב להיות באותיות קטנות.
  • ‫Package_ID: אחד מהבאים:

    • Java:‏ groupId:artifactId
    • Python:‏ packageName
    • ‫JavaScript‏ (NPM): ‏‎@scope/package-name או package-name
    • Go:‏ packageName

    הערך חייב להיות באותיות קטנות.

  • גרסה: גרסת החבילה.

כתובת ה-URL צריכה להיות בפורמט הבא:

gcloud

gs://assuredoss-metadata/language/package_id/version/metadata.json

כתובת ה-URL חייבת להיות באותיות קטנות.

כתובות URL לדוגמה:

  • כתובת URL לדוגמה ב-Python: ‏gs://assuredoss-metadata/python/blessed/1.20.0/metadata.json

  • כתובת URL לדוגמה ב-Java: ‏gs://assuredoss-metadata/java/org.apache.logging.log4j:log4j-core/2.17.1/metadata.json

  • כתובת URL לדוגמה של JavaScript: ‏gs://assuredoss-metadata/javascript/@stoplight/spectral-core/0.0.0/metadata.json

  • כתובת URL לדוגמה: gs://assuredoss-metadata/golang/github.com/rs/zerolog/1.9.1/metadata.json

curl

https://storage.googleapis.com/assuredoss-metadata/language/package_id/version/metadata.json

כתובת ה-URL חייבת להיות באותיות קטנות.

כתובות URL לדוגמה:

  • כתובת URL לדוגמה ב-Python: ‏https://storage.googleapis.com/assuredoss-metadata/python/blessed/1.20.0/metadata.json

  • כתובת URL לדוגמה ב-Java: ‏https://storage.googleapis.com/assuredoss-metadata/java/org.apache.logging.log4j:log4j-core/2.17.1/metadata.json

  • כתובת URL לדוגמה של JavaScript: ‏https://storage.googleapis.com/assuredoss-metadata/javascript/@stoplight/spectral-core/0.0.0/metadata.json

  • כתובת URL לדוגמה: https://storage.googleapis.com/assuredoss-metadata/golang/github.com/rs/zerolog/1.9.1/metadata.json

  1. מורידים את המטא-נתונים:

gcloud

gcloud storage cp "gs://assuredoss-metadata/language/package_id/version/metadata.json" outputFolderLocation

curl

curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -L https://storage.googleapis.com/assuredoss-metadata/language/package_id/version/metadata.json -o metadata.json

אתם יכולים לאמת את החתימות. יש שתי אפשרויות:

אימות החתימות של חבילות שהורדו באמצעות הכלי aoss-verifier

משתמשים בכלי aoss-verifier כדי לאמת את המטא-נתונים של החבילה.

לפני שמשתמשים בכלי הזה, צריך להתקין את Go.

  1. מתקינים את הכלי aoss-verifier.

  2. מייצאים את $(go env GOPATH)/bin.

  3. מריצים את הפקודה aoss-verifier verify-metadata.

    aoss-verifier verify-metadata \
       --metadata_type TYPE \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       [--disable_certificate_verification] \
       [--temp_downloads_path TEMP_DOWNLOADS_DIR_PATH] \
       [--disable_deletes]
    

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

    • ‫TYPE: הערכים האפשריים הם premiuminfo.
    • ‫LANGUAGE: שפת החבילה. הערך חייב להיות באותיות קטנות.
    • ‫PACKAGE_ID: ב-Java, הפורמט הוא groupId:artifactId. ב-Python וב-Go, הפורמט הוא packageName. ב-JavaScript‏ (NPM), הפורמט הוא @scope/package-name או package-name. הערך חייב להיות באותיות קטנות.
    • ‫VERSION: גרסת החבילה.

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

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

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

מידע נוסף זמין בקובץ README.

אימות ידני של החתימות של חבילות שהורדו

אתם יכולים לאמת את החתימה של פריט המידע שנוצר רק לקובצי ה-binary שנוצרו באופן מאובטח על ידי Assured OSS, ולא לאלה שסופקו על ידי Assured OSS דרך שרתי proxy.

כדי לאמת חתימות באופן ידני, אפשר להשתמש בכלים שונים. בשלבים הבאים משתמשים ב-CLI של gcloud, ב-OpenSSL (גרסה 3.0.1 ואילך) וב-jq (גרסה 1.7.1 ואילך) כדי לאמת את החתימות ב-Linux.

  1. מורידים את קובץ המטא-נתונים. כמו שמתואר בקטע שדות של מטא-נתונים שקשורים לאבטחה, קובץ המטא-נתונים מכיל שדה SBOM בתוך השדה buildInfo. ה-SBOM מכיל את פריט המידע שנוצר (לדוגמה, קובץ JAR או EGG) יחד עם הערה שמייצגת את החתימה. הפריט הזה מאפשר לכם לקבוע את מזהה ה-SPDX.

    לדוגמה, אם שם פריט המידע הוא artifact_name, הערך של spdx_id הוא SPDXRef-Package-artifact_name. כדי לאמת חבילה בשם gradio-3.30.0-py3-none-any.whl, הערך של spdx_id הוא SPDXRef-Package-gradio-3.30.0-py3-none-any.whl.

  2. מחלצים את תקציר SHA-256 מקובץ המטא-נתונים:

    cat METADATA_FILENAME | jq -rj '.buildInfo' | jq -rj '.sbom' | jq -rj '.packages' | jq '.[] | select(.SPDXID=="SPDX_ID")' | jq -rj '.annotations[0].comment' | jq -rj '.digest[0].digest' | cut -d ' ' -f1 > expectedDigest.txt
    

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

    • ‫METADATA_FILENAME: השם של קובץ המטא-נתונים של האבטחה.

    • ‫SPDX_ID: המזהה של SPDX.

  3. מחשבים את תקציר פריט המידע:

    sha256sum ARTIFACT_FILE | cut -d ' ' -f1 > actualDigest.txt
    

    מחליפים את ARTIFACT_FILE בשם של קובץ פריט המידע שנוצר בתהליך הפיתוח (Artifact).

  4. בודקים אם יש הבדלים בין שתי הגרסאות:

    diff actualDigest.txt expectedDigest.txt
    

    אם אין הבדל, לא יהיה פלט.

  5. מחלצים את תקציר השדה לקובץ .bin:

    cat METADATA_FILENAME | jq -rj '.buildInfo' | jq -rj '.sbom' | jq -rj '.packages' | jq '.[] | select(.SPDXID=="SPDX_ID")' | jq -rj '.annotations[0].comment' | jq -rj '.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  6. מחלצים את החתימה של התקציר לקובץ .sig:

    cat METADATA_FILENAME | jq -rj '.buildInfo' | jq -rj '.sbom' | jq -rj '.packages' | jq '.[] | select(.SPDXID=="SPDX_ID")' | jq -rj '.annotations[0].comment' | jq -rj '.signature[0].signature' | xxd -r -p > sig.sig
    
  7. מחלצים את המפתח הציבורי מהאישור הציבורי לקובץ .pem:

    cat METADATA_FILENAME | jq -rj '.buildInfo' | jq -rj '.sbom' | jq -rj '.packages' | jq '.[] | select(.SPDXID=="SPDX_ID")' | jq -rj '.annotations[0].comment' | jq -rj '.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  8. מאמתים את החתימה של התקציר באמצעות המפתח הציבורי שחולץ:

    openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
    

    אם הפעולה מצליחה, הפקודה מחזירה את הערך Signature Verified Successfully. אתם יכולים לאמת את האישור.

  9. מחלצים את האישור הציבורי לקובץ .pem:

    cat METADATA_FILENAME | jq -rj '.buildInfo' | jq -rj '.sbom' | jq -rj '.packages' | jq '.[] | select(.SPDXID=="SPDX_ID")' | jq -rj '.annotations[0].comment' | jq -rj '.certInfo.cert' > cert.pem
    
  10. מורידים את אישור הבסיס (ca.crt בפקודה הבאה):

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. מאמתים את האישור באמצעות האישור שחולץ והאישור הבסיסי:

    openssl verify -verbose -CAfile ca.crt cert.pem
    

    אם הפעולה מצליחה, הפקודה מחזירה את הערך cert.pem: OK.

אימות החתימות של שדות המטא-נתונים של האבטחה

אתם יכולים לאמת את החתימה של השדות הבאים בקובץ המטא-נתונים של האבטחה באופן עצמאי:

  • buildInfo
  • vexInfo
  • healthInfo (אם קיים)

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

https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt

אתם יכולים לאמת חתימות באופן ידני או באמצעות הכלי לאימות של Assured OSS.

בשלבים הבאים מוסבר איך לאמת ידנית את החתימה של השדה buildInfo בקובץ metadata.json. אתם יכולים לבצע שלבים דומים כדי לאמת את החתימה של השדה vexInfo או של השדה healthInfo.

אתם יכולים לאמת חתימות באמצעות כלים שונים. בדוגמה הבאה נעשה שימוש ב-CLI של gcloud, ב-OpenSSL (גרסה 3.0.1 ואילך) וב-jq (גרסה 1.7.1 ואילך) כדי לאמת את החתימות במערכת Linux.

  1. יוצרים את תקציר SHA-256 של השדה:

    cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
    
  2. מחלצים את תקציר השדה שסופק בקובץ metadata.json:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
    
  3. בודקים אם יש הבדלים בין שני התקצירים:

    diff actualDigest.txt expectedDigest.txt
    

    אם אין הבדל, לא יהיה פלט, וזה המצב האידיאלי. אתם יכולים לאמת את החתימה.

  4. מחלצים את תקציר השדה לקובץ .bin:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  5. מחלצים את החתימה של התקציר לקובץ .sig:

    cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
    
  6. מחלצים את המפתח הציבורי מהאישור הציבורי לקובץ .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  7. מאמתים את החתימה של התקציר באמצעות המפתח הציבורי שחולץ:

    openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
    

    אם האימות מצליח, הפקודה מחזירה את הערך Signature Verified Successfully. אתם יכולים לאמת את האישור.

  8. מחלצים את האישור הציבורי לקובץ .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' > cert.pem
    
  9. מורידים את אישור הבסיס, שנקרא ca.crt בפקודה הבאה:

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  10. מאמתים את האישור באמצעות האישור שחולץ והאישור הבסיסי:

    openssl verify -verbose -CAfile ca.crt cert.pem
    

    אם הפעולה הצליחה, הפקודה תחזיר את הערך cert.pem: OK.