こんにちは、ひろかずです。
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内で使用されているミドルウェアに対応したルールを設定するよう注意してください。