container-scanning について
container-scanningは、コンテナイメージを構築・デプロイ・保護するチーム向けのスキャンガイドです。複数のスキャナー、CI連携、レジストリスキャン、アドミッション制御を扱います。
主な機能
- 01イメージの脆弱性と設定ミスの検出
- 02TrivyやGrypeなどの比較
- 03ファイルシステムと構成のスキャン
- 04CI/CDとイメージレジストリの連携
- 05ポリシーとアドミッション制御の設定
活用シーン
- 01ビルド時のイメージ検査
- 02レジストリでの脆弱性スキャン有効化
- 03CI/CDへのセキュリティゲート追加
- 04デプロイ前のイメージ受け入れ方針設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill container-scanningインストール後、Claude Code で/container-scanningを入力して読み込まれたか確認します。
詳細
コンテナスキャン
コンテナイメージをスキャンし、脆弱性やセキュリティ上の設定ミスを検出します。
このスキルを使用する場面
次のような場合にこのスキルを使用します。
- コンテナイメージをビルドするとき
- コンテナセキュリティのゲートを実装するとき
- レジストリ内のイメージをスキャンするとき
- コンプライアンス要件を満たすとき
- コンテナのデプロイを強化するとき
前提条件
- コンテナランタイム(Docker、Podman)
- スキャン対象のコンテナイメージ
- スキャンツールのインストール
ツールの比較
| ツール | ライセンス | 速度 | 機能 |
|---|---|---|---|
| Trivy | OSS | 高速 | 包括的、IaC |
| Grype | OSS | 高速 | 高精度、SBOM |
| Clair | OSS | 中速 | レジストリ統合 |
| Snyk Container | 商用 | 高速 | 修正案 |
| Docker Scout | 商用 | 高速 | GitHub 統合 |
Trivy
インストール
# Linux
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# macOS
brew install trivy
# Docker
docker pull aquasec/trivy
イメージスキャン
# Scan local image
trivy image myapp:latest
# Scan remote image
trivy image nginx:1.25
# JSON output
trivy image --format json -o results.json myapp:latest
# Filter by severity
trivy image --severity HIGH,CRITICAL myapp:latest
# Ignore unfixed vulnerabilities
trivy image --ignore-unfixed myapp:latest
# Exit code on vulnerability
trivy image --exit-code 1 --severity CRITICAL myapp:latest
ファイルシステムのスキャン
# Scan project directory
trivy fs /path/to/project
# Scan Dockerfile
trivy config Dockerfile
# Scan Kubernetes manifests
trivy config k8s/
設定
# trivy.yaml
timeout: 10m
severity:
- HIGH
- CRITICAL
ignore-unfixed: true
exit-code: 1
vulnerability:
type:
- os
- library
scan:
file-patterns:
- "Dockerfile"
- "*.yaml"
CI との統合
# GitHub Actions
name: Container Security
on:
push:
branches: [main]
pull_request:
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:${{ github.sha }}'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload results
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
Grype
インストール
# Linux/macOS
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
# Homebrew
brew install grype
使用方法
# Scan image
grype myapp:latest
# Scan from SBOM
grype sbom:./sbom.json
# JSON output
grype myapp:latest -o json > results.json
# Filter severity
grype myapp:latest --fail-on high
# Scan directory
grype dir:/path/to/project
設定
# .grype.yaml
check-for-app-update: false
fail-on-severity: high
output: "json"
scope: "Squashed"
ignore:
- vulnerability: CVE-2023-12345
reason: "False positive"
expires: "2024-12-31"
Docker Scout
使用方法
# Enable Docker Scout
docker scout quickview myapp:latest
# Full CVE report
docker scout cves myapp:latest
# Compare images
docker scout compare myapp:v1 myapp:v2
# Recommendations
docker scout recommendations myapp:latest
CI との統合
- name: Docker Scout
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.IMAGE_NAME }}
sarif-file: scout-results.sarif
summary: true
レジストリとの統合
Amazon ECR
# Enable scan on push
aws ecr put-image-scanning-configuration \
--repository-name myapp \
--image-scanning-configuration scanOnPush=true
# Get scan findings
aws ecr describe-image-scan-findings \
--repository-name myapp \
--image-id imageTag=latest
# Start manual scan
aws ecr start-image-scan \
--repository-name myapp \
--image-id imageTag=latest
Azure ACR
# Enable Defender for Containers
az security pricing create \
--name Containers \
--tier Standard
# View scan results in Azure Portal or:
az acr repository show \
--name myregistry \
--image myapp:latest
Google Artifact Registry
# Enable vulnerability scanning
gcloud artifacts repositories update myrepo \
--location=us-central1 \
--enable-vulnerability-scanning
# View vulnerabilities
gcloud artifacts docker images describe \
us-central1-docker.pkg.dev/project/myrepo/myapp:latest \
--show-package-vulnerability
アドミッションコントローラー
OPA Gatekeeper
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8sallowedrepos
spec:
crd:
spec:
names:
kind: K8sAllowedRepos
validation:
openAPIV3Schema:
properties:
repos:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sallowedrepos
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
satisfied := [good | repo = input.parameters.repos[_]; good = startswith(container.image, repo)]
not any(satisfied)
msg := sprintf("container <%v> has an invalid image repo <%v>", [container.name, container.image])
}
Kyverno
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-image-scan
spec:
validationFailureAction: enforce
rules:
- name: check-vulnerabilities
match:
resources:
kinds:
- Pod
verifyImages:
- image: "*"
attestations:
- predicateType: cosign.sigstore.dev/attestation/vuln/v1
conditions:
- all:
- key: "{{ scanner.result.summary.criticalCount }}"
operator: Equals
value: "0"
スキャンポリシー
ポリシーの定義
# scan-policy.yaml
policies:
- name: critical-vulnerabilities
description: Block images with critical CVEs
severity: CRITICAL
action: block
- name: high-vulnerabilities
description: Warn on high severity CVEs
severity: HIGH
action: warn
max_count: 5
- name: age-policy
description: Block images older than 30 days
max_age_days: 30
action: block
- name: base-image
description: Only allow approved base images
allowed_bases:
- alpine:3.18
- ubuntu:22.04
- python:3.11-slim
よくある問題
問題:誤検知
問題:スキャナーが悪用できない脆弱性を報告する 解決策:無視ファイルを使用し、状況を踏まえて検証する
問題:スキャンが遅い
問題:スキャンに時間がかかりすぎる 解決策:キャッシュを使用し、段階的にスキャンして、イメージレイヤーを最適化する
問題:修正されていない脆弱性
問題:CVE に対するパッチがない 解決策:ベースイメージを更新し、代替のセキュリティ対策を実装する
ベストプラクティス
- CI/CD パイプラインでスキャンする
- 最小限のベースイメージ(Alpine、distroless)を使用する
- ベースイメージを定期的に更新する
- アドミッション制御を実装する
- 脆弱性を継続的に追跡する
- 重要度のしきい値を設定する
- 許容したリスクを文書化する
- マルチステージビルドを使用する
関連スキル
- docker-management - コンテナの基礎
- container-hardening - セキュリティの強化
- kubernetes-hardening - K8s のセキュリティ
コメント
Markdown 対応