mcpField
I
implementing-image-provenance-verification-with-cosign

implementing-image-provenance-verification-with-cosign

github.com/mukul975セキュリティ35.2k54 回インストール8 週間前に更新
リポジトリ

implementing-image-provenance-verification-with-cosign について

コンテナイメージの管理者やセキュリティチーム向けの Cosign 実装ガイドです。鍵ベースおよび OIDC による鍵なし署名、検証、証明情報、デプロイポリシーを扱います。

主な機能

  1. 01鍵または OIDC による署名
  2. 02イメージ署名と ID の検証
  3. 03SBOM とスキャン証明の添付
  4. 04CI/CD 署名フローへの統合
  5. 05Kubernetes ポリシーによる検証の強制

活用シーン

  1. 01リリース用コンテナイメージへの署名
  2. 02パイプラインでのビルド ID 検証
  3. 03イメージと共に SBOM や来歴情報を公開
  4. 04未署名イメージのクラスター配置を阻止

インストール

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

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill implementing-image-provenance-verification-with-cosign

インストール後、Claude Code で/implementing-image-provenance-verification-with-cosignを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

詳細

Cosign によるイメージ来歴検証の実装

概要

Cosign は、コンテナイメージおよび OCI アーティファクトへの署名、検証、メタデータの添付を行う Sigstore のツールです。鍵ベースとキーレス(OIDC)の両方の署名方式をサポートし、Fulcio(証明書認証局)および Rekor(透明性ログ)と統合して、コンテナイメージのサプライチェーンセキュリティを実現します。

使用するタイミング

  • 環境において、cosign によるイメージ来歴検証の実装機能をデプロイまたは設定するとき
  • コンプライアンス要件に沿ったセキュリティ統制を確立するとき
  • この領域のセキュリティアーキテクチャを構築または改善するとき
  • この実装が必要なセキュリティアセスメントを実施するとき

前提条件

  • Cosign CLI がインストールされていること
  • イメージのビルドに Docker または Podman を使用できること
  • OCI 準拠のコンテナレジストリ(Docker Hub、GHCR、GCR、ECR)
  • キーレス署名用の OIDC プロバイダーのアカウント(GitHub、Google、Microsoft)

Cosign のインストール

# Install via Go
go install github.com/sigstore/cosign/v2/cmd/cosign@latest

# Install via Homebrew
brew install cosign

# Install via script
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign

# Verify installation
cosign version

鍵ベースの署名

鍵ペアの生成
# Generate cosign key pair (creates cosign.key and cosign.pub)
cosign generate-key-pair

# Generate key pair stored in KMS
cosign generate-key-pair --kms awskms:///alias/cosign-key
cosign generate-key-pair --kms gcpkms://projects/PROJECT/locations/LOCATION/keyRings/KEYRING/cryptoKeys/KEY
cosign generate-key-pair --kms hashivault://transit/keys/cosign
鍵によるイメージの署名
# Sign an image
cosign sign --key cosign.key ghcr.io/myorg/myapp:v1.0.0

# Sign with annotations
cosign sign --key cosign.key \
  -a "build-id=12345" \
  -a "git-sha=$(git rev-parse HEAD)" \
  ghcr.io/myorg/myapp:v1.0.0
鍵によるイメージの検証
# Verify signature
cosign verify --key cosign.pub ghcr.io/myorg/myapp:v1.0.0

# Verify with annotation check
cosign verify --key cosign.pub \
  -a "build-id=12345" \
  ghcr.io/myorg/myapp:v1.0.0

キーレス署名(OIDC)

キーレス署名(対話型)
# Keyless sign - opens browser for OIDC auth
cosign sign ghcr.io/myorg/myapp:v1.0.0

# The signature, certificate, and Rekor entry are created automatically
キーレス署名(CI/CD - 非対話型)
# GitHub Actions (uses OIDC token automatically)
cosign sign ghcr.io/myorg/myapp:v1.0.0 \
  --yes

# With explicit identity token
cosign sign ghcr.io/myorg/myapp:v1.0.0 \
  --identity-token=$(cat /var/run/sigstore/cosign/oidc-token) \
  --yes
キーレス署名の検証
# Verify by email identity
cosign verify ghcr.io/myorg/myapp:v1.0.0 \
  [email protected] \
  --certificate-oidc-issuer=https://accounts.google.com

# Verify by GitHub Actions workflow
cosign verify ghcr.io/myorg/myapp:v1.0.0 \
  --certificate-identity=https://github.com/myorg/myrepo/.github/workflows/build.yml@refs/heads/main \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com

# Verify with regex matching
cosign verify ghcr.io/myorg/myapp:v1.0.0 \
  --certificate-identity-regexp=".*@example.com" \
  --certificate-oidc-issuer=https://accounts.google.com

アテステーション(SLSA 来歴)

SBOM アテステーションの添付
# Generate SBOM
syft ghcr.io/myorg/myapp:v1.0.0 -o cyclonedx-json > sbom.cdx.json

# Attach SBOM as attestation
cosign attest --key cosign.key \
  --type cyclonedx \
  --predicate sbom.cdx.json \
  ghcr.io/myorg/myapp:v1.0.0

# Verify attestation
cosign verify-attestation --key cosign.pub \
  --type cyclonedx \
  ghcr.io/myorg/myapp:v1.0.0
脆弱性スキャンのアテステーションの添付
# Run scan and save results
grype ghcr.io/myorg/myapp:v1.0.0 -o json > vuln-scan.json

# Attach scan results as attestation
cosign attest --key cosign.key \
  --type vuln \
  --predicate vuln-scan.json \
  ghcr.io/myorg/myapp:v1.0.0
SLSA 来歴アテステーション
# Attach SLSA provenance
cosign attest --key cosign.key \
  --type slsaprovenance \
  --predicate provenance.json \
  ghcr.io/myorg/myapp:v1.0.0

# Verify SLSA provenance
cosign verify-attestation --key cosign.pub \
  --type slsaprovenance \
  ghcr.io/myorg/myapp:v1.0.0

CI/CD との統合

GitHub Actions
name: Sign and Publish
on:
  push:
    tags: ['v*']

permissions:
  contents: read
  packages: write
  id-token: write  # Required for keyless signing

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

      - uses: sigstore/cosign-installer@v3

      - name: Login to GHCR
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        id: build
        uses: docker/build-push-action@v5
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }}

      - name: Sign image (keyless)
        run: |
          cosign sign --yes \
            ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }}

      - name: Generate and attach SBOM
        run: |
          syft ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }} -o cyclonedx-json > sbom.json
          cosign attest --yes \
            --type cyclonedx \
            --predicate sbom.json \
            ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }}

Kubernetes のアドミッション適用

Policy Controller(Sigstore)
# Install policy-controller
helm repo add sigstore https://sigstore.github.io/helm-charts
helm install policy-controller sigstore/policy-controller \
  --namespace cosign-system --create-namespace
# Enforce signed images in namespace
apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: require-signed-images
spec:
  images:
    - glob: "ghcr.io/myorg/**"
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
        identities:
          - issuer: https://token.actions.githubusercontent.com
            subjectRegExp: "https://github.com/myorg/.*"
      ctlog:
        url: https://rekor.sigstore.dev
Kyverno との統合
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signature
spec:
  validationFailureAction: Enforce
  rules:
    - name: verify-cosign-signature
      match:
        any:
          - resources:
              kinds: ["Pod"]
      verifyImages:
        - imageReferences:
            - "ghcr.io/myorg/*"
          attestors:
            - entries:
                - keyless:
                    subject: "https://github.com/myorg/*"
                    issuer: "https://token.actions.githubusercontent.com"
                    rekor:
                      url: https://rekor.sigstore.dev

透明性ログ(Rekor)

# Search Rekor for image signatures
rekor-cli search --email [email protected]

# Get specific entry
rekor-cli get --uuid <entry-uuid>

# Verify entry inclusion
cosign verify ghcr.io/myorg/myapp:v1.0.0 \
  [email protected] \
  --certificate-oidc-issuer=https://accounts.google.com

ベストプラクティス

  1. キーレス署名を使用する: 自動化されたパイプラインでは CI/CD においてキーレス署名を使用してください
  2. タグではなくダイジェストで署名する: 不変な参照のため、タグではなくダイジェストで署名してください
  3. SBOM アテステーションを署名と併せて添付する: 署名と一緒に SBOM アテステーションを添付してください
  4. アドミッション時に署名を強制する: policy-controller または Kyverno を使用して、アドミッション時に署名を強制してください
  5. 鍵の検証だけでなく OIDC ID の検証を使用する: 鍵の検証のみに頼らず、OIDC ID の検証を使用してください
  6. 鍵を KMS に保管する: 鍵ベースの署名では、鍵を KMS(AWS KMS、GCP KMS、HashiCorp Vault)に保管してください
  7. 検証チェーン全体を確認する: 署名、証明書、Rekor への包含を確認してください
  8. ビルドメタデータを署名に注釈として含める: 署名の注釈としてビルドメタデータを含めてください

コメント