PodmanのセキュリティはDockerよりも何が優れているのか？

**2019/3/1 追記**
Docker（18.09.3）にrootlessモードが搭載されたので更新しました。

---

# はじめに
先日、オープンソースのコンテナエンジン**Podman**のバージョン1.0.0が公開されました。
[Podman | podman.io](https://podman.io/)

PodmanはKubernetesのPodをよりシンプルに柔軟に利用できるように開発された**Docker互換のコンテナエンジン**で、Docker Swarm関連を除いたほとんどのDockerコマンドを備えています。

Dockerと比べてアーキテクチャの違いがいくつかありますが、Podmanは特徴の一つとして**セキュリティの強さ**を謳っています。
この記事ではセキュリティの観点からPodmanの機能に関する調査結果をまとめていきます。


# 目次
- [rootlessコンテナ](#rootlessコンテナ)
- [Linux Auditにおける脆弱性の回避](#linux-auditにおける脆弱性の回避)


## rootlessコンテナ
`rootless`とは非root権限で制御できることです。
非root権限で動かせるコンテナのため、問題が起きた際の影響範囲を限定することができます。

2019年1月現在のDocker 18.09では`rootless`に対応していませんが、`rootless`モードの開発が進められています。
[Allow running dockerd as a non-root user (Rootless mode) #38050](https://github.com/moby/moby/pull/38050)

Docker 19.xxで当該機能が追加される......との噂です。

###2019/3/1追記
Docker 18.09.3にてrootlessモードが追加されたそうです:tada:
[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`が識別できない可能性を表しています。

```shell:edit_file_and_audit_log
$ 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](https://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](https://github.com/moby/moby/pull/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)