Acessar metadados de segurança e verificar pacotes

Esta página descreve como acessar metadados de segurança do assuredoss-metadata bucket do Cloud Storage. Para uma descrição dos riscos metadados, consulte Metadados de segurança .

Esta página se aplica apenas ao nível pago do Assured OSS. Para o nível gratuito, consulte Verificar assinaturas no Assured OSS gratuito nível 2.

Antes de começar

Configure a autenticação.

Extrair os metadados

É possível usar os comandos gsutil ou curl para fazer o download dos metadados. Crie o URL para ambos usando as seguintes informações:

  • Idioma:java, python ou javascript. O valor precisa estar em letras minúsculas.
  • Package_ID: para Java, é groupId:artifactId, por O Python é a packageName e, para JavaScript, é uma das @org-name/package-name, @username/package-name, ou package-name. O valor precisa estar em minúsculas.
  • Versão:a versão do pacote.

O URL precisa ter o seguinte formato:

gsutil

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

O URL precisa estar em letras minúsculas.

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

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

URL de JavaScript de exemplo: 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

O URL precisa estar em letras minúsculas.

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

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

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

  1. Faça o download dos metadados:

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

Agora você pode verificar as assinaturas. Existem duas opções:

Verificar as assinaturas dos pacotes baixados usando a ferramenta aoss-verifier

Use a ferramenta aoss-verifier para verificar os metadados do pacote.

Antes de usar essa ferramenta, instale o Go.

  1. Instale o ferramenta aoss-verifier.

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

  3. Execute o 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]
    

    Substitua:

    • TYPE: os valores possíveis são premiuminfo.
    • LANGUAGE: o idioma do pacote. O valor precisa estar em letras minúsculas.
    • PACKAGE_ID: para Java, o formato é groupId:artifactId. Para Python, o formato é packageName: O valor precisa estar em minúsculas.
    • VERSION: a versão do pacote.

    --disable_certificate_verification é uma sinalização opcional que ignora a correspondência do certificado de folha para o certificado raiz por meio da cadeia de certificados, se usados.

    --temp_downloads_path é uma sinalização opcional para definir o caminho em que você quer faça o download dos arquivos (substitua TEMP_DOWNLOADS_DIR_PATH). Se a flag não estiver definida, será feito o download dos arquivos para a pasta tmp_downloads na diretório atual.

    --disable_deletes é uma sinalização opcional que mantém os arquivos transferidos por download. De por padrão, a ferramenta limpa todos os arquivos baixados.

Para mais informações, consulte o arquivo README.

Verificar manualmente as assinaturas dos pacotes baixados

Só é possível verificar a assinatura do artefato para os binários que são seguros criados pelo Assured OSS, não aqueles fornecidos pelo Assured OSS por proxies.

Você pode usar várias ferramentas para verificar assinaturas manualmente. As etapas a seguir usar CLI gcloud, o OpenSSL (versão 3.0.1 ou mais recente) e jq (link em inglês) (1.7.1 ou superior) para verificar as assinaturas no Linux.

  1. Fazer o download dos metadados arquivo. Conforme descrito em Acessar metadados usando o Cloud Storage, o arquivo de metadados contém um campo SBOM dentro do campo buildInfo. SBOM contém o artefato (por exemplo, um arquivo JAR ou EGG) que foi é criado junto com uma anotação que representa a assinatura. Com esse artefato, você determina o ID do SPDX.

    Por exemplo, se o nome do artefato for artifact_name, o spdx_id será SPDXRef-Package-artifact_name Para validar um pacote denominado gradio-3.30.0-py3-none-any.whl, o spdx_id é SPDXRef-Package-gradio-3.30.0-py3-none-any.whl

  2. Extraia o resumo SHA-256 do arquivo de metadados:

    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
    

    Substitua:

    • METADATA_FILENAME: o nome do seu arquivo de metadados de segurança.

    • SPDX_ID: o identificador do SPDX.

  3. Calcule o resumo do artefato:

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

    Substitua ARTIFACT_FILE pelo nome do artefato. .

  4. Verifique se há diferenças entre os dois:

    diff actualDigest.txt expectedDigest.txt
    

    Se não houver diferença, não haverá saída.

  5. Extraia o resumo do campo para um arquivo .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. Extraia a assinatura do resumo para um arquivo .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. Extraia o certificado público para um arquivo .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. Verifique a assinatura do resumo usando o certificado:

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

    Se for bem-sucedido, esse comando retornará Signature Verified Successfully. Agora é possível verificar o certificado.

  9. Extraia a cadeia de certificados públicos para um arquivo .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. Faça o download do certificado raiz (ca.crt no seguinte comando):

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Verifique o certificado usando a cadeia e a raiz certificado:

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

    Se for bem-sucedido, esse comando retornará pubKey.pem: OK.

Verificar as assinaturas dos campos de metadados de segurança

É possível verificar a assinatura dos seguintes campos nos metadados de segurança arquivo de forma independente:

  • buildInfo
  • vexInfo
  • healthInfo (se houver)

Os dados nos campos são criptografados com hash usando SHA-256. Em seguida, o hash é assinado usando o algoritmo ECDSAP256_DER. O certificado e a cadeia de certificados são fornecidos nos metadados para que você possa verificar a assinatura. Use o seguinte certificado raiz para verificar a cadeia de certificados:

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

Você pode verificar assinaturas manualmente ou usando o Ferramenta Assured OSS Verifier.

As etapas a seguir descrevem como verificar manualmente a assinatura do buildInfo no arquivo metadata.json. É possível usar etapas semelhantes para Verificar a assinatura do campo vexInfo ou do campo healthInfo.

É possível verificar assinaturas usando várias ferramentas. O exemplo a seguir usa CLI gcloud, OpenSSL (versão 3.0.1 ou mais recente) e jq (link em inglês) (1.7.1 ou posterior) para verificar as assinaturas em um sistema Linux.

  1. Gere o resumo SHA-256 do campo:

    cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
    
  2. Extraia o resumo do campo fornecido no metadata.json arquivo:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
    
  3. Verifique se há diferenças entre os dois resumos:

    diff actualDigest.txt expectedDigest.txt
    

    Se não houver diferença, não haverá saída, que é o caso ideal. Agora você pode verificar a assinatura.

  4. Extraia o resumo do campo para um arquivo .bin:

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  5. Extraia a assinatura do resumo para um arquivo .sig:

    cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
    
  6. Extraia o certificado público para um arquivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  7. Verifique a assinatura do resumo usando o certificado:

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

    Se a verificação for bem-sucedida, esse comando retornará Signature Verified Successfully. Agora é possível verificar o certificado.

  8. Extraia o certificado público para um arquivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  9. Extraia a cadeia de certificados públicos para um arquivo .pem:

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.certChain' | openssl x509 -pubkey -noout  > pubKeyChain.pem
    
  10. Faça o download do certificado raiz, chamado ca.crt no seguinte comando:

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. Verifique o certificado usando a cadeia e a raiz certificado:

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

    Se for bem-sucedido, o comando retornará pubKey.pem: OK.