이 페이지에서는 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
- 메타데이터를 다운로드합니다.
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를 설치합니다.
aoss-verifier 도구를 설치합니다.
$(go env GOPATH)/bin
을 내보냅니다.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의 서명을 확인합니다.
메타데이터 파일을 다운로드합니다. Cloud Storage를 사용하여 메타데이터 액세스의 설명대로 메타데이터 파일의
buildInfo
필드 안에SBOM
필드가 있습니다. SBOM에는 서명을 나타내는 주석과 함께 빌드된 아티팩트(예: JAR 또는 EGG 파일)가 포함됩니다. 이 아티팩트를 사용하면 SPDX ID를 확인할 수 있습니다.예를 들어 아티팩트 이름이
artifact_name
이면spdx_id
가SPDXRef-Package-artifact_name
입니다. 이름이gradio-3.30.0-py3-none-any.whl
인 패키지의 유효성을 검사하는 경우spdx_id
는SPDXRef-Package-gradio-3.30.0-py3-none-any.whl
입니다.메타데이터 파일에서 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 식별자입니다.
아티팩트 다이제스트를 계산합니다.
sha256sum ARTIFACT_FILE | cut -d ' ' -f1 > actualDigest.txt
ARTIFACT_FILE
을 아티팩트 파일 이름으로 바꿉니다.다음 두 버전의 차이점을 확인합니다.
diff actualDigest.txt expectedDigest.txt
차이가 없으면 출력이 표시되지 않습니다.
필드 다이제스트를
.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
다이제스트 서명을
.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
공개 인증서를
.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
인증서를 사용하여 다이제스트 서명을 확인합니다.
openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
성공하면 이 명령어에서
Signature Verified Successfully
를 반환합니다. 이제 인증서를 확인할 수 있습니다.공개 인증서 체인을
.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
루트 인증서를 다운로드합니다(다음 명령어의
ca.crt
).curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
인증서 체인과 루트 인증서를 사용하여 인증서를 확인합니다.
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 시스템의 서명을 확인합니다.
필드의 SHA-256 다이제스트를 생성합니다.
cat metadata.json | jq -rj '.buildInfo' | sha256sum | cut -d ' ' -f1 > actualDigest.txt
metadata.json
파일에 제공된 필드의 다이제스트를 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 > expectedDigest.txt
다음 두 다이제스트의 차이점을 확인합니다.
diff actualDigest.txt expectedDigest.txt
차이가 없으면 출력이 표시되지 않으며 이 경우가 이상적입니다. 이제 서명을 확인할 수 있습니다.
필드 다이제스트를
.bin
파일로 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.digest[0].digest' | cut -d ':' -f2 | xxd -r -p > digest.bin
다이제스트 서명을
.sig
파일로 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.signature[0].signature' | xxd -r -p > sig.sig
공개 인증서를
.pem
파일로 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout > pubKey.pem
인증서를 사용하여 다이제스트 서명을 확인합니다.
openssl pkeyutl -in digest.bin -inkey pubKey.pem -pubin -verify -sigfile sig.sig
확인이 성공하면 이 명령어가
Signature Verified Successfully
를 반환합니다. 이제 인증서를 확인할 수 있습니다.공개 인증서를
.pem
파일로 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.certInfo.cert' | openssl x509 -pubkey -noout > pubKey.pem
공개 인증서 체인을
.pem
파일로 추출합니다.cat metadata.json | jq -rj '.buildInfoSignature.certInfo.certChain' | openssl x509 -pubkey -noout > pubKeyChain.pem
다음 명령어에서
ca.crt
라는 루트 인증서를 다운로드합니다.curl -o ca.crt https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
인증서 체인과 루트 인증서를 사용하여 인증서를 확인합니다.
openssl verify -verbose -CAfile ca.crt -untrusted pubKeyChain.pem pubKey.pem
성공하면 명령어가
pubKey.pem: OK
를 반환합니다.