
DockSec v2026.9.21
AIを搭載したDockerセキュリティスキャナー。脆弱性を平易な言葉で説明します。OWASP Lab Projectです。
DockSec とは?
DockSec は、複雑なセキュリティスキャン結果と開発者が実行できる修正との間のギャップを埋める OWASP Lab Project です。業界標準のスキャナー(Trivy、Hadolint、Docker Scout)を AI と統合し、コンテキストを考慮したセキュリティ分析を提供します。
200 件以上の CVE のリストで圧倒する代わりに、DockSec は次のことを行います:
- あなたの特定のコンテナ構成に実際に影響するものを優先順位付けします。
- セキュリティ用語だけでなく、脆弱性を平易な英語で説明します。
- あなたの Dockerfile に対する具体的な修正を提案します。
- チーム向けのプロフェッショナルでインタラクティブなセキュリティレポートを生成します。
すべてのスキャンはローカルで実行されます。あなたのマシンから外部に出る唯一のものは、選択した AI プロバイダーに送信される(シークレットが伏せられた)ファイル内容だけです。ローカルモデルまたはスキャンのみのモードを使用すれば、何も外部に出ません。詳しくはデータフローとプライバシーを参照してください。
仕組み
DockSec のワークフロー:スキャンから実行可能なインサイトまで
DockSec は 5 段階のパイプラインに従います:
- スキャン:あなたの環境で Trivy(イメージの脆弱性と Dockerfile の設定ミス)、 Hadolint、Docker Scout をローカルで実行します。
- 優先順位付け:すべての CVE 検出を、深刻度と EPSS の悪用可能性を組み合わせてランク付けします。これにより、リストは 発見された順ではなく、最初に修正すべきものの順に並びます。
- 相関分析:別々の検出が 1 つの攻撃経路に組み合わさる エクスプロイトチェーンを検出します。インターネットに公開されたサービスから到達可能な 認証情報付きデータベースは、無関係な 2 つの検出ではなく 1 つのチェーンです。 API キーがあれば、AI パスがスキャン出力全体を推論し、これをランク付け、説明、拡張します。
- 推奨:コピーして実行できる修正コマンドと、具体的な Dockerfile または compose の変更を生成し、それらが解決する検出件数を示します。
- レポート:実行可能な結果を HTML、PDF、JSON、CSV、Markdown、SARIF、CycloneDX SBOM としてエクスポートします。
はじめに
1. 前提条件
DockSec はローカルスキャナーを統括するため、以下が必要です:
| 要件 | 必要な用途 | インストール |
|---|---|---|
| Python 3.12+ | DockSec 自体 | python.org |
| Trivy | すべてのスキャン(必須) | brew install trivy または Trivy docs |
| Hadolint | Dockerfile のリント | brew install hadolint または Hadolint docs |
| Docker | イメージスキャン(-i) | Docker docs |
または、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
3. 最初のスキャンを実行する
ローカルスキャンには API キーは不要です:```bash docksec Dockerfile --scan-only
すべてのスキャンは結果サマリーで終了します。重大度テーブル、評価付きの0〜100のセキュリティスコア、「Quick take」アクションブロック、生成されたレポート(デフォルトでは`~/.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. またはコンテナイメージを実行する(インストール不要)
公開されているイメージには、固定バージョンの Trivy と Hadolint がバンドルされているため、
インストールも設定も不要です:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_DOCKERFILE=Dockerfile \
-e INPUT_SCAN_ONLY=true \
ghcr.io/owasp/docksec:latest
amd64 と arm64 のマルチアーキテクチャで、すべてのリリースで公開されています。CI では latest ではなく、特定のバージョン(ghcr.io/owasp/docksec:2026.9.21)またはマイナーシリーズ(ghcr.io/owasp/docksec:2026.9)に固定してください。すべてのイメージにはビルド来歴の証明が付属しています:```bash
gh attestation verify oci://ghcr.io/owasp/docksec:latest --repo OWASP/DockSec
このイメージは GitHub Action と同じ `INPUT_*` 変数を読み取るため、任意の Action 入力がここで機能します: `INPUT_IMAGE`、`INPUT_COMPOSE`、`INPUT_SEVERITY`、`INPUT_FAIL_ON`、`INPUT_FORMAT`、`INPUT_SARIF`、`INPUT_OUTPUT_DIR`。コンテナ終了後もレポートを保持するには、マウント上のどこかにレポートを書き込んでください:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_COMPOSE=docker-compose.yml \
-e INPUT_SCAN_ONLY=true \
-e INPUT_FORMAT=json,html \
-e INPUT_OUTPUT_DIR=/github/workspace/docksec-reports \
ghcr.io/owasp/docksec:latest
6. または GitHub Action を使用する```yaml
- name: Run DockSec AI Scanner uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' openai_api_key: ${{ secrets.OPENAI_API_KEY }}
---
## 一般的なコマンド```bash
# Scan Dockerfile + Docker image (AI + scanners)
docksec Dockerfile -i myapp:latest
# Scan a Docker Compose file and all its services
docksec --compose docker-compose.yml
# Scan only a Docker image
docksec --image-only -i myapp:latest
# Fast local scan, no AI, no API key
docksec Dockerfile --scan-only
# Choose which severity levels the image scan reports (default: CRITICAL,HIGH)
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
# Fail the build (exit 1) if any finding is HIGH or above
docksec -i myapp:latest --image-only --fail-on high
# Write only the report formats you want, to a directory of your choice
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
# Write a Markdown report for posting directly into a pull request comment
docksec Dockerfile --scan-only --format markdown
# Print results as JSON to stdout for scripts and CI pipelines
docksec -i myapp:latest --image-only --json
# Write a SARIF report for GitHub Code Scanning
docksec Dockerfile --scan-only --sarif
# Write a CycloneDX SBOM of an image for supply-chain tooling
docksec --image-only -i myapp:latest --sbom
# Fully offline scan: local Trivy DB, no network, no AI
docksec --image-only -i myapp:latest --offline
# Save today's findings as a baseline, then only gate on new findings later
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
# Suppress triaged findings with an auditable ignore file
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
# Force a fresh scan, bypassing the results cache
docksec -i myapp:latest --image-only --no-cache
# Install AI-assistant skill files (Claude Code, Cursor, Copilot, and more)
docksec install-skill
# Output control
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 --scan-only --compact-output # shorter per-finding output
docksec Dockerfile --no-color # also honors NO_COLOR
# Apply the mechanical Dockerfile fixes (keeps a .bak, re-scans, shows the delta)
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix
# Rank findings by severity alone, with no EPSS lookup and no network call
docksec Dockerfile --scan-only --no-epss
# Treat a scan that could not complete as a failure, not a pass
docksec Dockerfile --scan-only --fail-on high --incomplete-policy fail
設定ファイル
リポジトリのルートに .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`](https://github.com/owasp/docksec/blob/main/examples/.docksec.yml) にあります。
### 優先順位
優先度が高い順:```
CLI flag > environment variable > .docksec.yml > built-in default
コミットされた severity: LOW であっても、コマンドライン上の --severity CRITICAL や、環境変数の DOCKSEC_DEFAULT_SEVERITY によって上書きされます。
検出
DockSec は作業ディレクトリ内の .docksec.yml(または .docksec.yaml)を探し、その後リポジトリのルートまで遡って探索します。そのため、モノレポのサブディレクトリにあるサービスは、トップレベルでコミットされたポリシーを継承します。探索は .git を含むディレクトリで停止するため、リポジトリ外のファイルを拾うことはありません。
--config FILEは探索の代わりに特定のファイルを使用します。--no-configは設定ファイルを無視します。再現性のある CI 実行に使用します。
有効な設定ファイルはスキャンバナーに表示されるため、どのポリシーが適用されたかが常に明確になります。
設定
| 設定 | 対応するフラグ | 備考 |
|---|---|---|
severity | --severity | イメージスキャンの重大度レベル |
fail_on | --fail-on | CI ゲートのしきい値 |
formats | --format | リスト形式: [json, html] |
output_dir | --output-dir | レポートの出力先 |
provider | --provider | openai、anthropic、google、ollama |
model | --model | プロバイダーのモデル名 |
offline | --offline | ネットワークなし。AI と Docker Scout をスキップ |
skip_ai_scoring | --skip-ai-scoring | 非推奨かつ無視されます。スコアリングは常に決定的です |
no_redact | --no-redact | AI 呼び出しの前にシークレットをマスクしない |
no_cache | --no-cache | スキャンキャッシュをバイパス |
ignore_file | --ignore-file | ウェイバーファイルのパス |
baseline | --baseline | ベースラインファイルのパス |
rules.disabled | - | 完全に無効化するルール ID |
無効な設定ファイル(不明なキー、不正な重大度)は警告ではなく、2 で終了するハードエラーです。そのため、壊れたポリシーファイルによって、チームがコミットしていないルールの下でスキャンが実行されることは決してありません。
エディタのオートコンプリート
先頭行の # yaml-language-server: コメントにより、VS Code および JetBrains エディタで補完とインライン検証が有効になります。スキーマは docs/docksec-config-schema.json で公開されており、docksec --print-config-schema で再生成できます。
ルールの無効化
rules.disabled はチェックを完全に、どこでも無効化します。スコアリング、レポート、--json、および --fail-on ゲートの前に削除されます。環境に適用されないチェックに使用してください。チームがトリアージして受け入れた個別の検出事項については、ウェイバーファイルを推奨します。そのエントリには理由と有効期限が含まれるため、監査可能な状態が保たれます。
CI/CD 統合
終了コード
DockSec は CI フレンドリーな終了コードを使用するため、ビルドやシェルが結果に反応できます:
| コード | 意味 |
|---|---|
0 | 成功。--fail-on 以上の検出事項なし |
1 | --fail-on しきい値以上の検出事項あり |
2 | 使用法または引数のエラー |
3 | ツールまたはランタイムエラー(スキャン失敗、イメージが見つからない、ツールの欠如) |
--fail-on はすべての構造化された検出事項をゲートします: イメージの脆弱性、Dockerfile の設定ミス、compose の設定ミス。--fail-on が要求された --severity より低い場合、スキャンの重大度は自動的に広げられ、ゲートがそれらの検出事項を観察できるようになります。
不完全なスキャン
スキャナーが実行できない場合、結果は真にクリーンではなく、検出事項が欠落している可能性があります。DockSec はこれを Coverage ブロックおよび --json の scan_info.completeness の下で検出ギャップとして報告します。その場合に 3 で終了するには --incomplete-policy fail を使用してください。これにより、CI が完了しなかったスキャンでパスすることはできません:```bash
docksec Dockerfile --incomplete-policy fail
### 優先度: 最初に修正すべきもの
すべての CVE 検出結果は [EPSS](https://www.first.org/epss/) に対してスコアリングされます。これは、今後 30 日以内に悪用される確率を推定するものです。これを深刻度と組み合わせることで、4 つの階層が得られます:
| 階層 | 意味 |
|---|---|
| **Fix Now** | 重大または高深刻度で、かつ悪用される可能性が高い CVE の上位 10% に入るもの |
| **Fix Soon** | 重大または高深刻度だが、悪用はあまり一般的でないもの |
| **Monitor** | 深刻度は低いが、活発に悪用されているもの |
| **Low Priority** | 深刻度が低く、悪用も一般的でないもの |
これは DockSec が AI パス以外で行う唯一のネットワーク呼び出しであり、意図的に範囲を狭めています: **送信されるのは CVE ID のみ** で、イメージ名、ファイル内容、パスは送信されません。スコアは 24 時間キャッシュされます。`--offline` と `--no-epss` で無効化でき、失敗した場合はスキャンを失敗させるのではなく、深刻度のみのランキングにフォールバックします。
### エクスプロイトチェーン
サービスごとのビューでは、検出結果を 1 つずつ報告します。DockSec はまた、別々の検出結果がどのように組み合わさって単一の攻撃パスになるかも報告します:```text
Exploit chains
[HIGH] 'web' is internet-facing and can reach 'db' with a committed credential
services: web, db
combines: compose-plaintext-secret-env, compose-no-network-segmentation
'web' accepts connections from outside the host and shares the default
network with 'db'. 'db' is not exposed directly, but its credential is in
the compose file, so compromising 'web' yields authenticated access to it.
Neither service looks critical on its own.
break it: Put 'db' on its own network that 'web' does not join, or move
POSTGRES_PASSWORD to a Docker secret.
チェーン検出はルールベースであるため、--scan-only やオフライン、API キーなしでも動作し、実行するたびに同じ結果を返します。AI パスはそれをランク付けし拡張するものであり、必須ではありません。チェーンは --json の exploit_chains にも表示されます。
完全なリストについては exploit chains guide を、それらが組み合わせるすべてのルールについては compose rule reference を参照してください。
修正コマンド
スキャンは識別子のリストではなく、具体的なコマンドで終わり、それらが解決する検出件数を平文で示します:```text Fix commands
apt-get install --only-upgrade -y libgnutls30=3.7.9-2+deb12u7 CRITICAL - 3.7.9-2+deb12u4 -> 3.7.9-2+deb12u7 (CVE-2026-33845 +6)
Dockerfile changes
- [CRITICAL] Move the secret out of ENV; inject it at runtime (line 4)
- [HIGH] Add a non-root USER before CMD/ENTRYPOINT (line 7)
Applying all of the above resolves 37 of 93 finding(s); 56 have no mechanical fix yet.
### 機械可読出力
`--json` は、人間が読みやすいサマリーの代わりに、単一の JSON オブジェクト(スキャン情報、脆弱性、重大度カウント、および AI による検出結果)を stdout に出力するため、そのまま他のツールにパイプで渡すことができます:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
--json のみを指定した場合、レポートファイルは書き出されません。同じ実行でファイルを書き出しつつ JSON を出力するには、--format と組み合わせてください。--json モードでは、人間が読めるすべてのメッセージが stderr に移動するため、stdout には JSON ペイロードのみが含まれます。
レポート形式
--format はファイル出力のカンマ区切りリストを受け付けます:
| 形式 | 得られるもの |
|---|---|
json | スキャンメタデータ、重大度カウント、および完全な脆弱性リストを含む .json ファイル (--json の stdout ペイロードと同じ形状ですが、ディスクに書き出されます)。 |
csv | 検出結果の .csv テーブル (ID、重大度、パッケージ、バージョン、タイトル、および関連フィールド)。 |
pdf | スキャン情報、スコア、脆弱性の詳細を含む印刷可能な PDF サマリー。 |
html | ブラウザで結果を閲覧するためのスタイル付き HTML レポート。 |
markdown | プルリクエストのコメントや CI ジョブのサマリーでネイティブにレンダリングされる .md レポート。オプトイン: 要求しない限り書き出されません。 |
json、csv、pdf、html はデフォルトで書き出されます。markdown を取得するには明示的に追加してください。
検出結果がゼロの場合の CSV: スキャンで脆弱性が報告されなくても、--format リストに csv が含まれていれば、DockSec は列ヘッダーのみを含む CSV ファイルを書き出します。これは意図的な動作です (エクスポートは有効であり、書き込み失敗ではありません)。これにより、クリーンなスキャンでも下流のツールが安定したスキーマに依存できます。
stdout への JSON 出力や他のツールへのパイプについては、上記の Machine-readable output を参照してください。CI および GitHub Code Scanning には --sarif を使用してください (次のセクションを参照)。SARIF は --format とは別であり、要求された場合は常に出力されます。
GitHub Code Scanning 用の SARIF 出力
--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 を付けて再実行してください。
検出結果の無視(waiver)
--ignore-file FILE は、チームがトリアージして受け入れ済みの個別の検出結果を抑制します。ベースライン(ある時点のスナップショット)とは異なり、ignore ファイルは明示的でレビュー可能なリストであり、各エントリには理由と任意の有効期限が付きます。
カレントディレクトリに .docksec-ignore.yml ファイルが存在する場合、自動的に読み込まれます。```yaml
.docksec-ignore.yml
ignores:
- id: CVE-2023-45853 # Trivy vulnerability ID or DockSec rule ID reason: "zlib CVE; code path not reachable, vendor fix pending" expires: 2026-12-31 # optional; entry stops applying after this date
- id: compose-missing-healthcheck reason: "healthchecks are handled by the orchestrator"
抑制された検出事項は、スコアリング、レポート、`--json` 出力、および `--fail-on` ゲートの前に削除されます。期限切れのエントリは自動的に適用されなくなり(警告付き)、理由のないエントリはフラグが立てられるため、waiver は監査可能な状態に保たれます。ファイルをバージョン管理にコミットして、抑制が他の変更と同様にレビューされるようにしてください。
---
## レポート
### レポート形式
デフォルトでは、すべてのスキャンで4つのレポートファイルが書き出されます。`--format` を使用してサブセットを選択できます:
- **html**: インタラクティブで視覚的にクリーンな Web レポート:重大度カード、スコア評価、修正バージョンを含む完全な脆弱性テーブル、および完全な AI 検出事項。
- **pdf**: ポータブルでプレゼンテーションに適したドキュメント。
- **json**: 完全な機械可読スキャンデータ(`--json` 標準出力と同じ形式)。
- **csv**: 個々の脆弱性を表形式でまとめたスプレッドシート対応のテーブル。
- **markdown**: 軽量で読みやすいレポート(重大度サマリー + 修正バージョンを含む脆弱性テーブル)で、プルリクエストのコメントや CI ジョブサマリーでネイティブにレンダリングされます。オプトイン:`--format` に `markdown` を追加してください。デフォルトでは書き出されません。
> 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 は、何があなたのマシンから出ていくのかを常に把握できるように設計されています:
- スキャンは完全にローカルです。 Trivy、Hadolint、およびセキュリティスコアはあなたの マシン上で実行されます。イメージの内容が DockSec によってどこかへアップロードされることはありません。
- AI 分析はスキャンされたファイルのみを送信します。 AI パスが実行されると、Dockerfile または compose ファイルの内容(およびスコアリング用の脆弱性件数の短いサマリー)が、 設定した LLM プロバイダーに送信されます。それ以外は何も送信されません。
- シークレットは送信前にマスクされます。 ファイル内のシークレットらしき値(パスワード、
トークン、API キー、秘密鍵ブロック)は、コンテンツが AI プロバイダーに送信される前に
マスクされます。キー名は表示されたままなので、露出した認証情報は引き続き検出されます。
オプトアウトするには
--no-redactを使用してください。 - 完全ローカル AI をサポートしています。
--provider ollamaを使用して AI 分析を 自分のハードウェア上に留めるか、--scan-only/--offlineで AI を完全にスキップできます。 - テレメトリーなし。 DockSec は使用データを収集せず、どこにも通信しません。
オフラインモード
--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`)を使用してください。
### ローカルに存在しないイメージのプル
ローカルに存在しないイメージをスキャンする場合、まずそのイメージをプルします。compose スタックは、そのマシンが一度もプルしたことのないイメージを日常的に指定しており、これがないとそれらのサービスはすべて未スキャンとして報告されます。
これを無効にして代わりに失敗させるには `DOCKSEC_PULL_MISSING_IMAGES=false` を設定してください。従量制課金の接続や共有ランナーではこれを行う価値があります。`--offline` はこの設定に関係なく、決してプルを行いません。
---
## AI アシスタント向けスキル (`install-skill`)
`docksec install-skill` は、一般的な AI コーディングアシスタント向けのよく知られたコンテキストファイルに DockSec の使用手順を書き込むため、リポジトリで作業するアシスタントが 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 セクションが重複せずにその場で更新されます。
機能
- スマート分析: AI が脆弱性があなたの特定のセットアップにとって何を意味するかを説明します。
- マルチ LLM サポート: OpenAI、Anthropic Claude、Google Gemini、または Ollama 経由のローカルモデル。
- プライバシー優先: シークレット値はコンテンツが AI プロバイダーに到達する前に秘匿化され、スキャンは完全にローカルで、テレメトリはありません。
- Docker Compose スキャン: オーケストレーションレベルの設定ミスを検出し、compose ファイル内のすべてのサービスをスキャンします。
- ディープ統合: Trivy (脆弱性)、Hadolint (リンティング)、Docker Scout を組み合わせます。
- セキュリティスコアリング: 0〜100 のスコアと評価により、セキュリティ体制を経時的に追跡できます。
- 豊富なフォーマット: HTML (インタラクティブ)、PDF、JSON、CSV、SARIF、CycloneDX SBOM。
- CI/CD 対応:
--fail-on終了コード、ベースライン/ラチェットモード、監査可能なウェイバー、JSON の標準出力、Marketplace の GitHub Action。 - オフラインモード: ローカルの Trivy データベースを使用して完全にエアギャップ環境でスキャン (
--offline)。 - AI アシスタントスキル:
docksec install-skillは Claude Code、Cursor、Copilot などに、あなたのリポジトリで DockSec を実行する方法を教えます。
DockSec の比較
| 機能 | DockSec | Trivy (単体) | Snyk Container | Aikido |
|---|---|---|---|---|
| ライセンスとコスト | 無料、オープンソース (MIT) | 無料、オープンソース (Apache 2.0) | 商用 (限定的な無料枠) | 商用 (限定的な無料枠) |
| ガバナンス | OWASP Lab Project、ベンダーニュートラル | オープンソース、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 は、修正ガイダンスとデータの完全な制御の両方を必要とする開発者や、規制対象またはエアギャップ環境のチームのために、無償でそのギャップを埋めます。
修正を自動的に適用する
--fix は、提案された Dockerfile 変更のうち機械的なサブセットを適用し、
再スキャンして差分を報告します。```bash
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix # apply, keeping a .bak
## 検出
- **`--detect`** を指定して実行すると、検出のみが実行されます。
- 検出結果は `detections.json` に保存されます。
- 検出された各シークレットには、以下が含まれます:
- 検出されたシークレットの種類
- ファイルパスと行番号
- マスクされたシークレット値
- 検出に使用された検出器
- 検出の信頼度
## 検証
- **`--verify`** を指定して実行すると、検出と検証の両方が実行されます。
- 検証結果は `verified.json` に保存されます。
- 検証された各シークレットには、以下が含まれます:
- 検証済みのシークレット値
- 検証に使用された検証器
- 検証ステータス
- 検証の詳細
## 出力ファイル
- **`detections.json`** — 検出されたすべてのシークレット
- **`verified.json`** — 検証されたシークレット
- **`scan.log`** — スキャンログ
## 設定
- **`--config`** を使用して、カスタム設定ファイルを指定します。
- 設定ファイルは YAML 形式である必要があります。
- 設定オプションには、以下が含まれます:
- 除外するパス
- 除外する検出器
- カスタム検出器
- カスタム検証器
## 例
```bash
# リポジトリを検出のみでスキャン
kingfisher scan --detect --repo https://github.com/example/repo.git
# リポジトリを検証付きでスキャン
kingfisher scan --verify --repo https://github.com/example/repo.git
# ローカルディレクトリを検出のみでスキャン
kingfisher scan --detect --path /path/to/directory
# ローカルディレクトリを検証付きでスキャン
kingfisher scan --verify --path /path/to/directory
# カスタム設定でスキャン
kingfisher scan --config /path/to/config.yaml --repo https://github.com/example/repo.git
検出器
aws— AWS アクセスキーgithub— GitHub トークンgitlab— GitLab トークンslack— Slack トークンstripe— Stripe API キーtwilio— Twilio API キーsendgrid— SendGrid API キーmailgun— Mailgun API キーgoogle— Google API キーfacebook— Facebook アクセストークンtwitter— Twitter アクセストークンheroku— Heroku API キーnpm— npm トークンpypi— PyPI トークンdocker— Docker 認証情報private_key— 秘密鍵jwt— JSON Web Tokenpassword— パスワードgeneric— 汎用シークレット
検証器
aws— AWS アクセスキーgithub— GitHub トークンgitlab— GitLab トークンslack— Slack トークンstripe— Stripe API キーtwilio— Twilio API キーsendgrid— SendGrid API キーmailgun— Mailgun API キーgoogle— Google API キーfacebook— Facebook アクセストークンtwitter— Twitter アクセストークンheroku— Heroku API キーnpm— npm トークンpypi— PyPI トークンdocker— Docker 認証情報private_key— 秘密鍵jwt— JSON Web Tokenpassword— パスワードgeneric— 汎用シークレット
ライセンス
kingfisherは MIT ライセンスの下でリリースされています。- 詳細については、LICENSE ファイルを参照してください。
コントリビューション
- コントリビューションは歓迎します!
- プルリクエストを送信する前に、CONTRIBUTING.md をお読みください。
謝辞
kingfisherは、以下のオープンソースプロジェクトの上に構築されています:- trufflehog
- gitleaks
- detect-secrets
- gitrob
- repo-supervisor
- shhgit
- secretfinder
- trufflehog3
- whispers
- yar
- gitleaks
- detect-secrets
- gitrob
- repo-supervisor
- shhgit
- secretfinder
- trufflehog3
- whispers
- yar```text Applied 4 change(s)
- added --no-install-recommends on line(s) 2 [DS029]
- converted ADD to COPY on line(s) 3 [DL3020]
- replaced 'USER root' with 'USER appuser' on line 5 [DS002]
- inserted a placeholder HEALTHCHECK before line 6 [DS026]
Original saved to Dockerfile.bak Dockerfile findings: 7 -> 2 (5 resolved)
これは意図的に保守的です。ベースイメージのバージョンを選択したり、シークレットを移動したり、URLを取得したりアーカイブを展開する `ADD` を変換したり、composeファイルを編集したりすることはありません。それらは代わりに「Needs review」の下で報告されます。また、`--force` が指定されない限り、未コミットの変更があるファイルの編集を拒否するため、gitは常に変更を元に戻せる状態にあります。
## ドキュメント
| ガイド | 内容 |
| --- | --- |
| [評価ガイド](https://github.com/owasp/docksec/blob/main/docs/evaluation-guide.md) | 15分間の評価。DockSecが*行わない*ことについても含む |
| [エクスプロイトチェーン](https://github.com/owasp/docksec/blob/main/docs/exploit-chains.md) | サービス間の攻撃パスとその限界 |
| [Composeルールリファレンス](https://github.com/owasp/docksec/blob/main/docs/rules/README.md) | 全17ルール: それぞれが検出する内容と、それを維持することが妥当な場合 |
| [CI統合](https://github.com/owasp/docksec/blob/main/docs/ci/README.md) | Jenkins、GitLab、Azure Pipelines、pre-commit |
| [例](https://github.com/owasp/docksec/blob/main/examples/README.md) | 10個のDockerfileとcomposeスタック、およびそれぞれの予想される検出結果 |
| [ケーススタディ](https://github.com/owasp/docksec/blob/main/docs/case-studies/README.md) | 公式イメージの実際のスキャンとその数値 |
## ロードマップ
DockSecが向かう先については [ROADMAP.md](https://github.com/owasp/docksec/blob/main/ROADMAP.md) を参照してください: ローカルDockerデーモンなしでのレジストリスキャン、リポジトリレベルのポリシー設定ファイル、Jenkins/GitLab/Azure DevOpsテンプレート、公式コンテナイメージ、KubernetesおよびHelmスキャンなど。優先順位に関するフィードバックと投票は、[issues](https://github.com/OWASP/DockSec/issues) および [OWASP Slack](https://owasp.slack.com/archives/C0APXGCUW7M) で歓迎します。
---
## コントリビューション
DockSecはコミュニティの貢献によって成り立っています。開発者、デザイナー、セキュリティ愛好家を問わず、参加する方法はたくさんあります:
- **コード貢献**: バグの修正や新機能の追加。
- **ドキュメント**: ガイドの改善やチュートリアルの作成。
- **Issue報告**: バグの特定と報告。
- **フィードバック**: 経験や提案の共有。
始めるには、[Contributing Guidelines](https://github.com/owasp/docksec/blob/main/CONTRIBUTING.md)、[Code of Conduct](https://github.com/owasp/docksec/blob/main/CODE_OF_CONDUCT.md)、[Sponsorship Guide](https://github.com/owasp/docksec/blob/main/SPONSORSHIP.md) をご覧ください。
---
## リーダーとコミュニティ
DockSecは、コンテナセキュリティをより身近にすることを使命とする専任チームによって率いられています:
- [Advait Patel](https://github.com/advaitpatel) - プロジェクトリード
- [Arkadii Yakovets](https://github.com/arkid15r) - プロジェクト共同リード
ここで見つけることができます:
- **OWASPプロジェクトページ**: [owasp.org/DockSec/](https://owasp.org/DockSec/)
- **OWASP Slack**: [#project-docksec](https://owasp.slack.com/archives/C0APXGCUW7M)
- **PyPI**: [pypi.org/project/docksec/](https://pypi.org/project/docksec/)
- **Issues**: [バグを報告](https://github.com/OWASP/DockSec/issues)
- **変更履歴**: [CHANGELOG.md](https://github.com/owasp/docksec/blob/main/CHANGELOG.md)
---
<div align="center">
<strong>DockSecが役に立ったなら、リポジトリにスターを付けて他の人が見つけられるようにしましょう。</strong><br>
<a href="https://github.com/advaitpatel">Advait Patel</a> とOWASPコミュニティによって構築されています。
</div>