share facebook facebook2 twitter menu hatena pocket slack

2016.01.18 MON

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

吉田 浩和

WRITTEN BY 吉田 浩和

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

前提

  • 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が検知する。

構成はこんな感じです。

0f0b49be-c013-10ab-91b1-3b0ac295ea64

工程

  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を実行し、以下のように設定します。

29aef97d-08ae-c30b-0974-0dcd8bd72624

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

8d843d1a-5b41-3dd2-d727-10bb60c5e97a

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

3b7f4bd9-c426-c6f1-0b8b-547911070fcb

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

7cda1167-621c-2c50-62ef-6eb8d3c232b9

3. Task Definitionsを設定する

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

Task Definitionsから、 Create new Task Definition を選択します

1736c87c-d506-8809-5c8d-151fa7ad72c6

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

e58e3691-3b04-acc5-0677-89af2acef5ba

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

22d27791-345f-aa27-3c8e-e9cbf3c26074

作成したTask DefinitionをECSクラスタに設定します。
作成したTask Definition画面にてRun Taskを選択し、→

6a404f77-678b-47a8-dbec-13330fdfff61

→ 実行させるECSクラスタを選択します。

20f9ea5e-92d7-a5f9-a390-7ce428fbd5d5

すると、ECSクラスタのステータスが以下のように変わります。

5adcc8ad-95a9-3f7b-82c6-3d90d6f74f86

ポート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
:

アクセスするとこんな感じです。

d421b0a0-f1ae-92c3-ee28-30a582ab26fe

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

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

5786e3ea-df28-cd49-c019-2893b8a1ead7

検知しました。

4c0abbea-11ed-33f8-7a4a-ba109df57776

最後に

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

元記事はこちら

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

吉田 浩和

吉田 浩和

cloudpackの中の人。 securitypackと運用、保守を中心に、構築もやってます。 エンタープライズ系SIerを経て、クラウドの最前線で奮闘の日々を送ってます。