LoginSignup
8
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-04

こんにちは、ひろかずです。
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)

前提

  • Deep Security Manager 9.6、またはDSaaSの導入が完了していること。
  • ライセンスを投入していること。
  • Container Instanceを配置するVPC, Subnet, SecurityGroupが存在すること。
  • Container Instanceを配置するAWSアカウントのクラウドアカウントが登録済みであること。(参照:Auto ScaleしたインスタンスをDeep Securityで管理する)

参照情報

目的とゴール

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

構成はこんな感じです。
構成例.png

工程

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

1. CloudFormationテンプレートを用意する。

今回は、suz-lab - blog:CloudFormationで"Container Instance"が"Auto Scaling"で管理されているECSのクラスターを作成してみたで公開されているCloudFormationテンプレートをベースに、UserDataにDeep Security Agentをインストール/有効化するコマンドを追加します。

CloudFormationテンプレート

こちらに上げておきました。

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

  • wgetのインストール
  • Deep Security Agent有効化時にpolicyが適用されますが、モジュール導入の時間を考慮して、ハートビートコマンドの実行と待ち時間を入れています。
  • 今回はUserDataを用いましたが、実装に応じてCloudInitを用いる等検討してください。
  • 使用するには、dsm-ipaddresspolicyid: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

以下のようにECSクラスタが作成されます。
(この時点では、Running tasksは0です。)
2_ECS_cluster.png

この時点で、Deep Security Managerで2つのコンピュータが有効化されてますね。
9_DSM.png

ポリシーの中身はこんな感じです。
今回は、試験通信としてSQL Injectionを用いるので、SQL Injection用のルールを適用しました。
10_test_policy.png

3. Task Definitionsを設定する

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

Task Definitionsから、 Create new Task Definition を選択します
3_create_task.png

Task Definition名を入力して、 Add container を選択します。
4_Add_container.png

参考情報:Amazon EC2 Container Service:Developer Guide: Getting Started with Amazon ECSを参考に以下のように設定します。
5_add_container.png

作成したTask DefinitionをECSクラスタに設定します。
作成したTask Definition画面にてRun Taskを選択し、→
6_Run_task.png
→ 実行させるECSクラスタを選択します。
7_Run_task.png

すると、ECSクラスタのステータスが以下のように変わります。
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

4. Docker Containerで稼働するWebサービスに向けた疑似攻撃通信を送信する。

こんなリクエストを投げてみます。
12_http_attack.png

検知しました。
13_detect.png

2016年4月8日追補

dockerは、ホストとContainer間の通信をiptablesでnatするため、暗黙的にiptablesを使用します。
Deep Security Agentは、起動時にiptablesを停止するので、事前にiptablesに影響を及ぼさない措置を取っておく必要があります。
参考記事
NATサーバにDSAをインストールする(Deep Security 9.5 / DSaaS)

最後に

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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7