mcpField
A
artifact-sbom-publisher

artifact-sbom-publisher

github.com/patricio0312revセキュリティ63243 回インストール41 週間前に更新
リポジトリ

artifact-sbom-publisher について

ソフトウェアサプライチェーンのメタデータを付けて成果物を公開する、ビルドおよびリリースワークフロー向けのスキルです。SBOM 生成、脆弱性スキャン、来歴情報、メタデータ、アテステーションを扱います。

主な機能

  1. 01ビルド成果物の公開
  2. 02SPDX と CycloneDX の SBOM 生成
  3. 03SBOM の脆弱性スキャン
  4. 04SLSA 来歴情報の生成
  5. 05成果物メタデータとアテステーション

活用シーン

  1. 01ソフトウェアリリースへの SBOM 添付
  2. 02リリース前の SBOM スキャン
  3. 03ビルド来歴と成果物メタデータの記録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/patricio0312rev/skills --skill artifact-sbom-publisher

インストール後、Claude Code で/artifact-sbom-publisherを入力して読み込まれたか確認します。

詳細

Artifact & SBOM パブリッシャー

サプライチェーンのセキュリティメタデータを含むアーティファクトを生成し、公開します。

ビルドアーティファクト

build:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4

    - uses: actions/setup-node@v4
      with:
        node-version: "20"

    - run: npm ci
    - run: npm run build

    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: dist-${{ github.sha }}
        path: |
          dist/
          !dist/**/*.map
        retention-days: 30
        if-no-files-found: error

SBOM の生成(CycloneDX)

sbom:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4

    - name: Generate SBOM
      uses: CycloneDX/gh-node-module-generatebom@master
      with:
        path: ./
        output: ./sbom.json

    - name: Upload SBOM
      uses: actions/upload-artifact@v4
      with:
        name: sbom-${{ github.sha }}
        path: sbom.json

Syft を使用した SBOM

- name: Generate SBOM with Syft
  run: |
    curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
    syft . -o spdx-json > sbom-spdx.json
    syft . -o cyclonedx-json > sbom-cyclonedx.json

- name: Upload SBOMs
  uses: actions/upload-artifact@v4
  with:
    name: sboms
    path: |
      sbom-spdx.json
      sbom-cyclonedx.json

Docker イメージの SBOM

- name: Build image
  uses: docker/build-push-action@v5
  with:
    context: .
    push: true
    tags: myapp:${{ github.sha }}
    sbom: true
    provenance: true

- name: Generate SBOM for image
  run: |
    syft myapp:${{ github.sha }} -o spdx-json > image-sbom.json

- name: Scan SBOM for vulnerabilities
  uses: anchore/scan-action@v3
  with:
    sbom: image-sbom.json
    fail-build: true
    severity-cutoff: high

ビルドの来歴(SLSA)

provenance:
  runs-on: ubuntu-latest
  permissions:
    actions: read
    id-token: write
    contents: write
  steps:
    - uses: actions/checkout@v4

    - name: Build
      run: npm run build

    - name: Generate provenance
      uses: actions/attest-build-provenance@v1
      with:
        subject-path: "dist/**"

アーティファクトのメタデータ

- name: Create artifact metadata
  run: |
    cat > artifact-metadata.json << EOF
    {
      "version": "${{ github.ref_name }}",
      "commit": "${{ github.sha }}",
      "branch": "${{ github.ref }}",
      "build_time": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
      "builder": "GitHub Actions",
      "workflow": "${{ github.workflow }}",
      "run_id": "${{ github.run_id }}",
      "actor": "${{ github.actor }}"
    }
    EOF

- name: Upload metadata
  uses: actions/upload-artifact@v4
  with:
    name: metadata
    path: artifact-metadata.json

パッケージ化とリリース

release:
  runs-on: ubuntu-latest
  needs: [build, sbom]
  if: github.event_name == 'release'
  steps:
    - name: Download artifacts
      uses: actions/download-artifact@v4
      with:
        path: artifacts/

    - name: Create release package
      run: |
        cd artifacts
        tar -czf ../release.tar.gz dist-* sbom-* metadata/

    - name: Upload to release
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ github.event.release.upload_url }}
        asset_path: ./release.tar.gz
        asset_name: release-${{ github.ref_name }}.tar.gz
        asset_content_type: application/gzip

脆弱性スキャン

- name: Scan SBOM for vulnerabilities
  uses: aquasecurity/trivy-action@master
  with:
    scan-type: "sbom"
    format: "sarif"
    output: "trivy-results.sarif"
    sbom-sources: "sbom.json"

- name: Upload scan results
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: "trivy-results.sarif"

アーティファクトの証明

- name: Attest artifact
  uses: actions/attest@v1
  with:
    subject-path: "dist/myapp.tar.gz"
    predicate-type: "https://slsa.dev/provenance/v1"
    predicate: |
      {
        "buildType": "https://github.com/actions/workflow",
        "builder": {
          "id": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
        },
        "metadata": {
          "buildInvocationId": "${{ github.run_id }}",
          "completeness": {
            "parameters": true,
            "environment": false,
            "materials": true
          }
        }
      }

ベストプラクティス

  1. SBOM を生成する:すべてのリリースで実施します
  2. 複数の形式を使用する:SPDX と CycloneDX
  3. 脆弱性をスキャンする:リリース前に実施します
  4. アーティファクトに署名する:検証できるようにします
  5. 来歴を含める:SLSA 証明
  6. 保持ポリシーを設定する:アーティファクトを 30 日間保持します
  7. メタデータを含める:バージョン、コミット、タイムスタンプ
  8. 自動化する:すべてのビルドに組み込みます

出力チェックリスト

  • ビルドアーティファクトをアップロード済み
  • SBOM を生成済み(SPDX または CycloneDX)
  • 脆弱性スキャンを設定済み
  • ビルドの来歴を生成済み
  • アーティファクトのメタデータを含め済み
  • リリースのパッケージ化を自動化済み
  • 証明/署名(任意)
  • 保持ポリシーを設定済み

コメント