Acceder a los metadatos de seguridad y verificar los paquetes

Enterprise

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

Esta página solo se aplica al nivel premium de Assured OSS. Para obtener información sobre el nivel gratuito, consulta Verificar firmas en el nivel gratuito de Assured OSS.

Antes de empezar

Configura la autenticación.

Extraer los metadatos

Puedes usar los comandos gcloud o curl para descargar los metadatos. Crea las URLs de ambos elementos con la siguiente información:

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

La URL debe tener el siguiente formato:

gcloud

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

La URL debe estar en minúsculas.

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

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

URL de JavaScript de ejemplo: 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 ejemplo: https://storage.googleapis.com/assuredoss-metadata/python/blessed/1.20.0/metadata.json

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

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

  1. Descarga los metadatos:

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

Ahora puedes verificar las firmas. Tienes dos opciones:

Verificar 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. Exportar $(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]
    

    Haz los cambios siguientes:

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

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

    --temp_downloads_path es una marca opcional para definir la ruta en la que quieres descargar los archivos (sustituye TEMP_DOWNLOADS_DIR_PATH). Si no se define la marca, los archivos se descargarán 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.

Verificar manualmente las firmas de los paquetes descargados

Solo puedes verificar la firma de los artefactos de los archivos binarios que Assured OSS ha compilado de forma segura, no de los que Assured OSS proporciona a través de proxies.

Para verificar las firmas manualmente, puedes usar varias herramientas. En los pasos siguientes se usa la CLI de gcloud, OpenSSL (versión 3.0.1 o posterior) y jq (1.7.1 o posterior) para verificar las firmas en Linux.

  1. Descarga el archivo de metadatos. Como se describe en la sección Campos de metadatos de seguridad, el archivo de metadatos contiene un campo SBOM dentro del campo buildInfo. La lista de materiales de software contiene el artefacto (por ejemplo, un archivo JAR o EGG) que se ha compilado 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, el spdx_id es SPDXRef-Package-artifact_name. Para validar un paquete llamado 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
    

    Haz los cambios siguientes:

    • METADATA_FILENAME: nombre del archivo de metadatos de seguridad.

    • SPDX_ID: el identificador SPDX.

  3. Calcula el digest del artefacto:

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

    Sustituye ARTIFACT_FILE por el nombre del archivo de artefacto.

  4. Comprueba si hay alguna diferencia entre los dos:

    diff actualDigest.txt expectedDigest.txt
    

    Si no hay ninguna diferencia, no se muestra ningún resultado.

  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 la clave pública del 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 la clave pública extraída:

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

    Si se ejecuta correctamente, este comando devuelve Signature Verified Successfully. Ahora puedes verificar el certificado.

  9. 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' > cert.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 con el certificado extraído y el certificado raíz:

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

    Si se ejecuta correctamente, este comando devuelve cert.pem: OK.

Verificar las firmas de los campos de metadatos de seguridad

Puede verificar la firma de los siguientes campos del archivo de metadatos de seguridad de forma independiente:

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

Los datos de los campos se cifran con hash mediante SHA-256 y, a continuación, el hash se firma con el algoritmo ECDSAP256_DER. El certificado y la cadena de certificados se proporcionan en 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 manualmente o con la herramienta de verificación de OSS asegurado.

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

Puedes verificar las firmas con varias herramientas. En el siguiente ejemplo se usan la CLI de gcloud, 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. Comprueba si hay alguna diferencia entre los dos resúmenes:

    diff actualDigest.txt expectedDigest.txt
    

    Si no hay ninguna diferencia, no habrá ningún resultado, que es lo 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 la clave pública del 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 la clave pública extraída:

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

    Si la verificación se realiza correctamente, este comando devuelve 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' > cert.pem
    
  9. Descarga el certificado raíz, llamado ca.crt, con el siguiente comando:

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  10. Verifica el certificado con el certificado extraído y el certificado raíz:

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

    Si la acción se realiza correctamente, el comando devuelve cert.pem: OK.