Deep SecurityのAWS WAF連携「IP List連携」を試してみる

2016.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

セキュリティって怖いですよね、森永です。

Trend Microさんの出されているDeep Security(以下、DS)は、AWSとの親和性が高くAWSでセキュリティ強化、という方は多く使われているのではないかと思います。

そんなDSですが、更なるAWSとの連携を目指してこんなリポジトリを公開されています。
AWS WAFとの連携スクリプトというものがありますので、こちらを試してみましょう。

DSのAWS WAF連携

スクリプトの中身はPythonとなっており、AWSのAPIとDSのAPIを呼び出すことで連携を実現しています。
なので、Pythonが分かれば改造もできちゃいます。
現在提供されている機能は大きく以下の3つです。

  • IP List
    • DeepSecurityが持っている「IP List」をAWS WAFの「IP Set」に渡す
  • SQL Injection (SQLi)
    • EC2を分析し、必要なSQLi対策用のmatch conditionを作成する
    • 作成したmatch conditionをAWS WAFに渡す
  • cross site scripting (XSS)
    • EC2を分析し、必要なXSS対策用のmatch conditionを作成する
    • 作成したmatch conditionをAWS WAFに渡す

今回はIP Listの連携について検証します。

試してみた

今回はDSaaSを使用して検証します。

2016/4/12現在、絶賛開発中です。
仕様変更されている可能性が高いですのでご注意下さい!

前準備

DSaaSにスクリプト実行用のユーザを作成します。
まず、「管理」→「ユーザ管理」→「役割」→「新規」から役割を作成します。

Trend_Micro_Deep_Security_Manager

README.mdには、

This user should have the bare minimum permissions required to complete the tasks.

と書かれていますので、「WebサービスAPIへのアクセス許可」だけチェックを入れます。
スクリプトでのみ使用するユーザですので、「Deep Security Managerユーザインタフェースへのアクセスを許可」のチェックは外しておきます。

新しい役割のプロパティ

次に、「管理」→「ユーザ管理」→「ユーザ」→「新規」からユーザを作成します。 名前、パスワードなど必要な物を入力し、「役割」で先ほど作成した役割を選択します。

新規ユーザ名のプロパティ

これでDS側の準備は完了です。
次に、スクリプトを実行する環境を整えます。

今回はMacでやっていますが、Linuxや最近発表されたWindowsのBash環境でも同様に可能かと思います。(未検証です)

まずは必要なものを揃えます。
AWS CLIはこちらを参照してインストールして下さい。
権限は、最低でもAWS WAFへのフルアクセス権限を付与してください。

IAM_Management_Console

GitはMacの場合最初からインストールされています。
インストールされていなければインストールして下さい。

$ sudo easy_install pip
...省略...

$ sudo pip install awscli
...省略...

$ aws configure
AWS Access Key ID [None]:XXXXXXXXXXXXX
AWS Secret Access Key [None]:XXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:

[補足]
2016/4/12現在、AWSのcredentialsファイルの一番下にあるprofileを読み込む設定になっています。
複数profileを設定されている方はAWS WAF連携を使用したいアクセスキーを一番下に記載するようにして下さい。

$ vi ~/.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXX

[AWS_WAF] ← こちらのプロファイルが読み込まれるので注意
aws_access_key_id = YYYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYY

defaultプロファイルを読むように修正したものをプルリク出しておきます。 補足終了。

次にリポジトリをCloneします。

$ git clone https://github.com/deep-security/aws-waf.git
...省略...

$ cd aws-waf/
$ ll
total 44
-rw-r--r-- 1 root root   658 Apr 12 03:09 ISSUE_TEMPLATE
-rw-r--r-- 1 root root  1081 Apr 12 03:09 LICENSE
-rw-r--r-- 1 root root 17710 Apr 12 03:09 README.md
-rw-r--r-- 1 root root   549 Apr 12 03:09 demo-placeholder.html
-rwxr-xr-x 1 root root  1872 Apr 12 03:09 ds-to-aws-waf.py
drwxr-xr-x 3 root root  4096 Apr 12 03:09 lib
-rw-r--r-- 1 root root    33 Apr 12 03:09 requirements.txt

「requirements.txt」にスクリプト実行に必要な物が記載されていますので、以下のコマンドでインストールします。

$ sudo pip install -r requirements.txt
Collecting netaddr>=0.7.18 (from -r requirements.txt (line 1))
  Downloading netaddr-0.7.18-py2.py3-none-any.whl (1.5MB)
    100% |################################| 1.5MB 134kB/s
...省略...

boto3がインストールされるのですが、古いものがインストールされてAWS CLIが実行できなくなることがありますので、AWS CLIが実行できなくなった場合は、再度sudo pip install awscliするなどして最新のものに戻して下さい。

以下のコマンドを試して、ヘルプが表示されれば、前準備は完了です!

$ python ds-to-aws-waf.py
usage: ds-to-aws-waf [COMMAND]
   For more help on a specific command, type ds-to-aws-waf [COMMAND] --help

   Available commands:

   iplist
      > Push a Deep Security IP list to an AWS WAF IP Set
   xss
      > Determine which instances protected by Deep Security should also be protected by AWS WAF XSS rules
   sqli
      > Determine which instances protected by Deep Security should also be protected by AWS WAF SQLi rules

IP List

まずは、DSのIP Listの一覧を表示してみます。
IP Listというのは、「ポリシー」→「リスト」→「IPリスト」にあるこいつです。
本来は、運用してちゃんとしたIPリストがある前提ですが、これは初期状態です。

Trend_Micro_Deep_Security_Manager 2

テスト用にIP Listを追加しておきます。
「新規」→「新規IPリスト」を選択し、IP Listを作成します。

Trend_Micro_Deep_Security_Manager 3

新規IPリストのプロパティ

IP Listを作成したので、スクリプトを実行してみましょう。
-lオプションを付けることで、一覧表示が出来ます。

$ python ds-to-aws-waf.py iplist -u aws_integration -p XXXXXXXX -t 'テナント名はAccount Name' -l

Available Deep Security IP Lists
================================
1   Ignore Reconnaissance
2   Network Broadcast
3   Ingress Filters
4   Domain Controller(s)
5   Off Domain IPs
6   Corporate Network IPs
7   VPN Tunnel IPs
21  AWS_WAF

Available AWS WAF IP Sets
=========================
---  No AWS WAF WACLs available

DSのIP Listの一覧が表示されました。
先ほど追加したIP ListのIDは21ということが分かりました。

では、これをAWS WAFのIP Setに流し込みます。
-i IP_List_IDオプションを付けることで、指定したIDのIP ListをAWS WAFのIP Setとして流しこむことが出来ます。

$ python ds-to-aws-waf.py iplist -u aws_integration -p XXXXXXXX -t 'テナント名はAccount Name' -i 21
Converted 1 IP List entries to 1 IP Set entries
Created IP Set [AWS_WAF] with ID [7ccfcb9f-6121-4c5e-b539-3a5d82aea7b4]

すると、AWS WAFの「IP Addresses」にIP Setが追加されています!

AWS_WAF

DSのIP Listに別のIPを追加して再度実行してみるとどうでしょう。

AWS_WAFのプロパティ

$ python ds-to-aws-waf.py iplist -u aws_integration -p XXXXXXXX -t 'テナント名はAccount Name' -i 21
Converted 1 IP List entries to 1 IP Set entries
Updated IP Set [AWS_WAF] with ID [7ccfcb9f-6121-4c5e-b539-3a5d82aea7b4]

ちゃんと更新されていますね!

AWS_WAF 2

後はこのIP Setを使ってWACLを作成すれば、特定IPだけ許可・拒否するということが出来るようになります。
このスクリプトではIP Setを作るだけなので、料金は発生しません。

最後に

まだまだ荒削りなスクリプトですが、DSとAWSとの連携が簡単にできるようになります。
今後の開発に期待です!!