Dockerといえば、Kubernetes 1.24リリースにあたり、DockerとKubernetesの橋渡しをしていたdockershimのサポートがKubernetesから無くなったことに伴い、従来のやり方でKubernetesでDockerランタイムが利用できなくなったことが記憶に新しいですが、コンテナイメージを作るのにDockerはまだまだ使われると思いますし、Kubernetesまで必要ないレベルの利用にDockerやDocker Composeは開発の現場でも使われると思います。
最近はDocker Desktopへの開発のためのツールや機能追加が盛んですから、まだまだDockerは使われるでしょう。 そのため、Docker を便利かつ安全に使い続けるべく、ツールを使ったセキュリティチェックが必要になってきます。
今回はAqua securityのdocker-benchを使ってみたいと思います。
このツールはCIS Docker Benchmarkの仕様を基としたベンチマークを実行できるツールで、 簡単にいえば、セキュアなDocker環境を目指すための推奨事項をチェックしてくれるツールになっています。
仕様は以下に従っており、このツールがサポートする仕様のバージョンは1.0から最新の1.3.1までのバージョンになっています。
docker-benchツールのダウンロード
以下からダウンロードします。 ダウンロードしたパッケージ、パッケージをサーバーに転送しておきます。
今回はUbuntuにインストールするので、debパッケージの方をダウンロードしておきます(ToDo: wgetを使ってGitHubのAssetのファイルをダウンロードする方法がわかればそっちに変更)。
以下、Ubuntu 22.04 LTSにDockerとDocker-benchを入れる例。
- Ubuntu 22.04 LTS(以下Ubuntu)をインストール
- Ubuntuをアップデート
- UbuntuにDockerを公式手順に従ってインストール
- Ubuntuに
docker-bench
パッケージをインストール
sudo apt install ./docker-bench_0.5.0_linux_amd64.deb
ローカルのdebパッケージをインストールすると、aptコマンドを実行したときに、以降傾向が表示される場合があります。 ご注意ください。
docker-benchツールを実行する
rootユーザーとして以下のコマンドを実行します。
sudo -i
configファイルを入手するため、ソースをクローンします。
# git clone https://github.com/aquasecurity/docker-bench.git
Change Directoryして、早速実行してみます。
# cd docker-bench/ # docker-bench --benchmark cis-1.3.1 [INFO] 20.04 CIS Docker Community Edition Benchmark [INFO] 1 Host Configuration [INFO] .1 Linux Hosts Specific Configuration ... == Summary == 29 checks PASS 39 checks FAIL 38 checks WARN 10 checks INFO
実行結果を確認し、まずはここら辺の対応をしてみましょう。
[FAIL] 1.1.3 Ensure auditing is configured for the docker daemon (Automated) [FAIL] 1.1.4 Ensure auditing is configured for Docker files and directories - /run/containerd (Automated) [FAIL] 1.1.5 Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) [FAIL] 1.1.6 Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) [FAIL] 1.1.7 Ensure auditing is configured for Docker files and directories - docker.service (Automated) [FAIL] 1.1.8 Ensure auditing is configured for Docker files and directories - containerd.sock (Automated) [FAIL] 1.1.9 Ensure auditing is configured for Docker files and directories - docker.socket (Automated) [FAIL] 1.1.10 Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) [FAIL] 1.1.11 Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json (Automated) [FAIL] 1.1.12 Ensure auditing is configured for Docker files and directories - /etc/containerd/config.toml (Automated) [FAIL] 1.1.13 Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated) [FAIL] 1.1.14 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) [FAIL] 1.1.15 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) [FAIL] 1.1.16 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) [FAIL] 1.1.17 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) [FAIL] 1.1.18 Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated)
概要の下のあたりに詳細が表示されています。該当の部分を確認すると、Ubuntuにどうやらauditctlがインストールされていないようです。
1.1.3 /bin/sh: 1: auditctl: not found 1.1.4 /bin/sh: 1: auditctl: not found 1.1.5 /bin/sh: 1: auditctl: not found 1.1.6 /bin/sh: 1: auditctl: not found 1.1.7 /bin/sh: 3: auditctl: not found
次のようにインストールします。
# apt install auditd
それでもう一度実行しましょう。
# docker-bench --benchmark cis-1.3.1 > results # vi results
そうすると、次のように推奨する設定が表示されますので、 指示に従って設定を変更してみます。 1.1.3から1.1.18までが/etc/audit/audit.rulesの設定でした。
1.1.3 You should add rules for the Docker daemon. For example: Add the line below to the /etc/audit/audit.rules file: -w /usr/bin/dockerd -k docker Then, restart the audit daemon using the following command systemctl restart auditd 1.1.4 You should add a rule for the /var/lib/docker directory. For example, Add the line as below to the /etc/audit/audit.rules file: -a exit,always -F path=/run/containerd -F perm=war -k docker Then restart the audit daemon. For example, systemctl restart auditd 1.1.5 You should add a rule for the /var/lib/docker directory. For example, Add the line as below to the /etc/audit/audit.rules file: -a exit,always -F path=/var/lib/docker -F perm=war -k docker Then restart the audit daemon. For example, systemctl restart auditd
設定をしていきましょう。
docker-benchの実行結果への対応をする
まず、この設定をしてみます。
1.1.3 You should add rules for the Docker daemon. For example: Add the line below to the /etc/audit/audit.rules file: -w /usr/bin/dockerd -k docker Then, restart the audit daemon using the following command systemctl restart auditd
/etc/audit/rules.d/audit.rules
ファイルを開くと、デフォルトでは次のような記述がありました。
## First rule - delete all -D ## Increase the buffers to survive stress events. ## Make this bigger for busy systems -b 8192 ## This determine how long to wait in burst of events --backlog_wait_time 60000 ## Set failure mode to syslog -f 1
このファイルに指示された行を追記していくだけで良いそうです。
## First rule - delete all -D ## Increase the buffers to survive stress events. ## Make this bigger for busy systems -b 8192 ## This determine how long to wait in burst of events --backlog_wait_time 60000 ## Set failure mode to syslog -f 1 # Add rules -w /usr/bin/dockerd -k docker
最後にサービスを再起動して、 auditdサービスでエラーが表示されないことを確認します。 同様の方法で1.1.18までの指示に従い、コードを追記していきます。
ポイントは1行追記するごとにauditdの再起動と確認をすることです。適切な設定ではないとサービスの起動時に警告が表示されます。
systemctl restart auditd systemctl status auditd ● auditd.service - Security Auditing Service Loaded: loaded (/lib/systemd/system/auditd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-06-21 07:50:28 UTC; 5s ago Docs: man:auditd(8) https://github.com/linux-audit/audit-documentation Process: 6443 ExecStart=/sbin/auditd (code=exited, status=0/SUCCESS) Process: 6447 ExecStartPost=/sbin/augenrules --load (code=exited, status=0/SUCCESS) Main PID: 6444 (auditd) Tasks: 2 (limit: 4665) Memory: 468.0K CPU: 68ms CGroup: /system.slice/auditd.service └─6444 /sbin/auditd Jun 21 07:50:28 docker-demo-1 augenrules[6460]: enabled 1 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: failure 1 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: pid 6444 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: rate_limit 0 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: backlog_limit 8192 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: lost 0 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: backlog 0 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: backlog_wait_time 60000 Jun 21 07:50:28 docker-demo-1 augenrules[6460]: backlog_wait_time_actual 0 Jun 21 07:50:28 docker-demo-1 systemd[1]: Started Security Auditing Service.
もう一度実行して、FAILやWARNの数が少なくなったか確認してみます。
# docker-bench --benchmark cis-1.3.1 > results2 # diff -u results results2 > diff2 # vi diff2 ... 1.2.1 You may consider various CIS Security Benchmarks for your container host. If you have other security guidelines or regulatory requirements to adhere to, please follow them as suitable in your environment. @@ -568,7 +485,7 @@ 7.10 Test marked as skip == Summary == -29 checks PASS -39 checks FAIL +42 checks PASS +26 checks FAIL 38 checks WARN 10 checks INFO
ファイルを確認してみましょう。まだFailな項目がいくつかありますが、Auditlogを取るための設定ができたことがわかります。
# vi diff2 ... --- results 2022-06-21 07:37:37.071448638 +0000 +++ results2 2022-06-21 08:49:29.264647901 +0000 @@ -3,22 +3,22 @@ [INFO] 1.1 Linux Hosts Specific Configuration [FAIL] 1.1.1 Ensure a separate partition for containers has been created (Automated) [WARN] 1.1.2 Ensure only trusted users are allowed to control Docker daemon (Automated) -[FAIL] 1.1.3 Ensure auditing is configured for the docker daemon (Automated) -[FAIL] 1.1.4 Ensure auditing is configured for Docker files and directories - /run/containerd (Automated) -[FAIL] 1.1.5 Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) -[FAIL] 1.1.6 Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) -[FAIL] 1.1.7 Ensure auditing is configured for Docker files and directories - docker.service (Automated) +[PASS] 1.1.3 Ensure auditing is configured for the docker daemon (Automated) +[PASS] 1.1.4 Ensure auditing is configured for Docker files and directories - /run/containerd (Automated) +[PASS] 1.1.5 Ensure auditing is configured for Docker files and directories - /var/lib/docker (Automated) +[PASS] 1.1.6 Ensure auditing is configured for Docker files and directories - /etc/docker (Automated) +[PASS] 1.1.7 Ensure auditing is configured for Docker files and directories - docker.service (Automated) [FAIL] 1.1.8 Ensure auditing is configured for Docker files and directories - containerd.sock (Automated) [FAIL] 1.1.9 Ensure auditing is configured for Docker files and directories - docker.socket (Automated) [FAIL] 1.1.10 Ensure auditing is configured for Docker files and directories - /etc/default/docker (Automated) -[FAIL] 1.1.11 Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json (Automated) +[PASS] 1.1.11 Ensure auditing is configured for Docker files and directories - /etc/docker/daemon.json (Automated) [FAIL] 1.1.12 Ensure auditing is configured for Docker files and directories - /etc/containerd/config.toml (Automated) [FAIL] 1.1.13 Ensure auditing is configured for Docker files and directories - /etc/sysconfig/docker (Automated) -[FAIL] 1.1.14 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) -[FAIL] 1.1.15 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) -[FAIL] 1.1.16 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) -[FAIL] 1.1.17 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) -[FAIL] 1.1.18 Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) +[PASS] 1.1.14 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd (Automated) +[PASS] 1.1.15 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim (Automated) +[PASS] 1.1.16 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v1 (Automated) +[PASS] 1.1.17 Ensure auditing is configured for Docker files and directories - /usr/bin/containerd-shim-runc-v2 (Automated) +[PASS] 1.1.18 Ensure auditing is configured for Docker files and directories - /usr/bin/runc (Automated) [INFO] 1.2 General Configuration [WARN] 1.2.1 Ensure the container host has been Hardened (Manual) [WARN] 1.2.2 Ensure that the version of Docker is up to date (Manual) @@ -60,10 +60,10 @@ [PASS] 3.16 Ensure that Docker socket file permissions are set to 660 or more restrictive (Automated) [FAIL] 3.17 Ensure that daemon.json file ownership is set to root:root (Automated) [FAIL] 3.18 Ensure that daemon.json file permissions are set to 644 or more restrictive (Automated) -[FAIL] 3.19 Ensure that /etc/default/docker file ownership is set to root:root (Automated) +[PASS] 3.19 Ensure that /etc/default/docker file ownership is set to root:root (Automated) [FAIL] 3.20 Ensure that /etc/sysconfig/docker file permissions are set to 644 or more restrictive (Automated) [FAIL] 3.21 Ensure that the /etc/sysconfig/docker file ownership is set to root:root (Automated) -[FAIL] 3.22 Ensure that /etc/default/docker file permissions are set to 644 or more restrictive (Automated) +[PASS] 3.22 Ensure that /etc/default/docker file permissions are set to 644 or more restrictive (Automated) [PASS] 3.23 Ensure that the Containerd socket file ownershi is set to root:root (Automated) [WARN] 3.24 Ensure that the Containerd socket file permissions are set to 660 or more restrictive (Automated)
1.1.8, 1.1.9, 1.1.10のあたりを確認してみましょう。 これらは設定済みですが、未設定と判断されるのはバグでしょうか。
1.1.8 If the file exists, you should add a rule for it. For example: Add the line below to the /etc/audit/audit.rules file: -w /run/containerd/containerd.sock -k docker Then restart the audit daemon. For example: systemctl restart auditd 1.1.9 If the file exists, you should add a rule for it. For example: Add the line below to the /etc/audit/audit.rules file: -w /var/run/docker.sock -k docker Then restart the audit daemon. For example: systemctl restart auditd 1.1.10 You should add a rule for the /etc/default/docker directory. For example: Add the line below to the /etc/audit/audit.rules file: -w /etc/default/docker -k docker Then restart the audit daemon. For example: systemctl restart auditd
ちなみに、現在のバージョンのDockerは/var/run/docker.sock
と/run/containerd/containerd.sock
がソケットとして使われています。
サービスも起動しているので、これについては気にしないで良さそうです。
# netstat -al --protocol=unix|grep docker unix 2 [ ACC ] STREAM LISTENING 59398 /run/docker.sock unix 2 [ ACC ] STREAM LISTENING 59363 /var/run/docker/metrics.sock unix 2 [ ACC ] STREAM LISTENING 59538 /var/run/docker/libnetwork/5bb0e5b25670.sock # netstat -al --protocol=unix|grep containerd unix 2 [ ACC ] STREAM LISTENING 52057 /run/containerd/containerd.sock.ttrpc unix 2 [ ACC ] STREAM LISTENING 52059 /run/containerd/containerd.sock unix 3 [ ] STREAM CONNECTED 59418 /run/containerd/containerd.sock unix 3 [ ] STREAM CONNECTED 59365 /run/containerd/containerd.sock
また、/etc/default/docker
に関する警告も出ていますが、これも現在のバージョンのUbuntuでは参照されないファイルになりますので、対応はしなくて良いと思われます。
systemdが標準で使われるようになったUbuntu 15.04以降では不要の設定と思われます。
このように若干ツールがOSの進化についてきていない傾向がありますが、Dockerをセキュアに保つ参考にはなるツールじゃないかと思います。 そのほかの項目についても可能な限り、同様の対応をしていきます。
次回は今回取り上げたツールと類似する、Docker Bench for Securityを取り上げる予定です。
今回の内容について参考にした情報
- https://thoames.hatenadiary.jp/entry/2019/01/03/135224
- https://container-security.dev/hardening/cis-benchmark.html
- https://www.aquasec.com/cloud-native-academy/docker-container/docker-cis-benchmark/
- https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/sec-defining_audit_rules_and_controls