现实情况和对无根容器的需求
为了理解rootless容器的情况,我进行了调查。
需要使用无根容器的原因。
如果在容器内的 root 用户没有采取任何安全措施,那么容器内的 root 用户与主机的 root 用户是相同的,这样一来容器中可能存在配置错误或容器逃逸的漏洞,从而可能被利用来滥用主机的 root 权限。
作为解决这个问题的机制,有无根容器(rootless container)。
无根容器是指
コンテナランタイムをroot権限なしで動作させることで、非特権ユーザがコンテナを作成、実行出来るようになる
このようにして実行されるコンテナをrootlessコンテナと呼ぶ
在这种容器中,容器内的root用户在主机上看来就是非特权用户。
※後に記載しますがコンテナ内で動作するユーザを非rootにすることとは別の話です
有关定义的详细信息,请参考https://rootlesscontaine.rs/#what-are-rootless-containers-and-what-are-not
如果主机的root权限被夺取,会有什么问题?
根据常言道,失去根基是不好的,现在重新整理一下失去根基可能带来的具体问题。
-
- CPU資源の濫用
-
- クレデンシャルの窃盗
-
- 同一ホストで動くほかプログラムへの干渉
特にKubernetesのような1つのマシンを複数の組織で利用する、いわゆるマルチテナントの環境では、別テナントのコンテナにアクセス出来る事自体が大きな脅威となります
在 Kubernetes 中运行 rootless 容器的示例。
-
- kubernetesのワークロードのコンテナをrootlessで動かす(UserNamespacesSupport)
https://kubernetes.io/docs/tasks/configure-pod-container/user-namespaces/
无根容器的问题
为什么尽管了解到rootless容器的安全性,但其为什么没有普及?这里列举了一些问题。
-
- ネットワークパフォーマンスが悪い
これを解決しようとする研究もある
コンテナ技術における最新の研究動向
well-knownポートをLISTEN出来ない
KubernetesではServiceなどを利用しポートを付け替えられるので大きな問題にならない
社会的变化
-
- Docker, Podman, BuildKit, LXC などのコンテナランタイムはrootlessをサポートしている
https://rootlesscontaine.rs/#examples-of-rootless-containers
RHELではコンテナをrootlessで動かすことが可能(内部はPodmanを利用している)
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/proc_setting-up-rootless-containers_assembly_starting-with-containers
其他解决办法 de fā)
コンテナ内で動作するユーザをroot以外のみに制限することでもコンテナを脱出できる脆弱性による脅威の影響を軽減することが出来るが、コンテナにroot昇格の脆弱性があるとこの対策も意味がない
rootlessでコンテナを動かしておくと、コンテナ内でrootに昇格され、さらにコンテナから脱出されても、ホストのrootとは無関係のユーザであるため、ホストのrootを乗っ取られることにはならない。
没有根基的解决方案比起其他更为根本。
作为这种方法的例子,以下是一些选项
-
- Kubernetes
runAsNonRootなどによる実行ユーザの制限
https://kubernetes.io/docs/concepts/security/pod-security-standards/
kubeletなどのコンポーネントを非rootで動作させるKubeletInUserNamespace
https://kubernetes.io/docs/tasks/administer-cluster/kubelet-in-userns/