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/checkout@v3
      - name: Build an image from Dockerfile
        run: |
          docker build ./ -t my-image
      - name: Run Dockle
        uses: erzz/dockle-action@v1
        with:
          image: my-image

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

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