Deep SecurityのAWS WAF連携「IP List連携」を試してみる
セキュリティって怖いですよね、森永です。
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にスクリプト実行用のユーザを作成します。
まず、「管理」→「ユーザ管理」→「役割」→「新規」から役割を作成します。
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へのフルアクセス権限を付与してください。
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リストがある前提ですが、これは初期状態です。
テスト用にIP Listを追加しておきます。
「新規」→「新規IPリスト」を選択し、IP Listを作成します。
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が追加されています!
DSのIP Listに別のIPを追加して再度実行してみるとどうでしょう。
$ 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]
ちゃんと更新されていますね!
後はこのIP Setを使ってWACLを作成すれば、特定IPだけ許可・拒否するということが出来るようになります。
このスクリプトではIP Setを作るだけなので、料金は発生しません。
最後に
まだまだ荒削りなスクリプトですが、DSとAWSとの連携が簡単にできるようになります。
今後の開発に期待です!!