Accéder aux métadonnées de sécurité et vérifier les packages

Cette page explique comment accéder aux métadonnées de sécurité à partir du assuredoss-metadata bucket Cloud Storage. Pour une description de la sécurité consultez la section Métadonnées de sécurité champs.

Cette page ne s'applique qu'au niveau payant Assured OSS. Pour le version gratuite, consultez Vérifier les signatures dans la version gratuite d'Assured OSS niveau supérieur.

Avant de commencer

Configurez l'authentification.

Extraire les métadonnées

Vous pouvez utiliser les commandes gcloud ou curl pour télécharger les métadonnées. Créez l'URL pour ces deux éléments à l'aide des informations suivantes:

  • Langue:java, python ou javascript. La valeur doit être en minuscules.
  • Package_ID::pour Java, il s'agit de groupId:artifactId. en Python, packageName. Pour JavaScript, @org-name/package-name, @username/package-name ou package-name. La valeur doit être en minuscules.
  • Version:version du package.

L'URL doit respecter le format suivant:

gcloud

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

L'URL doit être en minuscules.

Exemple d'URL Python: gs://assuredoss-metadata/python/blessed/1.20.0/metadata.json

Exemple d'URL Java: gs://assuredoss-metadata/java/org.apache.logging.log4j:log4j-core/2.17.1/metadata.json

Exemple d'URL JavaScript: gs://assuredoss-metadata/javascript/@stoplight/spectral-core/0.0.0/metadata.json

curl

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

L'URL doit être en minuscules.

Exemple d'URL Python: https://storage.googleapis.com/assuredoss-metadata/python/blessed/1.20.0/metadata.json

Exemple d'URL Java: https://storage.googleapis.com/assuredoss-metadata/java/org.apache.logging.log4j:log4j-core/2.17.1/metadata.json

Exemple d'URL JavaScript: https://storage.googleapis.com/assuredoss-metadata/javascript/@stoplight/spectral-core/0.0.0/metadata.json

  1. Téléchargez les métadonnées:

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

Vous pouvez maintenant vérifier les signatures. Vous disposez de deux options :

Vérifier les signatures des packages téléchargés à l'aide de l'outil aoss-verifier

Utilisez l'outil aoss-verifier pour vérifier les métadonnées du package.

Avant d'utiliser cet outil, installez Go.

  1. Installez la aoss-verifier.

  2. Exporter $(go env GOPATH)/bin.

  3. Exécutez la commande 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]
    

    Remplacez les éléments suivants :

    • TYPE: les valeurs possibles sont premiuminfo.
    • LANGUAGE: langue du package. La valeur doit être en minuscules.
    • PACKAGE_ID : pour Java, le format est le suivant : groupId:artifactId Pour Python, le format est le suivant : packageName La valeur doit être en minuscules.
    • VERSION: version du package.

    --disable_certificate_verification est une option facultative qui ignore les correspondances le certificat d'entité finale vers le certificat racine via la chaîne de certificats, si utilisé.

    --temp_downloads_path est une option facultative permettant de définir le chemin d'accès téléchargez les fichiers (remplacez TEMP_DOWNLOADS_DIR_PATH). Si l'indicateur n'est pas défini, les fichiers sont téléchargés dans le dossier tmp_downloads du sous-dossier répertoire actuel.

    --disable_deletes est un indicateur facultatif qui conserve les fichiers téléchargés. Par par défaut, l'outil nettoie tous les fichiers téléchargés.

Pour plus d'informations, consultez le fichier README.

Vérifier manuellement les signatures des packages téléchargés

Vous ne pouvez vérifier la signature de l'artefact que pour les binaires qui sont sécurisés créés par Assured OSS, et non ceux fournis par Assured OSS via des proxys.

Vous pouvez vérifier les signatures manuellement à l'aide de divers outils. Procédure à suivre utiliser gcloud CLI, OpenSSL (version 3.0.1 ou ultérieure) et JQ (version 1.7.1 ou ultérieure) pour vérifier les signatures sous Linux.

  1. Télécharger les métadonnées fichier. Comme décrit dans la section Accéder aux métadonnées à l'aide de Cloud Storage, le fichier de métadonnées contient un champ SBOM dans le champ buildInfo. Le SBOM contient l'artefact (par exemple, un fichier JAR ou EGG) qui a été construit avec une annotation qui représente la signature. Cet artefact permet vous déterminez l'ID SPDX.

    Par exemple, si le nom de l'artefact est artifact_name, spdx_id est SPDXRef-Package-artifact_name Pour valider un package nommé gradio-3.30.0-py3-none-any.whl, spdx_id est SPDXRef-Package-gradio-3.30.0-py3-none-any.whl

  2. Extrayez le condensé SHA-256 du fichier de métadonnées:

    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
    

    Remplacez les éléments suivants :

    • METADATA_FILENAME: nom de votre fichier de métadonnées de sécurité.

    • SPDX_ID: identifiant SPDX.

  3. Calculez le condensé de l'artefact:

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

    Remplacez ARTIFACT_FILE par le nom de l'artefact. .

  4. Vérifiez s'il existe des différences entre les deux:

    diff actualDigest.txt expectedDigest.txt
    

    S'il n'y a pas de différence, aucun résultat ne s'affiche.

  5. Extrayez le condensé du champ dans un fichier .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. Extrayez la signature du condensé dans un fichier .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. Extrayez le certificat public dans un fichier .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. Vérifiez la signature du condensé à l'aide du certificat:

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

    Si l'opération réussit, cette commande renvoie Signature Verified Successfully. Vous pouvez maintenant vérifier le certificat.

  9. Extrayez la chaîne de certificats publics dans un fichier .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.certChain' | openssl x509 -pubkey -noout  > pubKeyChain.pem
    
  10. Téléchargez le certificat racine (ca.crt dans la commande suivante):

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Vérifier le certificat à l'aide de la chaîne de certificats et de la racine certificat:

    openssl verify -verbose -CAfile ca.crt -untrusted pubKeyChain.pem pubKey.pem
    

    Si l'opération réussit, cette commande renvoie pubKey.pem: OK.

Vérifier les signatures des champs de métadonnées de sécurité

Vous pouvez vérifier la signature des champs suivants dans les métadonnées de sécurité de manière indépendante:

  • buildInfo
  • vexInfo
  • healthInfo (le cas échéant)

Les données contenues dans les champs sont hachées au format SHA-256, puis le hachage est signé à l'aide de l'algorithme ECDSAP256_DER. Le certificat et la chaîne de certificats sont fournies dans les métadonnées afin que vous puissiez vérifier la signature. Utilisez le certificat racine suivant pour vérifier la chaîne de certificats:

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

Vous pouvez valider les signatures manuellement ou à l'aide de la Assured OSS Verifier Tool :

Les étapes suivantes décrivent comment vérifier manuellement la signature du Champ buildInfo dans le fichier metadata.json. Vous pouvez suivre des étapes similaires pour Vérifiez la signature du champ vexInfo ou du champ healthInfo.

Vous pouvez vérifier les signatures à l'aide de divers outils. L'exemple suivant utilise gcloud CLI, OpenSSL (version 3.0.1 ou ultérieure) et JQ (1.7.1 ou version ultérieure) pour vérifier les signatures sur un système Linux.

  1. Générez le condensé SHA-256 du champ:

    cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
    
  2. Extrayez le condensé du champ fourni dans metadata.json. :

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
    
  3. Recherchez les différences entre les deux condensés:

    diff actualDigest.txt expectedDigest.txt
    

    S'il n'y a pas de différence, il n'y aura pas de sortie, ce qui correspond le cas idéal. Vous pouvez maintenant valider la signature.

  4. Extrayez le condensé du champ dans un fichier .bin:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  5. Extrayez la signature du condensé dans un fichier .sig:

    cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
    
  6. Extrayez le certificat public dans un fichier .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  7. Vérifiez la signature du condensé à l'aide du certificat:

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

    Si la validation réussit, cette commande renvoie Signature Verified Successfully. Vous pouvez maintenant vérifier le certificat.

  8. Extrayez le certificat public dans un fichier .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  9. Extrayez la chaîne de certificats publics dans un fichier .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.certChain' | openssl x509 -pubkey -noout  > pubKeyChain.pem
    
  10. Téléchargez le certificat racine nommé ca.crt dans la commande suivante:

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Vérifier le certificat à l'aide de la chaîne de certificats et de la racine certificat:

    openssl verify -verbose -CAfile ca.crt -untrusted pubKeyChain.pem pubKey.pem
    

    Si l'opération réussit, la commande renvoie pubKey.pem: OK.