第7章 コンテナーのセキュリティー対策

本章では、コンテナーのセキュリティーを保護するために実施できる対策について説明します。

7.1. カーネル機能のドロップ

カーネル機能は Docker の CLI から、および Kubernetes の .json ファイルを使ってドロップできます。ゼロの状態から必要な機能を追加できます。これは、必要なカーネル機能を判別するための最も安全な方法です。

http://blog.siphos.be/2013/05/capabilities-a-short-intro/: Sven Vermeulen 氏によるこのブログ掲載では、各種機能の基本について説明しています。Vermeulen 氏は、anotherping というファイルに ping バイナリーをコピーした後は ping バイナリーには生パケットの送信や、CAP_NET_RAW 機能 (生パケットの送信を許可) の割り当てを許可する機能がなくなり、CAP_NET_RAW 機能が割り当てられた anotherping で生パケットを送信できるようになることを説明しています。

手順 4.1. 機能の実証

1.
#         cp ping anotherping
2.
#         chcon -t ping_exec_t anotherping
3.
$         ping -c 1 127.0.0.1     NG 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.057 ms
4.
$         anotherping -c 1 127.0.0.1    ping: icmp open socket: Operation not permitted
5.
#         setcap cap_net_raw+ep anotherping
6.
#         anotherping -c 1 127.0.0.1    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.054 ms

7.2. root のドロップ

systemd の場合を除き、長時間実行されるコンテナーを root で実行された状態にしないでください。次のような 2 つのアプローチを実行できます。systemd が不要な場合は exec を使用して root になり、ユーザー特権をドロップできます。または systemd を使用する場合は、ユニットファイルを使ってコンテナー内で必要なアプリケーションを起動でき、そのユニットファイルを使用して非 root として必要なサービスを指定できます。

7.3. 特権の確認

コンテナーがホストのハードウェアへのアクセスを必要としない限り、--privilege は使用しないでください。

7.4. コンテナー内のネットワークセキュリティーおよびルーティング

SELinux はまもなくコンテナー内で使用可能になります。

コンテナーには独自の iptables およびルーティングルールがあり、これらを使用して、デフォルトで制限されるネットワークをセットアップし、コンテナーにアクセスすることが期待されるネットワークのみがコンテナーにアクセスできるようにする必要があります。

7.5. suid コンテンツ

スティッキービットコンテンツ (スティッキー UID コンテンツ) のことです。以下のアドバイスに留意してください。特権コンテナーなしに suid コンテンツを使用することはできますが、特権コンテナーなしに suid コンテンツを作成することは容易ではありません。suid としてマークする操作には特権が必要となるためです。

7.6. tmpfile

tmpfile は /tmp に作成されるファイルです。本セクションでは tmpfile 攻撃に言及します。コンテナーは、コンテナー以外の tmpfile が影響を受けるのと同じ競合状態と攻撃の影響を受けます。tmpfile コンテンツの所有権が適切に制限されていることを確認してください。