ב-Assured Open Source Software (או Assured OSS) יש מטא-נתונים של אבטחה לכל חבילה ולכל גרסת חבילה שזמינות. אפשר לגשת למטא-נתונים האלה בקטגוריה של Cloud Storage ב-assuredoss-metadata כדי לבדוק את פרטי ה-build, סטטוס נקודות החולשה, תוצאות הבדיקה ופרטי הרישיון. לתיאור של המטא-נתונים של האבטחה, ראו שדות של מטא-נתונים של אבטחה.
המסמך הזה רלוונטי רק למסלול הפרימיום של Assured OSS. למידע על אימות חתימות בתוכנית החינמית של Assured OSS, קראו את המאמר אימות חתימות בתוכנית החינמית של Assured OSS.
לפני שמתחילים
מאמתים את הקישוריות ל-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
הערך חייב להיות באותיות קטנות.
- Java:
גרסה: גרסת החבילה.
כתובת ה-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
- מורידים את המטא-נתונים:
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.
מתקינים את הכלי aoss-verifier.
מייצאים את
$(go env GOPATH)/bin.מריצים את הפקודה
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.
מורידים את קובץ המטא-נתונים. כמו שמתואר בקטע שדות של מטא-נתונים שקשורים לאבטחה, קובץ המטא-נתונים מכיל שדה
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.מחלצים את תקציר 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.
מחשבים את תקציר פריט המידע:
sha256sum ARTIFACT_FILE | cut -d ' ' -f1 > actualDigest.txt
מחליפים את
ARTIFACT_FILEבשם של קובץ פריט המידע שנוצר בתהליך הפיתוח (Artifact).בודקים אם יש הבדלים בין שתי הגרסאות:
diff actualDigest.txt expectedDigest.txt
אם אין הבדל, לא יהיה פלט.
מחלצים את תקציר השדה לקובץ
.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
מחלצים את החתימה של התקציר לקובץ
.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
מחלצים את המפתח הציבורי מהאישור הציבורי לקובץ
.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
מאמתים את החתימה של התקציר באמצעות המפתח הציבורי שחולץ:
openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
אם הפעולה מצליחה, הפקודה מחזירה את הערך
Signature Verified Successfully. אתם יכולים לאמת את האישור.מחלצים את האישור הציבורי לקובץ
.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
מורידים את אישור הבסיס (
ca.crtבפקודה הבאה):curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
מאמתים את האישור באמצעות האישור שחולץ והאישור הבסיסי:
openssl verify -verbose -CAfile ca.crt cert.pem
אם הפעולה מצליחה, הפקודה מחזירה את הערך
cert.pem: OK.
אימות החתימות של שדות המטא-נתונים של האבטחה
אתם יכולים לאמת את החתימה של השדות הבאים בקובץ המטא-נתונים של האבטחה באופן עצמאי:
buildInfovexInfohealthInfo(אם קיים)
הנתונים שבתוך השדות מגובבים באמצעות 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.
יוצרים את תקציר SHA-256 של השדה:
cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
מחלצים את תקציר השדה שסופק בקובץ
metadata.json:cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
בודקים אם יש הבדלים בין שני התקצירים:
diff actualDigest.txt expectedDigest.txt
אם אין הבדל, לא יהיה פלט, וזה המצב האידיאלי. אתם יכולים לאמת את החתימה.
מחלצים את תקציר השדה לקובץ
.bin:cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
מחלצים את החתימה של התקציר לקובץ
.sig:cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
מחלצים את המפתח הציבורי מהאישור הציבורי לקובץ
.pem:cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout > pubKey.pem
מאמתים את החתימה של התקציר באמצעות המפתח הציבורי שחולץ:
openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
אם האימות מצליח, הפקודה מחזירה את הערך
Signature Verified Successfully. אתם יכולים לאמת את האישור.מחלצים את האישור הציבורי לקובץ
.pem:cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' > cert.pem
מורידים את אישור הבסיס, שנקרא
ca.crtבפקודה הבאה:curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
מאמתים את האישור באמצעות האישור שחולץ והאישור הבסיסי:
openssl verify -verbose -CAfile ca.crt cert.pem
אם הפעולה הצליחה, הפקודה תחזיר את הערך
cert.pem: OK.