CloudFormationでContainer InstanceにDeep Security Agentを導入する


こんにちは、ひろかずです。
Dockerコンテナが稼働するContainer InstanceにDeep Security Agentを導入する需要があるので、一筆書きます。

###2016年4月8日追補
dockerは、ホストとContainer間の通信をiptablesでnatするため、暗黙的にiptablesを使用します。
Deep Security Agentは、起動時にiptablesを停止するので、事前にiptablesに影響を及ぼさない措置を取っておく必要があります。
参考記事
[NATサーバにDSAをインストールする(Deep Security 9.5 / DSaaS)](http://qiita.com/fnifni/items/922fb8ee153f755da5bc)

#前提
- Deep Security Manager 9.6、またはDSaaSの導入が完了していること。
- ライセンスを投入していること。
- Container Instanceを配置するVPC, Subnet, SecurityGroupが存在すること。
- Container Instanceを配置するAWSアカウントのクラウドアカウントが登録済みであること。(参照:[Auto ScaleしたインスタンスをDeep Securityで管理する](http://qiita.com/fnifni/items/6226354354db3f3587f8))

#参照情報
- [Amazon EC2 Container Service:よくある質問:セキュリティ](https://aws.amazon.com/jp/ecs/faqs/#security)
- [Amazon EC2 Container Service:Developer Guide: Getting Started with Amazon ECS](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_GetStarted.html)
- [suz-lab - blog:CloudFormationで"Container Instance"が"Auto Scaling"で管理されているECSのクラスターを作成してみた](http://blog.suz-lab.com/2015/06/cloudformationcontainer-instanceauto.html)

#目的とゴール
- CloudFormationで起動時にDeep Security Agentをインストール/有効化したContainer InstanceがAuto Scalingで管理されているECSのクラスターを作成する。
- Docker Containerで稼働するWebサービスに向けた攻撃通信をDeep Securityが検知する。

構成はこんな感じです。
![構成例.png](https://qiita-image-store.s3.amazonaws.com/0/46611/8cb142d7-2e5c-611c-2be7-f93d2640cda1.png "構成例.png")

#工程
1. CloudFormationテンプレートを用意する。
2. CloudFormationテンプレートを実行する。
3. Task Definitionsを設定する
4. Docker Containerで稼働するWebサービスに向けた疑似攻撃通信を送信する。

#1. CloudFormationテンプレートを用意する。
今回は、[suz-lab - blog:CloudFormationで"Container Instance"が"Auto Scaling"で管理されているECSのクラスターを作成してみた](http://blog.suz-lab.com/2015/06/cloudformationcontainer-instanceauto.html)で公開されているCloudFormationテンプレートをベースに、UserDataにDeep Security Agentをインストール/有効化するコマンドを追加します。
##CloudFormationテンプレート
[こちら](https://github.com/fnifni/deepsecurity/blob/master/cfn-ecs-ds-tmp.json)に上げておきました。

Deep Securityインストール/有効化のために変更したポイントは以下です。

- wgetのインストール
- Deep Security Agent有効化時にpolicyが適用されますが、モジュール導入の時間を考慮して、ハートビートコマンドの実行と待ち時間を入れています。
- 今回はUserDataを用いましたが、実装に応じてCloudInitを用いる等検討してください。
- 使用するには、`dsm-ipaddress` と `policyid:XX`を実際の値に置き換える必要があります。

```
                "UserData": { "Fn::Base64": { "Fn::Join" : [ "\n", [
                    "#!/bin/bash",
                    "yum install -y wget",
                    "wget https://dsm-ipaddress.194:4119/software/agent/amzn1/x86_64/ -O /tmp/agent.rpm --no-check-certificate --quiet",
                    "rpm -ihv /tmp/agent.rpm",
                    "sleep 10",
                    "/opt/ds_agent/dsa_control -a dsm://dsm-ipaddress:4120/ \"policyid:XX\"",
                    "sleep 10",
                    "/opt/ds_agent/dsa_control -m",
                    "sleep 10",
                    "/opt/ds_agent/dsa_control -m",
                    "sleep 10",
                    "yum -y update",
                    "grubby --default-kernel | grep `uname -r` || reboot",
                    { "Fn::Join" : [ "", [
                        "echo ECS_CLUSTER=",
                        { "Ref": "Cluster" },
                        " >> /etc/ecs/ecs.config"
                    ] ] }
                ] ] } }

```

#2. CloudFormationテンプレートを実行する。
先のテンプレートでCreate Stackを実行し、以下のように設定します。
![1_Create_Stack.png](https://qiita-image-store.s3.amazonaws.com/0/46611/29aef97d-08ae-c30b-0974-0dcd8bd72624.png "1_Create_Stack.png")

以下のようにECSクラスタが作成されます。
(この時点では、Running tasksは0です。)
![2_ECS_cluster.png](https://qiita-image-store.s3.amazonaws.com/0/46611/8d843d1a-5b41-3dd2-d727-10bb60c5e97a.png "2_ECS_cluster.png")

この時点で、Deep Security Managerで2つのコンピュータが有効化されてますね。
![9_DSM.png](https://qiita-image-store.s3.amazonaws.com/0/46611/3b7f4bd9-c426-c6f1-0b8b-547911070fcb.png "9_DSM.png")

ポリシーの中身はこんな感じです。
今回は、試験通信としてSQL Injectionを用いるので、SQL Injection用のルールを適用しました。
![10_test_policy.png](https://qiita-image-store.s3.amazonaws.com/0/46611/7cda1167-621c-2c50-62ef-6eb8d3c232b9.png "10_test_policy.png")


#3. Task Definitionsを設定する
次にContainer Instanceで稼働するWebサービスを設定します。
今回は、httpリクエストを受けられるよう、apacheが稼働するContainerを設定します。

Task Definitionsから、 `Create new Task Definition` を選択します
![3_create_task.png](https://qiita-image-store.s3.amazonaws.com/0/46611/1736c87c-d506-8809-5c8d-151fa7ad72c6.png "3_create_task.png")

Task Definition名を入力して、 `Add container` を選択します。
![4_Add_container.png](https://qiita-image-store.s3.amazonaws.com/0/46611/e58e3691-3b04-acc5-0677-89af2acef5ba.png "4_Add_container.png")

[参考情報：Amazon EC2 Container Service:Developer Guide: Getting Started with Amazon ECS](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_GetStarted.html)を参考に以下のように設定します。
![5_add_container.png](https://qiita-image-store.s3.amazonaws.com/0/46611/22d27791-345f-aa27-3c8e-e9cbf3c26074.png "5_add_container.png")

作成したTask DefinitionをECSクラスタに設定します。
作成したTask Definition画面にてRun Taskを選択し、→
![6_Run_task.png](https://qiita-image-store.s3.amazonaws.com/0/46611/6a404f77-678b-47a8-dbec-13330fdfff61.png "6_Run_task.png")
→ 実行させるECSクラスタを選択します。
![7_Run_task.png](https://qiita-image-store.s3.amazonaws.com/0/46611/20f9ea5e-92d7-a5f9-a390-7ce428fbd5d5.png "7_Run_task.png")

すると、ECSクラスタのステータスが以下のように変わります。
![8_ECS_cluster.png](https://qiita-image-store.s3.amazonaws.com/0/46611/5adcc8ad-95a9-3f7b-82c6-3d90d6f74f86.png "8_ECS_cluster.png")

ポート80で待受を開始してますね。

```
# netstat -luntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
:
tcp        0      0 127.0.0.1:51678             0.0.0.0:*                   LISTEN      2494/docker-proxy
tcp        0      0 :::80                       :::*                        LISTEN      2795/docker-proxy
tcp        0      0 :::4118                     :::*                        LISTEN      1969/ds_agent
:
```

アクセスするとこんな感じです。
![11_http.png](https://qiita-image-store.s3.amazonaws.com/0/46611/d421b0a0-f1ae-92c3-ee28-30a582ab26fe.png "11_http.png")


#4. Docker Containerで稼働するWebサービスに向けた疑似攻撃通信を送信する。
こんなリクエストを投げてみます。
![12_http_attack.png](https://qiita-image-store.s3.amazonaws.com/0/46611/5786e3ea-df28-cd49-c019-2893b8a1ead7.png "12_http_attack.png")

検知しました。
![13_detect.png](https://qiita-image-store.s3.amazonaws.com/0/46611/4c0abbea-11ed-33f8-7a4a-ba109df57776.png "13_detect.png")

###2016年4月8日追補
dockerは、ホストとContainer間の通信をiptablesでnatするため、暗黙的にiptablesを使用します。
Deep Security Agentは、起動時にiptablesを停止するので、事前にiptablesに影響を及ぼさない措置を取っておく必要があります。
参考記事
[NATサーバにDSAをインストールする(Deep Security 9.5 / DSaaS)](http://qiita.com/fnifni/items/922fb8ee153f755da5bc)

#最後に
dockerコンテナにDeep Securityを導入することはできませんが、Container InstanceのNetwork InterfaceでDeep Securityが検査することはできます。
実装する際は、ポリシーにContainer内で使用されているミドルウェアに対応したルールを設定するよう注意してください。