보안 메타데이터 액세스 및 패키지 확인

이 페이지에서는 assuredoss-metadata Cloud Storage 버킷에서 보안 메타데이터에 액세스하는 방법을 설명합니다. 보안 메타데이터에 대한 설명은 보안 메타데이터 필드를 참조하세요.

이 페이지는 Assured OSS 프리미엄 등급에만 적용됩니다. 무료 등급은 Assured OSS 무료 등급의 서명 확인을 참조하세요.

시작하기 전에

인증 설정

메타데이터 추출

gcloud 또는 curl 명령어를 사용하여 메타데이터를 다운로드할 수 있습니다. 다음 정보를 사용하여 두 메타데이터 모두의 URL을 구성합니다.

  • 언어: java, python 또는 javascript입니다. 값은 소문자여야 합니다.
  • Package_ID: Java의 경우 groupId:artifactId, Python의 경우 packageName, JavaScript의 경우 @org-name/package-name, @username/package-name 또는package-name입니다. 값은 소문자여야 합니다.
  • 버전: 패키지 버전입니다.

URL은 다음과 같은 형식이어야 합니다.

gcloud

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

URL은 소문자여야 합니다.

샘플 Python URL: gs://assuredoss-metadata/python/blessed/1.20.0/metadata.json

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

샘플 JavaScript URL: 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

URL은 소문자여야 합니다.

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

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

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

  1. 메타데이터를 다운로드합니다.

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

이제 서명을 확인할 수 있습니다. 다음의 2가지 옵션이 있습니다.

aoss-verifier 도구를 사용하여 다운로드한 패키지의 서명 확인

aoss-verifier 도구를 사용하여 패키지 메타데이터를 확인합니다.

이 도구를 사용하기 전에 Go를 설치합니다.

  1. aoss-verifier 도구를 설치합니다.

  2. $(go env GOPATH)/bin을 내보냅니다.

  3. 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의 경우 형식은 packageName입니다. 값은 소문자여야 합니다.
    • VERSION: 패키지 버전입니다.

    --disable_certificate_verification은 인증서 체인을 통해 리프 인증서와 루트 인증서의 일치를 건너뛰는 선택적 플래그입니다(사용되는 경우).

    --temp_downloads_path는 파일을 다운로드할 경로를 설정하는 선택적 플래그입니다(TEMP_DOWNLOADS_DIR_PATH 대체). 플래그를 설정하지 않으면 파일이 현재 디렉터리의 tmp_downloads 폴더로 다운로드됩니다.

    --disable_deletes는 다운로드한 파일을 보관하는 선택적 플래그입니다. 기본적으로 이 도구는 다운로드한 모든 파일을 정리합니다.

자세한 내용은 README를 참조하세요.

다운로드한 패키지의 서명 수동 확인

프록시를 통해 Assured OSS에서 제공되는 바이너리가 아닌 Assured OSS에서 안전하게 빌드한 바이너리에 대한 아티팩트 서명만 확인할 수 있습니다.

다양한 도구를 사용하여 수동으로 서명을 확인할 수 있습니다. 다음 단계에서는 gcloud CLI, OpenSSL(버전 3.0.1 이상), jq(1.7.1 이상)를 사용하여 Linux의 서명을 확인합니다.

  1. 메타데이터 파일을 다운로드합니다. Cloud Storage를 사용하여 메타데이터 액세스의 설명대로 메타데이터 파일의 buildInfo 필드 안에 SBOM 필드가 있습니다. SBOM에는 서명을 나타내는 주석과 함께 빌드된 아티팩트(예: JAR 또는 EGG 파일)가 포함됩니다. 이 아티팩트를 사용하면 SPDX ID를 확인할 수 있습니다.

    예를 들어 아티팩트 이름이 artifact_name이면 spdx_idSPDXRef-Package-artifact_name입니다. 이름이 gradio-3.30.0-py3-none-any.whl인 패키지의 유효성을 검사하는 경우 spdx_idSPDXRef-Package-gradio-3.30.0-py3-none-any.whl입니다.

  2. 메타데이터 파일에서 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 식별자입니다.

  3. 아티팩트 다이제스트를 계산합니다.

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

    ARTIFACT_FILE을 아티팩트 파일 이름으로 바꿉니다.

  4. 다음 두 버전의 차이점을 확인합니다.

    diff actualDigest.txt expectedDigest.txt
    

    차이가 없으면 출력이 표시되지 않습니다.

  5. 필드 다이제스트를 .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. 다이제스트 서명을 .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. 공개 인증서를 .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. 인증서를 사용하여 다이제스트 서명을 확인합니다.

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

    성공하면 이 명령어에서 Signature Verified Successfully를 반환합니다. 이제 인증서를 확인할 수 있습니다.

  9. 공개 인증서 체인을 .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. 루트 인증서를 다운로드합니다(다음 명령어의 ca.crt).

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. 인증서 체인과 루트 인증서를 사용하여 인증서를 확인합니다.

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

    성공하면 이 명령어에서 pubKey.pem: OK를 반환합니다.

보안 메타데이터 필드의 서명 확인

보안 메타데이터 파일에서 다음 필드의 서명을 독립적으로 확인할 수 있습니다.

  • buildInfo
  • vexInfo
  • healthInfo(있는 경우)

필드 내부의 데이터는 SHA-256을 사용하여 해싱된 다음 ECDSAP256_DER 알고리즘을 사용하여 해시가 서명됩니다. 서명을 확인할 수 있도록 인증서와 인증서 체인이 메타데이터 내에 제공됩니다. 다음 루트 인증서를 사용하여 인증서 체인을 확인합니다.

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

서명을 수동으로 확인하거나 Assured OSS 인증 도구를 사용하여 서명을 확인할 수 있습니다.

다음 단계에서는 metadata.json 파일에서 buildInfo 필드 서명을 수동으로 확인하는 방법을 설명합니다. 비슷한 단계를 수행하여 vexInfo 필드나 healthInfo 필드의 서명을 확인할 수 있습니다.

다양한 도구를 사용하여 서명을 확인할 수 있습니다. 다음 예시에서는 gcloud CLI, OpenSSL(버전 3.0.1 이상), jq(1.7.1 이상)를 사용하여 Linux 시스템의 서명을 확인합니다.

  1. 필드의 SHA-256 다이제스트를 생성합니다.

    cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
    
  2. metadata.json 파일에 제공된 필드의 다이제스트를 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
    
  3. 다음 두 다이제스트의 차이점을 확인합니다.

    diff actualDigest.txt expectedDigest.txt
    

    차이가 없으면 출력이 표시되지 않으며 이 경우가 이상적입니다. 이제 서명을 확인할 수 있습니다.

  4. 필드 다이제스트를 .bin 파일로 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
    
  5. 다이제스트 서명을 .sig 파일로 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
    
  6. 공개 인증서를 .pem 파일로 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  7. 인증서를 사용하여 다이제스트 서명을 확인합니다.

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

    확인이 성공하면 이 명령어가 Signature Verified Successfully를 반환합니다. 이제 인증서를 확인할 수 있습니다.

  8. 공개 인증서를 .pem 파일로 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout  > pubKey.pem
    
  9. 공개 인증서 체인을 .pem 파일로 추출합니다.

    cat metadata.json | jq -rj '.buildInfoSignature.certInfo.certChain' | openssl x509 -pubkey -noout  > pubKeyChain.pem
    
  10. 다음 명령어에서 ca.crt라는 루트 인증서를 다운로드합니다.

    curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    
  11. 인증서 체인과 루트 인증서를 사용하여 인증서를 확인합니다.

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

    성공하면 명령어가 pubKey.pem: OK를 반환합니다.