コンテナ化は急成長しているテクノロジーです。近い将来、世界の組織の75パーセントが何らかのコンテナ化されたテクノロジーを実行するようになるかもしれません。広く使われているテクノロジーはハッカーの標的になりやすいため、コンテナのセキュリティ確保は特に重要です。この記事では、RHEL8のデフォルトのコンテナ管理ツールであるPodmanコンテナをPOSIXを使ってセキュアにする方法を紹介します。
Podmanコンテナの特権モードの決定
コンテナは特権モードまたは非特権モードで実行されます。特権モードでは、コンテナの uid 0 はホストの uid 0 にマッピングされます。特権モードでは、れます。場合によっては、非特権コンテナは。ただし、操作モードに関係なく、seccompフィルタ、削除、名前空間などのテクニックがコンテナのセキュリティ確保に役立ちます。
コンテナの外から特権モードを決定するには
$ podman inspect --format="{{.HostConfig.Privileged}}" <container id>
上記のコマンドが true を返す場合は、コンテナは特権モードで実行されています。false を返した場合は、コンテナは非特権モードで実行されています。
コンテナ内から特権モードを決定するには
$ ip link add dummy0 type dummy
このコマンドでインターフェイスを作成できる場合は特権コンテナを実行していることになり、そうでない場合は非特権コンテナを実行していることになります。
エンパワーメント
名前空間は、コンテナのプロセスを、ホストのリソースへの任意のアクセスや、同じホスト上で実行されている他のコンテナのリソースから隔離します。ただし、特権コンテナ内のプロセスは、IPルーティング・テーブルの変更、任意のプロセスの追跡、カーネル・モジュールのロードなどを行うことができます。コンテナが特権モードで実行されている場合でも、コンテナ内のプロセスによってアクセスまたは変更できるリソースに、よりきめ細かい制限を課すことができます。また、エンパワーメントを使用すると、特権を持たないコンテナに対して、そのコンテナが持っていない特権を割り当てることができます。
たとえば、非特権コンテナに NET_ADMIN 関数を追加して、コンテナ内にネットワーク・インターフェイスを作成するには、次のパラメータを指定して podman を実行します:
[root@vm1 ~]# podman run -it --cap-add=NET_ADMIN centos[root@b27fea33ccf1 /]# ip link add dummy0 type dummy[root@b27fea33ccf1 /]# ip link
上記のコマンドは、非特権コンテナでのダミー0 インタフェースの作成を示しています。非特権コンテナは、NET_ADMIN 権限がないとインタフェースを作成できません。上記のコマンドは、非特権コンテナに権限を付与する方法を示しています。
現在、付与または拒否できる 権限は約39種類あります。特権コンテナには、デフォルトで多くの権限が付与されています。特権コンテナの安全性を高めるため、特権コンテナから不要な権限を削除することをお勧めします。
コンテナからすべての機能を削除するには
$ podman run -it -d --name mycontainer --cap-drop=all centos
コンテナのパワーを一覧表示します:
$ podman exec -it fa512 capsh --print
上記のコマンドは、コンテナに電源が付与されていないことを示しています。
$ man capabilities
capsh 使用すると、現在所有しているパワーをリストアップできます:
$ capsh --print
別の例として、次のコマンドは、コンテナから NET_RAW 権限を削除する方法を示しています。NET_RAW 権限がないと、コンテナからインターネット上のサーバーに ping を送信できません。
$ podman run -it --name mycontainer1 --cap-drop=net_raw centos>>> ping google.com (will output error, operation not permitted)
最後の例として、コンテナがSETUIDとSETGIDパーミッションだけを必要とする場合、すべてのパーミッションを削除し、その2つだけを追加し直すことで、そのようなパーミッション・セットを実現できます。
$ podman run -d --cap-drop=all --cap-add=setuid --cap-add=setgid fedora sleep 5 > /dev/null; pscap | grep sleep
上記の pscap コマンドは、コンテナに付与された能力を表示します。
パーミッションを使ってPodmanコンテナを保護する方法を簡単に説明しましたが、楽しんでいただけましたか?
ありがとうございます!
経由:




