Dockerホスト上でDeep Security Agentを使ってみる②

公開日
2016年12月8日

この記事の内容は公開されてから1年以上が経過しております。
情報が古い可能性がありますので、ご注意ください。

前回は、Deep SecurityとDockerホストの関係、Deep Security Agent(DSA)で利用できる機能や留意点についてお伝えしました。今回は、Dockerホスト上のDSAがどのように動作をし、Dockerコンテナに対してどのような形で防御を行うのかを、仕組みを紐解きながら解説したいと思います。
※内容はDeep Security はバージョン9.6 を前提に記載しています。

Deep Security Agentの仕組み

前回の記事の中で、侵入防御機能を利用する際の留意点として、以下を挙げました。

・ホスト上でDockerを起動すると、コンテナとの通信を確保するためにiptablesが有効となりNAT機能(IPマスカレード機能)が有効化されます。DSAをLinuxホストにインストールして、侵入防御機能をONにする際にはデフォルトではDSAがiptablesを無効化する挙動を行いますので、DSAインストール前にiptablesを無効化させないオプションを実行しておく。

iptablesといえば、Linux上で稼動するファイアウォール機能(パケットフィルタリング、NATを提供)ですが、なぜ、Deep Securityでは、侵入防御をONにするとデフォルトでiptablesを無効化する挙動をさせているのでしょうか?

上記に記載したのは、Deep Securityの各機能をどのようなコンポーネントが提供しているかを示したものです。DSAは管理マネージャであるDeep Security Manager(DSM)とやり取りをするDeep Security Agent Coreをベースに2つのコンポーネント群で構成されています。

Plug-ins:カーネル空間でパケット処理、I/Oフックを検出して、適用されたポリシーにしたがって処理を実行するドライバ

Feature module:ユーザ空間でDSMからのポリシーの配信を受けて設定のコンパイルを行い、また、Plug-insでの検出結果をDSMへイベントとして転送するコンポーネント

DSMの管理コンソールからコンピュータ毎のステータスと対応させたイメージは以下のとおりです。

上記でも分かるように、DSAのファイアウォール、侵入防御、Webレピュテーション機能は、Plug-insに含まれるフィルタドライバを利用して、インスタンスのインタフェースにinput/outputされるパケットをハンドリングしています。 このフィルタドライバは、上記の3機能を有効化するとNICにバインドされ、パケットのキャプチャを開始できるようになります。DSAフィルタドライバは、カーネル空間ではiptablesと同じファイアウォール機能も提供するため、機能面での競合を防ぐために、デフォルトでは、各機能をONにした場合にDSAがiptablesを無効化する仕組みを実装しています。

しかしながら、Dockerホスト上では、Dockerコンテナから外部へ通信(Outgoing)をするためにiptablesのIPマスカレード機能、外部からDcokerコンテナへの通信(Incoming)をするためにはDestinationNATを利用する仕様となっており、iptablesを無効化するわけにはいきません。そのためDeep Securityで侵入防御、Webレピュテーション機能を利用する際にはiptablesを有効にしたままでインストール、機能の有効化を行うための設定が必要となります。Dockerホストに対してDeep Security Agentをインストールする前(特にファイアウォール、侵入防御、Webレピュテーション機能をONにする前)には、必ず以下の当社FAQをご参照の上、iptablesが無効化されないようにしてください。

■Deep Security Agent と iptables について
http://esupport.trendmicro.com/solution/ja-JP/1112382.aspx

■OS標準のファイアウォール機能の無効化について
http://esupport.trendmicro.com/solution/ja-JP/1313768.aspx

Dockerホスト、DockerコンテナとDeep Security Agentとの関係性

では、Dockerホスト上のiptablesを有効にしながら、Deep Securityの侵入防御機能も有効化した場合、どのような形でパケットは処理されるのでしょうか?
iptablesとDeep Securityのどちらが先に機能するのかなど、導入の上で気になる点もあると思いますので、以下に解説をしていきたいと思います。

先ほどDSAのフィルタドライバはNICにバインドされることをお伝えしましたが、パケットは以下のようなイメージで処理されていきます。

ホストにDSAをインストールすると、DSAのフィルタドライバ(Linuxの場合、das_filter)は、ホストのインタフェース(物理NIC:eth0など)にバインドされ、iptablesよりもホストのインタフェースに近い部分で動作します。よって、外部からのインバウンド(受信)トラフィックに対しては先にDSAがパケットを処理し、その後にiptablesによる処理が行われます。また、フィルタドライバはホストが持つ仮想インタフェースに対しても同時にバインドされます。インタフェース毎にポリシーを変更することができないため、外部からDocker Container Aに対してTCP80でHTTP通信を許可したい場合、DSAのファイアウォールポリシーは送信、受信方向ともにTCP80を許可する必要があります。

フィルタドライバは、ファイアウォールだけではなく、侵入防御、Webレピュテーションでも機能しているため、Dockerコンテナに対する受信方向の通信に対して、iptablesのNAT処理前のパケットを処理することができるため、イベント検出時に外部の送信元IPがNAT後のIPになってしまうことはありません。

iptablesがホスト側で有効になっておりますので、DSA側のファイアウォールを利用することは推奨しておりません。実施の環境においては、DSA側では侵入防御機能を有効化し、コンテナごとにパケット制御が可能なiptables側にてNAT、パケットフィルタリング機能を利用することが運用しやすいのではないかと思います。

現状、Dockerコンテナごとにポリシーを分けて運用することはできませんが、ホスト全体を外部からの脆弱性を突く攻撃などから守るためには有効に活用いただけます。ぜひ、Dockerの環境でもDeep Securityを活用してみてください。

お問い合わせ窓口一覧

メールでのお問い合わせ
aws@trendmicro.co.jp

Copyright © 2019 Trend Micro Incorporated. All rights reserved.