
layerleak Docker Hub シークレットスキャナー
Layerleak は読み取り専用の OCI イメージシークレットスキャナーです。Docker デーモンを使用せずに公開イメージ参照を解決し、ダウンロードしたコンテンツを OCI ダイジェストと照合して検証し、レイヤーの状態を再構築し、削除されたアーティファクトとイメージメタデータを検査し、秘匿化された来歴情報に富む検出結果を返します。
Docker Hub、GHCR、Quay、GCR、MCR、Amazon ECR Public、およびその他の OCI 互換レジストリをサポートしています。結果は JSON として保存でき、同梱の API 用に PostgreSQL に永続化できます。
この開発ツリーは github.com/brumbelow/layerleak/v3 モジュールパス上の 3.0.0 系を文書化しています。以下に示すリリース候補のコマンドは、その正確なタグが公開された後にのみインストール可能になります。変更履歴と OpenAPI ドキュメント内の 3.0.0 というラベルは意図的に固定されており、承認されたリリース候補を同じソースコミットから昇格できるようにしています。
Layerleak は信頼できないイメージコンテンツをスキャンするため、そのデフォルト設定は意図的に制限され、フェイルクローズドになっています:
partial または failed として報告され、クリーンなスキャンとして報告されることはありません。Layerleak は、検出された資格情報が有効であるかどうかを検証しません。API には認可モデルがありません: デフォルトでオープンであり、オプトインの LAYERLEAK_API_BEARER_TOKENS 共有トークンチェックは /api/ パスに対する多層防御であり、アクセス制御ではありません。いずれにせよ、信頼できるネットワーク上または認証済みゲートウェイの背後でのみ公開してください。
Layerleak には Go 1.27.1 以降が必要です。```bash go install github.com/brumbelow/layerleak/v3@latest layerleak --version layerleak --help
`/v3` モジュールパスが正規のインストール対象です。インストールされるバイナリは
引き続き `layerleak` という名前です。再現性が重要な場合は、安定版またはリリース候補を明示的に固定してください:```bash
go install github.com/brumbelow/layerleak/[email protected]
go install github.com/brumbelow/layerleak/[email protected]
/v3 パス上の @latest は、公開されている最新の v3 リリースを選択します。安定版が存在すると、Go は @latest からプレリリースを除外するため、リリース候補のみが公開されている間は @latest は最新の候補に解決されます。/v3 を付けないルートパス github.com/brumbelow/layerleak は永久に v1.0.0 のままです。常に /v3 を含めてください。チェックアウトビルドは、ダーティワークツリーマーカーを含む VCS 由来の開発バージョン、または VCS 情報がない場合は dev を報告します。リリースインストールされたバイナリは、layerleak --version を通じて解決されたモジュールバージョンを報告します。
各リリースにはビルド済み CLI アーカイブも添付されているため、Go ツールチェーンは不要です。linux と darwin の amd64 および arm64 向けの layerleak_<version>_<os>_<arch>.tar.gz(layerleak、LICENSE、THIRD_PARTY_NOTICES.md を含む)と、layerleak_<version>_windows_amd64.zip(layerleak.exe)があります。各リリースには、リリースワークフローによってキーレス署名された layerleak_<version>_checksums.txt(layerleak_<version>_checksums.txt.sigstore.json)と、すべてのアーカイブに対するビルド来歴の証明が含まれています。実行する前に検証してください:```bash
version=v3.0.0
archive="layerleak_${version}linux_amd64.tar.gz"
checksums="layerleak${version}_checksums.txt"
base="https://github.com/brumbelow/layerleak/releases/download/${version}"
curl --fail --location --proto '=https' --tlsv1.2 --remote-name-all
"${base}/${archive}" "${base}/${checksums}" "${base}/${checksums}.sigstore.json"
sha256sum --check --ignore-missing "${checksums}"
cosign verify-blob
--bundle "${checksums}.sigstore.json"
--certificate-identity 'https://github.com/Brumbelow/layerleak/.github/workflows/container-release.yml@refs/heads/main'
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com'
"${checksums}"
gh attestation verify "${archive}" --repo Brumbelow/layerleak
--signer-workflow Brumbelow/layerleak/.github/workflows/container-release.yml
--source-ref refs/heads/main --deny-self-hosted-runners
tar -xzf "${archive}" layerleak ./layerleak version
署名は、チェックサムファイルが `main` 上のこのリポジトリのリリースワークフローから来たことを証明し、チェックサムはアーカイブをそのファイルに結び付け、attestation はアーカイブをそれをビルドしたワークフロー実行に独立して結び付けます。リリース上の `release-manifest.json` には、すべてのアーカイブとその中にあるバイナリのダイジェストが一覧されています。安定版リリースは、受け入れられたリリース候補のコミットを安定版バージョン文字列で再ビルドし、その再ビルドが候補のバイナリをバイト単位で再現しない限り公開を拒否するため、`layerleak version` はダウンロードしたタグを正確に報告します。
### GitHub Action
リポジトリルートはコンポジットアクションであり、ランナー用のアーカイブをダウンロードし、上記のように検証し(チェックサム、`scripts/release-tools.sh` で固定された cosign リリースによるチェックサムファイルの cosign バンドル、およびアーカイブの attestation)、`layerleak scan` を実行します。リリースタグに固定してください。対応するアーカイブはそのリリースからダウンロードされます:```yaml
name: Image secrets
on: { push: { branches: [main] } }
permissions: { contents: read, security-events: write }
jobs:
layerleak:
runs-on: ubuntu-24.04
steps:
- id: scan
uses: brumbelow/[email protected]
with: { image: "ghcr.io/${{ github.repository }}:${{ github.sha }}", fail-on: none }
- uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
if: ${{ always() && steps.scan.outputs.sarif-file != '' }}
with: { sarif_file: "${{ steps.scan.outputs.sarif-file }}" }
| 入力 | デフォルト | 意味 |
|---|---|---|
image | 必須 | スキャンするイメージ参照。プライベートレジストリはステップの env で LAYERLEAK_REGISTRY_USERNAME/LAYERLEAK_REGISTRY_PASSWORD を使用します。 |
version | uses: のタグ | アーカイブがダウンロードされるリリース。uses: がブランチまたはコミットを指定している場合にのみ設定します。 |
format | sarif | summary、json、または sarif。 |
fail-on | low | --fail-on に渡されます。none はステップを失敗させずにレポートします。 |
allow-partial | false | --allow-partial を渡します。 |
platform | すべての linux マニフェスト | --platform に渡されます。 |
output-file | $RUNNER_TEMP/layerleak/results.<ext> | フォーマットされた結果の書き込み先。 |
extra-args | 空 | 追加の layerleak scan フラグ。空白で分割され、最後に追加されます(例: --all-tags --max-repository-tags 50)。 |
出力: exit-code(CLI の終了コード。「イメージのスキャン」の表を参照)、
result-file(書き込まれたファイル)、sarif-file(format が
sarif の場合は同じパス、それ以外は空)、および version(ダウンロード
され検証されたリリース)。このステップは CLI が非ゼロで終了したときに
正確に失敗するため、fail-on: none とアップロードステップの if: always() を
組み合わせるとレポート専用のスキャンになります。このアクションは検出結果を
決して出力しません。ログにエコーされるのは編集済みの summary 形式のみで、
スキャンは --no-artifacts 付きで実行されます。
必要なものは curl、tar(Windows では unzip/7z)、および GitHub CLI で、
これらはすべて GitHub ホストの Linux、macOS、Windows ランナーに存在します。
ソースからビルド:```bash git clone https://github.com/brumbelow/layerleak.git cd layerleak go build -o layerleak . ./layerleak --help
サポートされている配布パスは、CLI 用の上記 `/v3` モジュールパスと、API および同梱の migration、purge、healthcheck コマンド用の `ghcr.io/brumbelow/layerleak:<published-version>` です。`cmd/*` パッケージは開発用のソースビルドターゲットであり、個別にバージョン管理されたインストールパスではありません。PostgreSQL ベースの API バージョンを起動する前に、対応する `layerleak-migrate-up` バイナリまたはコンテナエントリポイントを実行し、マイグレーションの成功を待ってください。インストールされたスキーマが期待するバージョンと正確に一致しない限り API は起動を拒否し、起動後は `/readyz` がすべてのプローブでデータベースとスキーマを再チェックするため、その後の劣化が報告されます。
## プラットフォームサポート
| コンポーネント | プラットフォーム | 検証方法 |
| --- | --- | --- |
| `layerleak` CLI | `go install` による amd64 および arm64 上の Linux、macOS、Windows | テストは CI の linux/amd64 で実行されます。darwin/arm64、darwin/amd64、windows/amd64、linux/arm64 はすべての変更でコンパイルおよび vet されます。 |
| API イメージ | `linux/amd64`、`linux/arm64` | リリースワークフローによって両プラットフォーム向けにビルド、スモークテスト、スキャン、署名されます。 |
Windows では、動的プログレス表示がコンソールを仮想端末モードに切り替えます。拒否するコンソール(Windows 10 1511 より古いもの)はプレーンなプログレス行にフォールバックし、`--progress plain` も同様です。bash、zsh、fish、PowerShell のシェル補完は `layerleak completion <shell>` から提供されます。
CLI は HTTPS 経由で直接、または `HTTPS_PROXY` を介してレジストリに到達します([Configuration](#configuration) を参照)。API はプレーン HTTP でリッスンし、デプロイメントが TLS を終端し、クライアントを認証し、レート制限を行うことを想定しています。[SECURITY.md](https://github.com/brumbelow/layerleak/blob/main/SECURITY.md#security-boundaries) を参照してください。
## イメージのスキャン