
AIを搭載したDockerセキュリティスキャナー。脆弱性を平易な言葉で説明します。OWASP Lab Projectです。

AIを活用したDockerセキュリティスキャナー。脆弱性を平易な英語で解説します
DockSecは、複雑なセキュリティスキャン結果と開発者が実行可能な修正の間のギャップを埋めるOWASP Lab Projectです。業界標準のスキャナー(Trivy、Hadolint、Docker Scout)とAIを統合し、コンテキストを考慮したセキュリティ分析を提供します。
200以上のCVEのリストで圧倒する代わりに、DockSecは次のことを行います:
すべてのスキャンはローカルで実行されます。マシンから送信されるのは、選択したAIプロバイダーに送信される(シークレットを編集済みの)ファイルコンテンツのみです。ローカルモデルまたはスキャンのみのモードを使用すれば、何も外部に送信されません。データフローとプライバシーを参照してください。
DockSecのワークフロー:スキャンから実用的なインサイトまで
DockSecは4段階のパイプラインに従います:
DockSecはローカルスキャナーをオーケストレーションするため、以下が必要です:
| 要件 | 用途 | インストール |
|---|---|---|
| Python 3.12+ | DockSec自体 | python.org |
| Trivy | すべてのスキャン(必須) | brew install trivy または Trivyドキュメント |
| Hadolint | Dockerfileのlint | brew install hadolint または Hadolintドキュメント |
| Docker | イメージスキャン(-i) | Dockerドキュメント |
または、DockSecにTrivyとHadolintを自動インストールさせることもできます:```bash python -m docksec.setup_external_tools
### 2. DockSec をインストールする```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
ローカルスキャンにはAPIキーは不要です:```bash docksec Dockerfile --scan-only
すべてのスキャンは結果サマリーで終了します。重大度テーブル、評価付きの0〜100のセキュリティスコア、「クイックテイク」アクションブロック、生成されたレポート(デフォルトでは`~/.docksec/results/`に保存)、および推奨される次のコマンドが含まれます。
### 4. AI分析を有効にする
AI分析は、検出結果を説明し、修正方法を提案します。プロバイダーを選択し、そのAPIキーを設定して、実行します。```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
各プロバイダーには適切なデフォルトモデルが設定されています(OpenAI: gpt-4o、Anthropic:
claude-haiku-4-5、Google: gemini-1.5-pro、Ollama: llama3.1)。そのため、--model は
オプションです。フラグを繰り返し指定しないようにするには、環境変数を設定するか(または実行するディレクトリの .env
ファイルに記述します。DockSec が自動的に読み込みます):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
AIプロバイダーにコンテンツが送信される前に、秘密情報らしき値(パスワード、トークン、
APIキー、秘密鍵ブロック)は自動的にマスクされます。詳細は
[データフローとプライバシー](#data-flow-and-privacy)を参照してください。
### 5. またはGitHub Actionを使用する```yaml
- name: Run DockSec AI Scanner
uses: OWASP/[email protected]
with:
dockerfile: 'Dockerfile'
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
docksec Dockerfile -i myapp:latest
docksec --compose docker-compose.yml
docksec --image-only -i myapp:latest
docksec Dockerfile --scan-only
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
docksec -i myapp:latest --image-only --fail-on high
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
docksec -i myapp:latest --image-only --json
docksec Dockerfile --scan-only --sarif
docksec --image-only -i myapp:latest --sbom
docksec --image-only -i myapp:latest --offline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
docksec -i myapp:latest --image-only --no-cache
docksec install-skill
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log docksec Dockerfile --no-color # also honors NO_COLOR
---
## 設定ファイル
リポジトリのルートに `.docksec.yml` をコミットすると、チーム全体(およびすべてのCIジョブ)が、各開発者が独自のフラグを渡す代わりに、同じポリシーの下でスキャンを実行できます。```yaml
# yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH
fail_on: HIGH
formats: [json, html]
output_dir: ./security-reports
rules:
disabled:
- compose-missing-healthcheck
すべての設定は任意です。省略した項目は環境変数にフォールバックし、さらに組み込みのデフォルト値にフォールバックします。完全な注釈付きの例は examples/.docksec.yml にあります。
優先度の高い順:``` CLI flag > environment variable > .docksec.yml > built-in default
So a committed `severity: LOW` is still overridden by `--severity CRITICAL` on
the command line, and by `DOCKSEC_DEFAULT_SEVERITY` in the environment.
### Discovery
DockSec looks for `.docksec.yml` (or `.docksec.yaml`) in the working directory
and then walks up to the repository root, so a service in a monorepo
subdirectory inherits the policy committed at the top level. The search stops at
the directory containing `.git`, so it never picks up a file from outside the
repository.
- `--config FILE` uses a specific file instead of searching.
- `--no-config` ignores any config file, for reproducible CI runs.
The config file in force is shown in the scan banner, so it is always clear
which policy was applied.
### Settings
| Setting | Equivalent flag | Notes |
| --- | --- | --- |
| `severity` | `--severity` | Severity levels for the image scan |
| `fail_on` | `--fail-on` | CI gate threshold |
| `formats` | `--format` | List form: `[json, html]` |
| `output_dir` | `--output-dir` | Report destination |
| `provider` | `--provider` | `openai`, `anthropic`, `google`, `ollama` |
| `model` | `--model` | Model name for the provider |
| `offline` | `--offline` | No network; skips AI and Docker Scout |
| `skip_ai_scoring` | `--skip-ai-scoring` | Local scoring only |
| `no_redact` | `--no-redact` | Do not mask secrets before the AI call |
| `no_cache` | `--no-cache` | Bypass the scan cache |
| `ignore_file` | `--ignore-file` | Waiver file path |
| `baseline` | `--baseline` | Baseline file path |
| `rules.disabled` | - | Rule IDs to switch off entirely |
An invalid config file - an unknown key, a bad severity - is a hard error that
exits `2` rather than a warning, so a broken policy file can never cause a scan
to run under rules the team did not commit.
### Editor autocomplete
The `# yaml-language-server:` comment on the first line gives completion and
inline validation in VS Code and JetBrains editors. The schema is published at
[`docs/docksec-config-schema.json`](https://github.com/owasp/docksec/blob/main/docs/docksec-config-schema.json) and can be
regenerated with `docksec --print-config-schema`.
### Disabling rules
`rules.disabled` switches a check off entirely, everywhere - it is removed
before scoring, reports, `--json`, and the `--fail-on` gate. Use it for checks
that do not apply to your environment. For individual findings your team has
triaged and accepted, prefer the [waiver file](#ignoring-findings-waivers),
whose entries carry a reason and an expiry date and so stay auditable.
---
## CI/CD Integration
### Exit codes
DockSec uses CI-friendly exit codes so builds and shells can react to results:
| Code | Meaning |
|---|---|
| `0` | Success, no findings at or above `--fail-on` |
| `1` | Findings at or above the `--fail-on` threshold |
| `2` | Usage or argument error |
| `3` | Tool or runtime error (scan failed, image not found, missing tools) |
`--fail-on` gates on the structured findings (image vulnerabilities and compose
misconfigurations). When `--fail-on` is below the requested `--severity`, the scan
severity is widened automatically so the gate can observe those findings.
### Machine-readable output
`--json` prints a single JSON object to stdout (scan info, vulnerabilities, severity
counts, and any AI findings) instead of the human-readable summary, so it can be piped
straight into other tools:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
--json 単独ではレポートファイルは書き込まれず、--format と組み合わせることで、同じ実行でファイルの書き込みと JSON の出力の両方を行えます。--json モードでは、人間が読めるメッセージはすべて stderr に移動するため、stdout には JSON ペイロードのみが含まれます。
--sarif は、他のレポート形式と並んで SARIF 2.1.0 レポートを書き込みます。標準の github/codeql-action/upload-sarif アクションでアップロードすると、プルリクエスト上や Security タブで検出結果が直接注釈付きで表示されます。```yaml
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` は重要です。これがないと、`--fail-on` によって DockSec が非ゼロで終了するたびにアップロードステップがスキップされ、最も重要なまさにその時に結果が失われてしまいます。
### ベースライン / ラチェットモード
`--baseline FILE` を使用すると、既存のプロジェクトで、既存の結果の壁によってすべてのビルドがブロックされることなく `--fail-on` を導入できます。`--update-baseline` を指定して一度実行し、今日の結果をスナップショットとして保存してから、ベースラインファイルをコミットします。以降、`--fail-on` はベースラインにまだ含まれていない結果に対してのみゲートをかけます。```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
検出結果は脆弱性ID、ターゲット、パッケージ名で照合されるため、無関係な検出結果が増減してもベースラインは有効なままです。現在の状態を新しいベースラインとして受け入れたい場合は、--update-baseline を指定して再実行してください。
--ignore-file FILE は、チームがトリアージして受け入れた個別の検出結果を抑制します。ベースライン(特定時点のスナップショット)とは異なり、無視ファイルは明示的でレビュー可能なリストであり、各エントリには理由と任意の有効期限日が含まれます。現在のディレクトリに .docksec-ignore.yml ファイルが存在する場合、それは自動的に読み込まれます。```yaml
ignores:
抑制された検出結果は、スコアリング、レポート、`--json` 出力、および
`--fail-on` ゲートの前に除外されます。期限切れのエントリは自動的に適用が停止され(警告付き)、
理由のないエントリはフラグが立てられるため、免除は監査可能な状態に保たれます。ファイルを
バージョン管理にコミットして、抑制が他の変更と同様にレビューされるようにしてください。
---
## レポート
### レポート形式
デフォルトでは、各スキャンは4つのレポートファイルを書き出します。サブセットを選択するには `--format` を使用します:
- **html**: インタラクティブで視覚的にクリーンなWebレポート: 深刻度カード、スコア評価、修正バージョン付きの完全な脆弱性テーブル、および完全なAI検出結果。
- **pdf**: 持ち運び可能で、プレゼンテーション対応のドキュメント。
- **json**: 完全な、機械可読なスキャンデータ(`--json` のstdout出力と同じ形状)。
- **csv**: 個々の脆弱性のスプレッドシート対応テーブル。
> CSVの動作に関する注意: 脆弱性がゼロの場合、DockSecはヘッダーのみの
> CSV(列名のみ、行なし)を書き出します。これにより、下流の自動化がファイルの欠落や
> 空ファイルで壊れることはありません。これは意図的な動作です。
### CycloneDX SBOM
`--sbom` は、スキャンしたイメージのCycloneDXソフトウェア部品表(`<image>.cdx.json`)を書き出し、
すべてのパッケージコンポーネントと既知の脆弱性を一覧表示します。BOMは
Trivyのネイティブエクスポーターによって生成されるため(仕様準拠)、DockSecは自身を
ツールメタデータにスタンプします。これをDependency-Track、GitHubの依存関係グラフ、または
その他のSBOMコンシューマにフィードしてください:```bash
docksec --image-only -i myapp:latest --sbom
--sbom は単一のイメージ(-i)を必要とするため、compose 実行ではスキップされます。--sarif と同様に、--format とは独立しています。
DockSec は、何がマシンから送信されるかを常に把握できるように設計されています:
--no-redact を使用します。--provider ollama を使用すると、AI 分析を自分のハードウェア上で実行できます。また、--scan-only / --offline を使用すると、AI を完全にスキップできます。--offline は、ネットワークアクセスなしでスキャンを実行します。すでにディスク上にある Trivy 脆弱性データベースを使用し(DB の更新なし)、ネットワークを必要とする AI 分析と Docker Scout の高度なスキャンの両方をスキップします。これは、エアギャップ環境やロックダウンされた環境でスキャンする最も簡単な方法です:```bash
docksec --image-only -i myapp:latest --offline
Trivy DBが少なくとも一度はダウンロードされていることを確認してください(以前のオンラインスキャンで実行されます)`--offline`に依存する前に。
### スキャン結果キャッシュ
イメージスキャン結果はキャッシュされます(デフォルト: 24時間、`DOCKSEC_CACHE_TTL_HOURS`で上書き可能)が、イメージのコンテンツダイジェストをキーとして使用するため、再利用された`:latest`などの再ビルドされたタグは常に新しいスキャンが実行されます。`--no-cache`(または`DOCKSEC_USE_CACHE=false`)を使用すると、実行時にキャッシュをバイパスできます。
---
## AIアシスタントスキル(`install-skill`)
`docksec install-skill`は、DockSecの使用手順を人気のあるAIコーディングアシスタントの既知のコンテキストファイルに書き込みます。これにより、リポジトリで作業するアシスタントがDockSecの呼び出し方法を認識できるようになります。```bash
docksec install-skill
これにより、以下が作成または更新されます:
.claude/commands/docksec.md(Claude Codeスラッシュコマンド /docksec).cursor/rules/docksec.mdc(Cursor)AGENTS.md(Codex CLI)、GEMINI.md(Gemini CLI).github/copilot-instructions.md(GitHub Copilot)これらのファイルはレビューしてコミットできるプレーンテキストであり、何も実行されません。コマンドを再実行すると、DockSecセクションが重複するのではなく、その場で更新されます。
--fail-on終了コード、ベースライン/ラチェットモード、監査可能な免除、JSON-to-stdout、MarketplaceのGitHub Action。--offline)。docksec install-skillで、Claude Code、Cursor、Copilotなどにリポジトリ内でDockSecを実行する方法を教えます。| 機能 | DockSec | Trivy(単体) | Snyk Container | Aikido |
|---|---|---|---|---|
| ライセンスとコスト | 無料、オープンソース(MIT) | 無料、オープンソース(Apache 2.0) | 商用(限定無料枠) | 商用(限定無料枠) |
| ガバナンス | OWASP Labプロジェクト、ベンダーニュートラル | オープンソース、Aquaが保守 | 単一ベンダー | 単一ベンダー |
| CVEとDockerfile設定ミスの検出 | はい | はい | はい | はい |
| 調査結果を平易な英語で説明 | はい(AIが作成したコンテキストと影響) | いいえ(生のCVEデータ) | 一部(重大度と修正ヒント) | 一部(プラットフォームのAI要約) |
| コンテキストに応じたDockerfile修正 | はい(説明付きの具体的な書き換え) | いいえ(検出のみ) | はい(ベースイメージアップグレードのアドバイス、修正PR) | はい(AI AutoFix PR) |
| Docker Compose(マルチサービス)スキャン | はい(オーケストレーションチェックとサービスごとのスキャン) | 一部(設定スキャン、サービスごとのファンアウトなし) | 一部 | 一部 |
| ベースライン/ラチェットモード(新規検出のみで失敗) | はい | いいえ | 一部(プラットフォームポリシー) | 一部(プラットフォームポリシー) |
| 理由と有効期限付きの監査可能な検出ごとの免除 | はい | 一部(.trivyignore、理由の強制なし) | 一部(プラットフォームポリシー) | 一部(プラットフォームポリシー) |
| CIネイティブ出力(GitHub Code Scanning用SARIF) | はい | はい | はい | はい |
| SBOMエクスポート(CycloneDX) | はい(--sbom) | はい | はい | はい |
| AIアシスタントスキルインストール(Claude Code、Cursor、Copilot) | はい(install-skill) | いいえ | いいえ | いいえ |
| 完全オフライン/エアギャップ環境での実行 | はい(Ollama経由のローカルLLM、スキャンのみのモード、APIキー不要) | スキャンのみ(修正レイヤーなし) | いいえ(クラウドプラットフォーム) | いいえ(ホスト型プラットフォーム) |
| イメージデータがネットワーク内に留まる | はい | はい | いいえ | いいえ |
| 独自のLLM/モデル選択 | はい(OpenAI、Anthropic、Gemini、またはローカルOllama) | 該当なし | いいえ(プロプライエタリAI) | いいえ(プロプライエタリAI) |
| セルフホスト可能、プラットフォーム展開不要 | はい | はい | いいえ | いいえ |
| ベンダーロックイン | なし | なし | あり | あり |
| セキュリティスコア(0〜100)とマルチフォーマットレポート | はい | 一部(マシン形式、修正レポートなし) | 一部(ダッシュボードレポート) | 一部(ダッシュボードレポート) |
DockSecは、これらの中で唯一、コンテキストに応じたDockerfile修正と、完全にオープンソースでOWASPがガバナンスを担い、ローカルで実行可能な設計を組み合わせています。SnykとAikidoは有能なAI修正を提供しますが、データを自社サービスに送信する商用クラウドプラットフォームとしてのみです。Trivyはオープンソースでローカルですが、検出で止まり、修正の支援はしません。DockSecは、修正ガイダンスとデータの完全な制御の両方を無料で必要とする開発者や、規制対象またはエアギャップ環境のチームにとってのギャップを埋めます。
DockSecの今後の方向性についてはROADMAP.mdを参照してください:ローカルDockerデーモンなしのレジストリスキャン、リポジトリレベルのポリシー設定ファイル、Jenkins/GitLab/Azure DevOpsテンプレート、公式コンテナイメージ、KubernetesとHelmのスキャンなど。優先順位に関するフィードバックと投票は、issuesとOWASP Slackで歓迎します。
DockSecはコミュニティの貢献によって成長しています。開発者、デザイナー、セキュリティ愛好家のいずれであっても、参加する方法はたくさんあります:
始めるには、貢献ガイドライン、行動規範、スポンサーシップガイドをご覧ください。
DockSecは、コンテナセキュリティを身近なものにすることに専念する献身的なチームによって率いられています:
私たちはここにいます: