このドキュメントでは、assuredoss-metadata Cloud Storage バケットからセキュリティ メタデータにアクセスする方法について説明します。セキュリティ メタデータの説明については、セキュリティ メタデータ フィールドをご覧ください。
このページの内容は、Assured OSS のプレミアム ティアにのみ適用されます。無料ティアについては、Assured OSS の無料ティアで署名を検証するをご覧ください。
始める前に
- リクエストされたサービス アカウントの Assured OSS への接続を検証します。 
メタデータを抽出する
gcloud コマンドと curl コマンドのいずれかを使用して、メタデータをダウンロードできます。次の情報を使用して、両方の URL を作成します。
- 言語: java、python、golang、javascriptのいずれか。値は小文字にする必要があります。
- Package_ID: 次のいずれか: - Java: groupId:artifactId
- Python: packageName
- JavaScript: @org-name/package-name、@username/package-name、package-nameのいずれか
- Go: packageName
 - 値は小文字にする必要があります。 
- Java: 
- バージョン: パッケージのバージョン。 
URL は次の形式にする必要があります。
gcloud
gs://assuredoss-metadata/language/package_id/version/metadata.json
URL は小文字にする必要があります。
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
- Go の URL の例: - gs://assuredoss-metadata/golang/github.com/rs/zerolog/1.9.1/metadata.json
curl
https://storage.googleapis.com/assuredoss-metadata/language/package_id/version/metadata.json
URL は小文字にする必要があります。
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
- Go の URL の例: - https://storage.googleapis.com/assuredoss-metadata/golang/github.com/rs/zerolog/1.9.1/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 と Go の場合、形式は- 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 の署名を検証します。
- メタデータ ファイルをダウンロードします。セキュリティ メタデータ フィールドで説明されているように、メタデータ ファイルには - 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.cert' > cert.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 cert.pem - 成功した場合、このコマンドは - cert.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 
- 2 つのダイジェストに差異がないか確認します。 - 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' > cert.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 cert.pem - 成功した場合、コマンドは - cert.pem: OKを返します。