今回は、dockleについてインストールして実際に使ってみたいと思います。
使ってるのはCentOS 7 なので、インストール方法はこちら。
VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && rpm -ivh https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.rpm
公式(https://github.com/goodwithtech/dockle#installation)にこれだけしか書いてないんですが、これで動くのだろうか・・・
あ、いや、動くんだとは思いますよ、OSにあったバージョンのrpmを持ってきてインストールする内容だと思いますし。
むかしは、何もわからず「こうやったら動くって書いてあるからこうやればいい」と思ってやっていましたが、いまは「こういうことをするんだろうなこのコマンドで」とある程度はわかるようになってきたので、長い年月続ける意味ってあるんだなぁって・・・
では、やっていきましょう
実行すると以下のような出力が出てインストールが実行されます。
https://github.com/goodwithtech/dockle/releases/download/v0.4.5/dockle_0.4.5_Linux-64bit.rpm を取得中
準備しています... ################################# [100%]
更新中 / インストール中...
1:dockle-0:0.4.5-1 ################################# [100%]
動くものですね、結構マニュアルとかで「こうやったら動くよ」って書いてあってもそのままやったら動かないことも多く経験してきたものでいまだに動くと驚いちゃうんですよねぇ。
たいてい、「いや~、この製品使うならこういうことはやっておくのが常識でしょう???」みたいな、前提条件が省かれて手順が書かれてるようなことが多くて、この手順を成功させるために前もって必要なものがあったりしないかな?
という事を考えたり調べたりしちゃう書いてあることが信用できない悲しいSEなのです。
インストールできたので脆弱性のチェックをやっていきます。
2022-07-22T17:09:32.027+0900 INFO Failed to check latest version. not found version patterns
WARN - CIS-DI-0001: Create a user for the container
* Last user should not be root
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 usr/sbin/pam_timestamp_check
* setuid file: urwxr-xr-x usr/bin/newgrp
* setuid file: urwxr-xr-x usr/sbin/unix_chkpwd
* setuid file: urwxr-xr-x usr/bin/passwd
* setuid file: urwxr-x--- usr/libexec/dbus-1/dbus-daemon-launch-helper
* setuid file: urwx--x--x usr/bin/chfn
* setgid file: grwxr-xr-x usr/bin/write
* setuid file: urwxr-xr-x usr/bin/su
* setuid file: urwxr-xr-x usr/bin/gpasswd
* setuid file: urwx--x--x usr/bin/chsh
* setuid file: urwxr-xr-x usr/bin/mount
* setuid file: urwxr-xr-x usr/bin/umount
* setuid file: urwxr-xr-x usr/bin/chage
* setgid file: grwx--x--x usr/libexec/utempter/utempter
INFO - DKL-LI-0003: Only put necessary files
* Suspicious directory : tmp
このチェックでの判定は5段階のようです
『Level』
https://github.com/goodwithtech/dockle#level
いろいろ出てきましたが、trivyの時ほどいっぱい怒られませんでしたね。
どういうところで引っかかったのかは以下で確認できます。
『Checkpoint Summary』
https://github.com/goodwithtech/dockle#checkpoint-summary
どうやって改善したらいいのかも見ることができます。
これを参考に対処してねという事なのでしょう。
『Checkpoint Details』
https://github.com/goodwithtech/dockle/blob/master/CHECKPOINT.md
ちょうど「WARN CIS-DI-0001」の出力がありましたので、そちらの対処を行ってみたいと思います。
今回は、イメージを作成する設計書のDockerfileと、Dockerfileの内容を読み込んでイメージを作成する docker build コマンドを使用し、修正を組み込んだイメージcentos:dockle の作成をします。
Dockerfile の中身は以下の様になります。
====
# STEP1 CentOS 7 のイメージをベースにする
FROM centos:centos7
# STEP2 CIS-DI-0001の対処
RUN useradd -d /home/dockle -m -s /bin/bash dockle
USER dockle
====
ではイメージを作成してみます。
# docker build -t centos:dockle dockle/
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos:centos7
---> eeb6ee3f44bd
Step 2/3 : RUN useradd -d /home/dockle -m -s /bin/bash dockle
---> Running in 48139360d8c8
Removing intermediate container 48139360d8c8
---> 4cf2480c9454
Step 3/3 : USER dockle
---> Running in 950fa59666e5
Removing intermediate container 950fa59666e5
---> d5cb3dc4dd14
Successfully built d5cb3dc4dd14
Successfully tagged centos:dockle
出来上がったイメージがちゃんと存在するか確認します。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos dockle d5cb3dc4dd14 16 seconds ago 204MB
では、修正を盛り込んだイメージのチェックをしてみます。
# dockle centos:dockle
2022-07-25T10:18:17.309+0900 INFO Failed to check latest version. not found version patterns
2022-07-25T10:18:19.255+0900 FATAL unable to initialize a image struct: failed to initialize source: reading manifest dockle in docker.io/library/centos: manifest unknown: manifest unknown
エラーとなってしまいました。
メッセージを検索等してみたところ、どうやらローカルにあるイメージをスキャンしたいんだけど実際はリモート(docker hubかな?)にスキャン対象イメージを探しに行ってしまっているということみたいです。
その対処は以下にありました。
『Use Docker』
https://github.com/goodwithtech/dockle#use-docker
dockleのコンテナを起動してスキャンしてもらって、結果が出たらdockleのコンテナは削除するという使い方のようですね。
ここに「You only need -v /var/run/docker.sock:/var/run/docker.sock when you'd like to scan the image on your host machine.」と記載があり、ローカルにあるイメージををスキャンするときはこうする必要があるみたいです。
では、コマンドを今回の環境に合わせて、バージョンとイメージを指定したいと思います。
バージョンの確認
# dockle -v
dockle version 0.4.5
コマンドはこうなりました。
# docker run \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd)/.dockleignore:/.dockleignore \
goodwithtech/dockle:v0.4.5 \
centos:dockle
実行してみたいと思います。
Unable to find image 'goodwithtech/dockle:v0.4.5' locally
v0.4.5: Pulling from goodwithtech/dockle
97518928ae5f: Pull complete
fc586ee9e6b2: Pull complete
Digest: sha256:ebd36f6c92ac850408c7cbbf1eddf97e53565da9d661c5fb8ec184ad82a5358d
Status: Downloaded newer image for goodwithtech/dockle:v0.4.5
2022-07-25T01:41:20.053Z INFO Failed to check latest version. not found version patterns
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 usr/bin/chage
* setuid file: urwxr-xr-x usr/bin/passwd
* setuid file: urwxr-xr-x usr/bin/su
* setuid file: urwxr-xr-x usr/sbin/unix_chkpwd
* setuid file: urwxr-xr-x usr/bin/umount
* setuid file: urwx--x--x usr/bin/chfn
* setuid file: urwxr-xr-x usr/bin/gpasswd
* setuid file: urwxr-xr-x usr/sbin/pam_timestamp_check
* setuid file: urwx--x--x usr/bin/chsh
* setuid file: urwxr-xr-x usr/bin/newgrp
* setgid file: grwxr-xr-x usr/bin/write
* setuid file: urwxr-x--- usr/libexec/dbus-1/dbus-daemon-launch-helper
* setgid file: grwx--x--x usr/libexec/utempter/utempter
* setuid file: urwxr-xr-x usr/bin/mount
INFO - DKL-LI-0003: Only put necessary files
* Suspicious directory : tmp
修正を盛り込んだことで「WARN CIS-DI-0001」の出力がなくなりました。
trivyとdockleを組み合わせて、より強固で安全なイメージの作成ができそうですね。
次回は、せっかく作ったイメージを置いておくコンテナレジストリを自分で作って使ってみるという事をやりたいと思います。