Dockle
https://github.com/goodwithtech/dockle/raw/master/imgs/logo.png
/icons/github.icon https://github.com/goodwithtech/dockle
Dockle とは?
Dockle - Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start
Dockle は Docker イメージのベストプラクティスを構築できる、セキュリティ向けの Linter。
Docker と同じく Go で構築されているので、ワンバイナリ を配置するだけで利用可能になっている。
機能一覧
公式の README に確認時点で記述されている機能が下記の通り。
コンテナの脆弱性検知
Dockerfile 構築の補助
簡単な使用方法 (イメージ名を渡すだけで利用できる )
CIS Benchmarks をサポートし高度な正確性を実現
DevSecOps 対応 ( CI との親和性を考慮した設計になっている)
code:bash
# 使用例
$ dockle node:latest
ベストプラクティス Linter としての Dockle
Docker では公式に Dockerfile のベストプラクティス が定められており以下のページで確認できる。
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Dockle は Dockerイメージ を解析する過程で、構築に利用された Dockerfile に記述されている内容がこのベストプラクティスに沿っているかチェックする。
ありがちな例を上げると「apt でパッケージをインストールしたあとに同じレイヤーで apt のキャッシュ を削除していない」など。これが見つかると Dockle の結果として指摘されるため、意図しないイメージサイズの肥大化を避けることができる。
Dockerfile もない生成済みの Docker イメージからどうやって Dockerfile を逆算しているのかと言うと、イメージを解析の際に docker history [IMAGE_NAME] で得られるコマンドの履歴とおおよそ同じ内容が記録されたテキストデータを生成し、Dockerfile ベストプラクティスとのパターンマッチを行って実現しているようであった。
セキュリティ Linter としての Dockle
Dockle は Dockerfile をテキスト的に解析するのではなく実際にあるイメージから検証しているため、利用しようとしている実際のイメージ中に存在する脆弱性のある設定を検知できるようになっている。
セキュリティの検査項目は、Dockle 独自のものに加えて、CIS Benchmark の Docker に関するチェック項目 に対応しているため、基本的なセキュリティの項目を高精度に抑えられるようになっているとのこと。
Dockle のチェック項目の一覧については下記でまとまっている。一部については Trivy を併用するように明記されている。
https://github.com/goodwithtech/dockle/blob/master/CHECKPOINT.md
Trivy との違い
Dockle はイメージ構築に関わるベストプラクティスとその過程において検証可能なセキュリティチェックを行うことにスポットを当てている。
一方で Trivy はイメージに含まれるOSやアプリケーションの依存関係に関わる脆弱性を検知する仕組みとして設計されている。
カバーする領域が異なるので、併用することで Docker イメージのセキュリティをより向上することが期待できる。
イメージ解析の仕組み
イメージの解析処理には、goodwithtech/deckoder というパッケージが利用されており、具体的には解析対象のイメージをイメージを構成するレイヤーごとに展開する仕組みが利用されている。(これは Dockle の作者が別のパッケージを fork して拡張したものになる)
deckoder はイメージを解析する際に、解析対象のイメージを生成する際に利用されたコマンドを /config という名前で参照できるようにする仕組みを用意している。
コンテナの履歴を保存する補助処理
展開された結果を利用して解析処理を開始する処理は下記。
イメージを解析する処理
コアになる箇所は下記の通り。Dockleで持っている評価軸を初期化している箇所を定義して、事前の展開処理によって得られたファイルを評価軸に従い検証している。
評価軸を設定する処理
例として user の評価においては、/etc/password 中に同じユーザーが定義されていないかをチェックしている。
その他にも CIS Benchmarks をベースにした検証項目があるので具体的には下記を参照してほしい。
/etc/passwordの設定をチェックする処理
その他のチェックを行う処理が格納されている階層
イメージを解析した後は、Docker の設定でエラーレベルの条件や意図的に無視する設定に該当するものを除外した後、ヒットしたものがあれば終了コードと出力で結果を通知するという仕組みになっている。
除外設定を適用する処理
CI と組み合わせての利用
CI 環境上でも Dockle のバイナリを取得して、検証する対象のイメージ名を指定するだけで簡単にCIに組み込むことができる。
Dockle でも CI での活用を推奨しているようで、メジャーどころの CI ツールとの統合方法が記載されているので興味があれば参考にしてほしい。
https://github.com/goodwithtech/dockle#continuous-integration-ci