とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

Aqua Securityのdocker-benchを使う

Dockerといえば、Kubernetes 1.24リリースにあたり、DockerとKubernetesの橋渡しをしていたdockershimのサポートがKubernetesから無くなったことに伴い、従来のやり方でKubernetesでDockerランタイムが利用できなくなったことが記憶に新しいですが、コンテナイメージを作るのにDockerはまだまだ使われると思いますし、Kubernetesまで必要ないレベルの利用にDockerやDocker Composeは開発の現場でも使われると思います。

最近はDocker Desktopへの開発のためのツールや機能追加が盛んですから、まだまだDockerは使われるでしょう。 そのため、Docker を便利かつ安全に使い続けるべく、ツールを使ったセキュリティチェックが必要になってきます。

今回はAqua securityのdocker-benchを使ってみたいと思います。

github.com

このツールは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を取り上げる予定です。

今回の内容について参考にした情報