Accede a los metadatos de seguridad y verifica los paquetes

En esta página, se describe cómo acceder a los metadatos de seguridad desde el bucket assuredoss-metadata de Cloud Storage. Para obtener una descripción de los metadatos de seguridad, consulta Campos de metadatos de seguridad.

Esta página se aplica solo al nivel pagado de Assured OSS. Para el nivel gratuito, consulta Verifica firmas en el nivel gratuito de Assured OSS.

Antes de comenzar

Configura la autenticación.

Extrae los metadatos

Puedes usar los comandos gsutil o curl para descargar los metadatos. Crea la URL de ambos con la siguiente información:

  • Idioma: java, python o javascript. El valor debe estar en minúsculas.
  • Package_ID: para Java, es groupId:artifactId, para Python es packageName y para JavaScript es @org-name/package-name, @username/package-name o package-name. El valor debe estar en minúscula.
  • Versión: la versión del paquete

La URL debe tener el siguiente formato:

gsutil

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

La URL debe estar en minúsculas.

URL de Python de muestra: gs://assuredoss-metadata/python/blessed/1.20.0/metadata.json

Ejemplo de URL de Java: gs://assuredoss-metadata/java/org.apache.logging.log4j:log4j-core/2.17.1/metadata.json

Ejemplo de URL de 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

La URL debe estar en minúsculas.

URL de Python de muestra: https://storage.googleapis.com/assuredoss-metadata/python/blessed/1.20.0/metadata.json

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

Ejemplo de URL de JavaScript: https://storage.googleapis.com/assuredoss-metadata/javascript/@stoplight/spectral-core/0.0.0/metadata.json

  1. Descarga los metadatos:

gsutil

gsutil -m 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

Ahora puedes verificar las firmas. Existen dos opciones:

Verifica las firmas de los paquetes descargados con la herramienta aoss-verifier

Usa la herramienta aoss-verifier para verificar los metadatos del paquete.

Antes de usar esta herramienta, instala Go.

  1. Instala la herramienta aoss-verifier.

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

  3. Ejecuta el comando 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]
    

    Reemplaza lo siguiente:

    • TYPE: Los valores posibles son premiuminfo.
    • LANGUAGE: Es el idioma del paquete. El valor debe estar en minúsculas.
    • PACKAGE_ID: En Java, el formato es groupId:artifactId. Para Python, el formato es packageName. El valor debe estar en minúscula.
    • VERSION: Es la versión del paquete.

    --disable_certificate_verification es una marca opcional que omite la coincidencia del certificado de entidad final con el certificado raíz a través de la cadena de certificados, si se usa.

    --temp_downloads_path es una marca opcional para establecer la ruta de acceso en la que deseas descargar los archivos (reemplaza TEMP_DOWNLOADS_DIR_PATH). Si no se configura la marca, los archivos se descargan en la carpeta tmp_downloads del directorio actual.

    --disable_deletes es una marca opcional que conserva los archivos descargados. De forma predeterminada, la herramienta limpia todos los archivos descargados.

Para obtener más información, consulta el archivo README.

Verifica manualmente las firmas de los paquetes descargados

Puedes verificar la firma del artefacto solo para los objetos binarios que Assured OSS compila de forma segura, no los que proporciona Assured OSS a través de proxies.

Puedes usar varias herramientas para verificar las firmas de forma manual. En los siguientes pasos, se usan gcloud CLI, OpenSSL (versión 3.0.1 o posterior) y jq (1.7.1 o superior) para verificar las firmas en Linux.

  1. Descarga el archivo de metadatos. Como se describe en Accede a metadatos con Cloud Storage, el archivo de metadatos contiene un campo SBOM dentro del campo buildInfo. La SBOM contiene el artefacto (por ejemplo, un archivo JAR o EGG) que se compiló junto con una anotación que representa la firma. Este artefacto te permite determinar el ID de SPDX.

    Por ejemplo, si el nombre del artefacto es artifact_name, spdx_id es SPDXRef-Package-artifact_name. Para validar un paquete que se llama gradio-3.30.0-py3-none-any.whl, el spdx_id es SPDXRef-Package-gradio-3.30.0-py3-none-any.whl.

  2. Extrae el resumen SHA-256 del archivo de metadatos:

    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
    

    Reemplaza lo siguiente:

    • METADATA_FILENAME: Es el nombre de tu archivo de metadatos de seguridad.

    • SPDX_ID: Es el identificador de SPDX.

  3. Calcula el resumen de los artefactos:

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

    Reemplaza ARTIFACT_FILE por el nombre del archivo de artefactos.

  4. Comprueba si hay diferencias entre los dos:

    diff actualDigest.txt expectedDigest.txt
    

    Si no hay diferencia, no hay salida.

  5. Extrae el resumen del campo en un archivo .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. Extrae la firma del resumen en un archivo .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. Extrae el certificado público en un archivo .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. Verifica la firma del resumen con el siguiente certificado:

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

    Si se ejecuta de forma correcta, este comando muestra Signature Verified Successfully. Ahora puedes verificar el certificado.

  9. Extrae la cadena de certificados públicos en un archivo .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. Descarga el certificado raíz (ca.crt en el siguiente comando):

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Verifica el certificado mediante la cadena de certificados y el certificado raíz:

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

    Si se ejecuta de forma correcta, este comando muestra pubKey.pem: OK.

Verifica las firmas para los campos de metadatos de seguridad

Puedes verificar la firma de los siguientes campos en el archivo de metadatos de seguridad de forma independiente:

  • buildInfo
  • vexInfo
  • healthInfo (si está presente)

A los datos dentro de los campos se les genera un hash con SHA-256 y, luego, el hash se firma con el algoritmo ECDSAP256_DER. La cadena de certificados y certificados se proporcionan dentro de los metadatos para que puedas verificar la firma. Usa el siguiente certificado raíz para verificar la cadena de certificados:

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

Puedes verificar las firmas de forma manual o con la herramienta Assured OSS Verifier.

En los siguientes pasos, se describe cómo verificar de forma manual la firma del campo buildInfo en el archivo metadata.json. Puedes seguir pasos similares para verificar la firma del campo vexInfo o healthInfo.

Puedes verificar firmas con varias herramientas. En el siguiente ejemplo, se usa gcloud CLI, OpenSSL (versión 3.0.1 o posterior) y jq (1.7.1 o posterior) para verificar las firmas en un sistema Linux.

  1. Genera el resumen SHA-256 del campo:

    cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
    
  2. Extrae el resumen del campo que se proporciona en el archivo metadata.json:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
    
  3. Verifica si hay diferencias entre los dos resúmenes:

    diff actualDigest.txt expectedDigest.txt
    

    Si no hay diferencia, no habrá ningún resultado, que es el caso ideal. Ahora puedes verificar la firma.

  4. Extrae el resumen del campo en un archivo .bin:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  5. Extrae la firma del resumen en un archivo .sig:

    cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
    
  6. Extrae el certificado público en un archivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  7. Verifica la firma del resumen con el siguiente certificado:

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

    Si la verificación se realiza correctamente, este comando muestra Signature Verified Successfully. Ahora puedes verificar el certificado.

  8. Extrae el certificado público en un archivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  9. Extrae la cadena de certificados públicos en un archivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.certChain' | openssl x509 -pubkey -noout  > pubKeyChain.pem
    
  10. Descarga el certificado raíz, llamado ca.crt, en el siguiente comando:

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Verifica el certificado mediante la cadena de certificados y el certificado raíz:

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

    Si se ejecuta de forma correcta, el comando muestra pubKey.pem: OK.