2019/3/1 追記
Docker(18.09.3)にrootlessモードが搭載されたので更新しました。
はじめに
先日、オープンソースのコンテナエンジンPodmanのバージョン1.0.0が公開されました。
Podman | podman.io
PodmanはKubernetesのPodをよりシンプルに柔軟に利用できるように開発されたDocker互換のコンテナエンジンで、Docker Swarm関連を除いたほとんどのDockerコマンドを備えています。
Dockerと比べてアーキテクチャの違いがいくつかありますが、Podmanは特徴の一つとしてセキュリティの強さを謳っています。
この記事ではセキュリティの観点からPodmanの機能に関する調査結果をまとめていきます。
目次
rootlessコンテナ
rootless
とは非root権限で制御できることです。
非root権限で動かせるコンテナのため、問題が起きた際の影響範囲を限定することができます。
2019年1月現在のDocker 18.09ではrootless
に対応していませんが、rootless
モードの開発が進められています。
Allow running dockerd as a non-root user (Rootless mode) #38050
Docker 19.xxで当該機能が追加される......との噂です。
###2019/3/1追記
Docker 18.09.3にてrootlessモードが追加されたそうです
[DockerにRootlessモードが入ったぞ!という話 - Qiita]
(https://qiita.com/inductor/items/75db0c1c0d49646dd68a)
意外と早かった!
Linux Auditにおける脆弱性の回避
Linuxにはセキュリティイベントを監視する機能として、Linux Audit
システムが搭載されています。
[Red Hat Enterprise Linux 7 第5章 システム監査 - Red Hat Customer Portal]
(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/chap-system_auditing)
その中で利用される一部のフィールド値の扱いが、PodmanとDockerでは異なっており、例えば、Podmanではホスト側から見たloginuid
とコンテナ側から見たloginuid
は同一ですが、Dockerではホスト側から見たloginuid
とコンテナ側から見たloginuid
は異なります。
これはDockerコンテナからのログインユーザーをLinux Audit
が識別できない可能性を表しています。
$ sudo docker run --privileged -v /:/host fedora touch /host/etc/shadow
$ sudo ausearch -f /etc/shadow -i
type=PROCTITLE msg=audit(10/10/2018 10:27:20.055:4569) : proctitle=/usr/bin/coreutils
--coreutils-prog-shebang=touch /usr/bin/touch /host/etc/shadow
type=SYSCALL msg=audit(10/10/2018 10:27:20.055:4569) : arch=x86_64 syscall=openat
success=yes exit=3 a0=0xffffff9c a1=0x7ffdb6973f50 a2=O_WRONLY|O_CREAT|O_NOCTTY|
O_NONBLOCK a3=0x1b6 items=2 ppid=11863 pid=11882 auid=unset uid=root gid=root
euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset
comm=touch exe=/usr/bin/coreutils subj=system_u:system_r:spc_t:s0 key=(null)
引用:
Podman: A more secure way to run containers | Opensource.com
上記コマンドでは、Dockerコンテナを起動してファイル編集を行ない、Linux Audit
のログを出力していますが、auid=unset
となっており、ユーザーの特定が不可能であることが分かります。
この原因はDockerがクライアント・サーバ型のアーキテクチャであることに依るものですが、下記ページが非常に分かりやすかったので詳しく知りたい方はご一読ください。
[Intro to Podman (Red Hat Enterprise Linux 7.6 Beta) - RHD Blog]
(https://developers.redhat.com/blog/2018/08/29/intro-to-podman/)
#参考記事まとめ
Podman | podman.io
[Podman: A more secure way to run containers | Opensource.com]
(https://opensource.com/article/18/10/podman-more-secure-way-run-containers)
Allow running dockerd as a non-root user (Rootless mode) #38050
[Red Hat Enterprise Linux 7 第5章 システム監査 - Red Hat Customer Portal]
(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/chap-system_auditing)
[Intro to Podman (Red Hat Enterprise Linux 7.6 Beta) - RHD Blog]
(https://developers.redhat.com/blog/2018/08/29/intro-to-podman/)
[Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで]
(https://www.slideshare.net/AkihiroSuda/docker-125002128)