rootlessコンテナについて理解するために現状を調査しました
rootlessコンテナの必要性
コンテナ内でのrootは何も対策をしていない場合は、ホストのrootと同じため、設定ミスやコンテナを脱出出来る脆弱性等があるとホストのroot権限を悪用される恐れがある
この問題を解決する仕組みとしてrootlessコンテナがある。
rootlessコンテナとは
コンテナランタイムをroot権限なしで動作させることで、非特権ユーザがコンテナを作成、実行出来るようになる
このようにして実行されるコンテナをrootlessコンテナと呼ぶ
このようなコンテナにおいては、コンテナ内でのrootユーザは、ホストから見ると非特権ユーザとなる
※後に記載しますがコンテナ内で動作するユーザを非rootにすることとは別の話です
定義については https://rootlesscontaine.rs/#what-are-rootless-containers-and-what-are-not が詳しいです
ホストのroot権限を奪取されると何が問題か
rootを取られるとまずい、というのはよく言われますが、具体的にどのような問題があるかを改めて整理します
- CPU資源の濫用
- クレデンシャルの窃盗
- 同一ホストで動くほかプログラムへの干渉
- 特にKubernetesのような1つのマシンを複数の組織で利用する、いわゆるマルチテナントの環境では、別テナントのコンテナにアクセス出来る事自体が大きな脅威となります
kubernetesにおいてrootlessコンテナで稼働させる例
- kubernetesのワークロードのコンテナをrootlessで動かす(
UserNamespacesSupport
)
rootlessコンテナの課題
セキュリティ上rootlessコンテナが良いことはわかりましたが、なぜ普及していないのか?
ここでは、いくつかの課題を紹介します。
- ネットワークパフォーマンスが悪い
- これを解決しようとする研究もある
- コンテナ技術における最新の研究動向
- well-knownポートをLISTEN出来ない
- KubernetesではServiceなどを利用しポートを付け替えられるので大きな問題にならない
世の中の動き
- Docker, Podman, BuildKit, LXC などのコンテナランタイムはrootlessをサポートしている
- RHELではコンテナをrootlessで動かすことが可能(内部はPodmanを利用している)
別の解決策
コンテナ内で動作するユーザをroot以外のみに制限することでもコンテナを脱出できる脆弱性による脅威の影響を軽減することが出来るが、コンテナにroot昇格の脆弱性があるとこの対策も意味がない
rootlessでコンテナを動かしておくと、コンテナ内でrootに昇格され、さらにコンテナから脱出されても、ホストのrootとは無関係のユーザであるため、ホストのrootを乗っ取られることにはならない。
rootlessのほうがより根本的な解決策となっている
このような手法の例としては、以下がある
- Kubernetes
-
runAsNonRoot
などによる実行ユーザの制限 - kubeletなどのコンポーネントを非rootで動作させる
KubeletInUserNamespace
-