こんにちは、ひろかずです。
Dockerコンテナが稼働するContainer InstanceにDeep Security Agentを導入する需要があるので、一筆書きます。
前提
- Deep Security Manager 9.6、またはDSaaSの導入が完了していること。
- ライセンスを投入していること。
- Container Instanceを配置するVPC, Subnet, SecurityGroupが存在すること。
- Container Instanceを配置するAWSアカウントのクラウドアカウントが登録済みであること。(参照: Auto ScaleしたインスタンスをDeep Securityで管理する)
参照情報
- Amazon EC2 Container Service:よくある質問:セキュリティ
- Amazon EC2 Container Service:Developer Guide: Getting Started with Amazon ECS
- suz-lab – blog:CloudFormationで”Container Instance”が”Auto Scaling”で管理されているECSのクラスターを作成してみた
目的とゴール
- CloudFormationで起動時にDeep Security Agentをインストール/有効化したContainer InstanceがAuto Scalingで管理されているECSのクラスターを作成する。
- Docker Containerで稼働するWebサービスに向けた攻撃通信をDeep Securityが検知する。
構成はこんな感じです。
工程
- CloudFormationテンプレートを用意する。
- CloudFormationテンプレートを実行する。
- Task Definitionsを設定する
- 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-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を実行し、以下のように設定します。
以下のようにECSクラスタが作成されます。
(この時点では、Running tasksは0です。)
この時点で、Deep Security Managerで2つのコンピュータが有効化されてますね。
ポリシーの中身はこんな感じです。
今回は、試験通信としてSQL Injectionを用いるので、SQL Injection用のルールを適用しました。
3. Task Definitionsを設定する
次にContainer Instanceで稼働するWebサービスを設定します。
今回は、httpリクエストを受けられるよう、apacheが稼働するContainerを設定します。
Task Definitionsから、 Create new Task Definition
を選択します
Task Definition名を入力して、 Add container
を選択します。
参考情報:Amazon EC2 Container Service:Developer Guide: Getting Started with Amazon ECSを参考に以下のように設定します。
作成したTask DefinitionをECSクラスタに設定します。
作成したTask Definition画面にてRun Taskを選択し、→
→ 実行させるECSクラスタを選択します。
すると、ECSクラスタのステータスが以下のように変わります。
ポート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 :
アクセスするとこんな感じです。
4. Docker Containerで稼働するWebサービスに向けた疑似攻撃通信を送信する。
こんなリクエストを投げてみます。
検知しました。
最後に
dockerコンテナにDeep Securityを導入することはできませんが、Container InstanceのNetwork InterfaceでDeep Securityが検査することはできます。
実装する際は、ポリシーにContainer内で使用されているミドルウェアに対応したルールを設定するよう注意してください。
元記事はこちら
「CloudFormationでContainer InstanceにDeep Security Agentを導入する」