Dockle で Docker イメージのセキュリティやベストプラクティスをチェックする

Today I Learned

Dockle は、Docker コンテナイメージのセキュリティチェックや、Docker ファイルのベストプラクティスをチェックできるツールである。
以前調べた hadolintTrivy をあわせたような機能をもっている。

goodwithtech/dockle

Dockle をインストールする

Mac であれば homebrew を使ってインストールできる。

$ brew install goodwithtech/r/dockle

Dockle を実行する

Dockle は次のコマンドで実行できる。

$ dockle IMAGE_NAME

Docker daemon を起動する必要はないが、Dockerfile のベストプラクティスをチェックしたい場合には、イメージを作っておく必要がある。
たとえば次の内容の Docker ファイルを Dockle でチェックするとする。

Dockerfile
FROM node:latest

その場合は、docker build で作ったイメージに対してチェックする。

$ docker build ./ -t dockle-example
$ dockle dockle-example

WARN  - CIS-DI-0001: Create a user for the container
  * Last user should not be root
WARN  - DKL-DI-0006: Avoid latest tag
  * Avoid 'latest' tag
INFO  - CIS-DI-0005: Enable Content trust for Docker
  * export DOCKER_CONTENT_TRUST=1 before docker pull/build
INFO  - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
  * not found HEALTHCHECK statement
INFO  - CIS-DI-0008: Confirm safety of setuid/setgid files
  * setuid file: urwxr-xr-x bin/su
  * setgid file: grwxr-xr-x sbin/unix_chkpwd
  * setuid file: urwxr-xr-x usr/bin/passwd
  * setgid file: grwxr-xr-x usr/bin/expiry
  * setuid file: urwxr-xr-x bin/mount
  * setgid file: grwxr-xr-x usr/bin/chage
  * setgid file: grwxr-xr-x usr/bin/ssh-agent
  * setuid file: urwxr-xr-x usr/bin/chfn
  * setuid file: urwxr-xr-x usr/bin/gpasswd
  * setuid file: urwxr-xr-x bin/umount
  * setuid file: urwxr-xr-x usr/bin/chsh
  * setuid file: urwxr-xr-x usr/bin/newgrp
  * setgid file: grwxr-xr-x usr/bin/wall
  * setuid file: urwxr-xr-x usr/lib/openssh/ssh-keysign
INFO  - DKL-LI-0003: Only put necessary files
  * Suspicious directory : root/.npm

Dockle のチェック項目と、hadolint や Trivy との違い

チェック項目の詳細は、Checkpoint で確認できる。
たとえば CIS-DI-0001 は、コンテナ用のユーザーを作るべしというルールである。
この項目は hadolint ではチェックできないが、Dockle ではチェックできる。

Dockle でチェックできるルールは、次のプラクティスに基づいている。

hadolint では、Docker Best Practice に沿っているかをチェックする。
そのため、hadolint でチェックできる内容は、Dockle でもチェックできる。
一方で、Trivy と Dockle は、チェックできる脆弱性の対象が異なる。
Trivy では CVE などの脆弱性データベースに基づいているのに対し、Dockle は、CIS ベンチマークに基づいている。

GitHub Actions で Dockle を実行する

Dockle を GitHub Actions で動かすためのアクションはいくつか公開されているが、hadolint や Trivy と違って、開発元が公開した Actions はなかった。
この記事では、一番スター数の多い erzz/dockle-actionを使うことにする。
README のサンプルに沿って、リポジトリ内の Dockerfile をチェックするワークフローファイルを追加する。

dockle.yml
name: dockle

on:
  pull_request:
    paths:
      - "Dockefile"

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/[email protected]
      - name: Build an image from Dockerfile
        run: |
          docker build ./ -t my-image
      - name: Run Dockle
        uses: erzz/dockle-[email protected]
        with:
          image: my-image

ワークフローを実行すると、項目に違反する内容を検出できた。

スクリーンショット:GitHub Actions での Dockle の実行結果