こんにちは、ひろかずです。
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で管理する)
参照情報
- 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サービスに向けた疑似攻撃通信を送信する。
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内で使用されているミドルウェアに対応したルールを設定するよう注意してください。