Anchoreを使用してDockerイメージのセキュリティスキャンを行う方法
Anchore Engineは、Dockerイメージのセキュリティを評価するオープンソースのスキャンツールです。Anchoreレポートは、古いパッケージバージョンや依存関係に潜む脆弱性についての洞察を提供します。
Dockerイメージを構築して、スキャンする前にレジストリにプッシュする必要があります。Anchoreは、可能な場合にはDockerfileを使用して、設定上の問題を特定しますが、脆弱性リストをコンパイルする際には構築されたイメージのスキャンに依存しています。
Anchoreのアーキテクチャ
Anchoreのセットアップには、画像ビルド環境とは独立して動作するAnchore Engineの専用インストールが必要でした。別のCLIを使用して、Engineと対話しました。
このモデルは、イメージをAnchoreに登録し、スキャンを開始し、結果にアクセスするために一連のCLIコマンドを使用する必要があります。手順は、レジストリからイメージをプルし、レポートを生成し、それを利用可能にするためにAnchoreを進めます。
Anchoreは今、インラインスキャンも提供しています。これにより、イメージをスキャンするための単一のコマンドを使用し、その結果をターミナルに表示できます。この記事では、この機能に焦点を当てます。
インラインスクリプトの実行
インラインスキャンは、AnchoreのサーバーでホストされているBashスクリプトによって提供されます。スクリプトをあなたのマシンにダウンロードし、実行可能にしてください:
curl -s https://ci-tools.anchore.io/inline_scan-latest -o anchore.sh
chmod +x anchore.sh
これでインラインスクリプトを使用してコンテナイメージのスキャンを開始できます:
./anchore.sh -r alpine:latest最初のスキャンにはしばらく時間がかかることがあります。スクリプトはAnchore EngineのDockerイメージを取得し、新しいAnchoreインスタンスを起動し、PostgreSQLとDockerレジストリのインスタンスを設定します。その後、Anchore Engineの起動を待ちます。
エンジンが起動すると、ターゲットDockerイメージが引き出され、分析されます。その後、セキュリティレポートがターミナルに表示されます。スクリプトは環境をクリーンアップし、Anchore Engine Dockerコンテナを停止することで終了します。
スキャン結果
スキャン結果には、画像に関するメタデータと見つかった問題の表が含まれています。Anchoreは、構成されたポリシーに対して画像を分析します。デフォルトの設定では、ソフトウェアパッケージの既知の脆弱性や画像を構築するために使用されるDockerfileに関する潜在的な問題を探します。
全体のスキャン結果は、脆弱性テーブルの上にあるステータス行に表示されます。passと表示されている場合、Anchoreはあなたのイメージが安全であり、商用利用の準備が整っていることを示しています。failの場合は、エラーを確認し、可能な場合は修正する必要があります。
見つかった各脆弱性には、その深刻度が低から重大までの評価が含まれています。CVE IDが付与された問題には、MITREのウェブサイトで詳細を確認するためのリンクが含まれています。
レポートファイルの生成
デフォルトの出力テーブルは人間が使用するには適していますが、Anchoreはアーカイブしたり他のツールに流し込むことができるJSONレポートファイルも生成することができます。この機能を有効にするには、スキャンスクリプトを実行するときに-rフラグを追加してください。
Anchoreは、作業ディレクトリ内のanchore-reportsにレポートを書き込みます。各スキャンは、脆弱性、OSパッケージ、ポリシー要件など、レポートの異なるセクションに関する一連のJSONファイルを生成します。
ファイルを検査することで、各発見についての詳細な情報が得られ、ターミナル出力が提供する以上のデータが得られます。これは、CVSSスコア、正確なパッケージバージョン、そしてベンダーが修正が行われるかどうかの指示にまで及びます。
保存された画像アーカイブのスキャン
Anchoreは、保存されたDockerイメージアーカイブのディレクトリや、レジストリに存在する実際のイメージをスキャンすることができます。docker saveを使用してDockerイメージのセットをエクスポートし、それらをディレクトリに置いてから、-v引数を使用してAnchoreスクリプトがこれらのアーカイブをスキャンできるようにします。
docker save my-image:latest -o docker-images/my-image
./anchore -v docker-images
イメージのDockerfileを提供する
インラインスクリプトは、ローカルのDockerfileへのパスを指定できる-d引数を受け付けます。Anchoreは生成されたイメージとDockerfileをチェックし、イメージのセキュリティ状態に影響を与える可能性のあるビルド時の問題を特定できるようにします。
./anchore.sh my-image:latest -d /dockerfiles/my-imageカスタムポリシーの使用
Anchoreはカスタムポリシーセットを使用することで拡張可能です。ポリシーは「ゲート」、「トリガー」、および「アクション」の組み合わせから作成されます。これにより、コンテナイメージを正確なセキュリティ要件に対して監査するルールを構築できます。
各ポリシーのゲートは、3つのアクションの1つを生成します:"進む"、スキャンを進めるための通過、"警告"、実行を続けるが警告付き、そして"停止"、画像をさらに処理すべきではないことを示します。
ポリシーは「バンドル」としてパッケージ化され、適用されるルールのセットをレジストリやイメージにマッピングします。スクリプトを実行する際に -b フラグを渡すことで、スキャンにポリシーバンドルを追加できます:
./anchore.sh -b policy-bundle.jsonこれにはあなたのカスタムポリシーが含まれ、画像があなた自身のセキュリティ基準を満たしていることに自信を持てるようになります。
これは、上記の-dフラグを使用してAnchoreにDockerfileを提供しない場合に警告を出す単純なポリシーバンドルです。イメージを構築するために使用されるDockerfileを提供することで、Anchoreは最も広範なカバレッジを得るため、提供されない場合に警告するのが理にかなっています。
{
"action": "WARN",
"comment": "No Dockerfile given!",
"gate": "dockerfile",
"params": [],
"trigger": "no_dockerfile_provided"
}
このポリシーは、AnchoreがあなたのDockerfileがベストプラクティスの標準を満たしているかどうかをチェックするdockerfileゲートに適用されます。Anchoreは、画像のDockerfileが存在しない場合にスキャンが開始されると、no_dockerfile_providedトリガーを実行します。
結論
Anchoreは、古いソフトウェアパッケージ、既知の脆弱性、Dockerfileの設定問題、その他の潜在的な問題源をスキャンすることで、Dockerイメージのためのセキュリティレポートを生成できます。チェックされる内容をカスタマイズし、Anchoreをあなたのセキュリティ基準に合わせるために、自分自身のポリシーセットを書くことができます。
Anchoreはクライアント-サーバーアーキテクチャを使用していますが、プロジェクトの「インライン」スクリプトにより、インストールの複雑さが抽象化されているため、ローカルイメージを迅速にスキャンし、レポートを直接ターミナルに表示することができます。もしAnchoreを定期的に使用する予定がある場合や、CI/CDパイプラインでイメージをスキャンする予定がある場合は、専用のAnchore Engineインスタンスをデプロイする方がベストです。それからCLIを使用してレポートを生成します。これは各スキャンに対してマルチステージプロセスを必要としますが、レポートセクションにアクセスしたり、脆弱性データフィードを同期したりする際に、より柔軟性をもたらします。




