Dockerのセキュリティに関するDockerのドキュメントに優れた記事があります: https://docs.docker.com/articles/security/
ただし、コンテナー内のroot特権プロセスが実際にホストシステムでどのように実行されるか、およびコンテナーの外部にプロセスが「リークする」リスクを処理するためにSELinuxをどのように構成することになっているのかは、はっきりしていません。
たとえば、コンテナー内でnginxを実行していて、コンテナーの外で「ps」を実行すると、すべてのnginxプロセスを表示できます。
root 7281 4078 0 01:36? 00:00:00 nginx:マスタープロセスnginx www-data 7309 7281 0 01:36? 00:00:00 nginx:ワーカープロセス www-data 7310 7281 0 01:36? 00:00:00 nginx:ワーカープロセス www-data 7311 7281 0 01:36? 00:00:00 nginx:ワーカープロセス www-data 7312 7281 0 01:36? 00:00:00 nginx:ワーカープロセス
これはDockerの動作方法であるため、これは驚きではありません。VMの外部に何も表示されない仮想化ではありません。 Dockerを使用すると、コンテナーのプロセスは名前空間内のホストOSで実行され、権限が制限されます。ホストカーネルと直接通信しています。
この状況では、Dockerなしで実行されている場合と同様に、SELinuxを構成してdockerの代わりにnginxプロセスを保護する必要があると思います。あれは正しいですか?
また、nginxのようなウェブサーバーを実行するのにより適切な特定のDocker構成はありますか?
もちろん、SELinux対応のDocker(RHEL/CentOS 7およびFedora)を使用していると仮定すると、 何もする必要はありません SELinuxが有効になっていて、ホストで強制されていることを除いて、機械。
Dockerまたはvirshで作成されたコンテナーには、SELinuxポリシーで指定されたSELinuxコンテキストが自動的に割り当てられます。
コンテナのプロセスが実行されているセキュリティコンテキストを確認することができます。そのためには、-Z
オプションをps
に追加。例えば:
LABEL PID TTY STAT TIME COMMAND
system_u:system_r:virtd_lxc_t:s0:c5,c342 26351 ? Ss 0:00 /sbin/init
system_u:system_r:virtd_lxc_t:s0:c5,c342 26458 ? Ss 0:00 /usr/sbin/sshd -D
SELinux自体は名前空間を持たないため、独立したOSインストールであるかのように、コンテナー内に個別のSELinuxポリシーを設定することはできません。
これは、libvirtによって管理されるコンテナー用のSELinuxほど(まだ)開発されていないようです。しかし、一般的には、あまり心配する必要のないものでなければなりません。