Deep Security ~ AWS WAF連携ツールがDSMに対応しました


こんにちは、ひろかずです。

[前回](http://qiita.com/fnifni/items/82a9ee6e6de7e8ea9066)、Deep Security ~ AWS WAF連携ツールを評価しましたが、DSaaSに対する連携という制限が付いていました。

2016年2月20日にアップデートされ、インスタンスに構築したDeep Security Manager(以下、個別DSM)に対応したとのことなので、一筆書きます。

#参考
[Githubリポジトリ deep-security/aws-waf](https://github.com/deep-security/aws-waf)

#前提

- Deep Security Managerの導入が完了していること。
- ライセンスを投入していること。
- [前回](http://qiita.com/fnifni/items/82a9ee6e6de7e8ea9066)の内容を踏んでいること。
- [前回](http://qiita.com/fnifni/items/82a9ee6e6de7e8ea9066)起動したインスタンスが、連携先Deep Security Managerのポート4119に到達できること。

#工程
1. Deep Securty ~ AWS WAF連携ツールの更新
2. 動作確認

#1. Deep Securty ~ AWS WAF連携ツールの更新
[前回](http://qiita.com/fnifni/items/82a9ee6e6de7e8ea9066)、`a877db1`にロールバックしていたので、最新版の`0e4712e`に更新します。

```
$ git pull origin master
remote: Counting objects: 20, done.
remote: Total 20 (delta 1), reused 1 (delta 1), pack-reused 19
Unpacking objects: 100% (20/20), done.
From https://github.com/deep-security/aws-waf
 * branch            master     -> FETCH_HEAD
   46e3e5b..0e4712e  master     -> origin/master
Updating a877db1..0e4712e
Fast-forward
：
```
更新されていますね。

```
$ ll
合計 20
-rw-rw-r-- 1 ec2-user ec2-user 1081  2月 10 10:08 LICENSE
-rw-rw-r-- 1 ec2-user ec2-user 7060  2月 27 23:48 README.md
drwxrwxr-x 5 ec2-user ec2-user 4096  2月 27 23:48 dsawswaf
-rw-rw-r-- 1 ec2-user ec2-user   33  2月 10 10:08 requirements.txt
```
念のためにアップデート確認
pipの警告は置いておいて、特にアップデートは不要だったようですね。

```
$ sudo pip install -r requirements.txt
You are using pip version 6.1.1, however version 8.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Requirement already satisfied (use --upgrade to upgrade): netaddr>=0.7.18 in /usr/local/lib/python2.7/site-packages (from -r requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): boto3>=1.2.1 in /usr/local/lib/python2.7/site-packages (from -r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/dist-packages (from boto3>=1.2.1->-r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): futures<4.0.0,>=2.2.0 in /usr/local/lib/python2.7/site-packages (from boto3>=1.2.1->-r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): botocore<1.4.0,>=1.3.0 in /usr/lib/python2.7/dist-packages (from boto3>=1.2.1->-r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): python-dateutil<3.0.0,>=2.1 in /usr/lib/python2.7/dist-packages (from botocore<1.4.0,>=1.3.0->boto3>=1.2.1->-r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.10 in /usr/lib/python2.7/dist-packages (from botocore<1.4.0,>=1.3.0->boto3>=1.2.1->-r requirements.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): six in /usr/lib/python2.7/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.4.0,>=1.3.0->boto3>=1.2.1->-r requirements.txt (line 2))
```

#2. 動作確認
[readme.md](https://github.com/deep-security/aws-waf)を見ると、個別DSMへの連携には `-m` オプションで対向の個別DSMを指定して、 `--dsm-port` でポートを指定する必要がありそうですね。
![help.png](https://qiita-image-store.s3.amazonaws.com/0/46611/85284a8b-ef65-bde4-52b3-6f7447a2f0ba.png "help.png")

では、実行してみます。
期待値は、[前回](http://qiita.com/fnifni/items/82a9ee6e6de7e8ea9066)同様に個別DSMに登録されているIPリストとAWS WAFのCondition(IP List)一覧の表示です。

```
$ python ip_list_to_set.py --list -m xxx.xxx.xxx.xxx --dsm-port 4119 -u webapi -p xxxxxxxx

Available Deep Security IP Lists
================================
---	 No IP lists available

Available AWS WAF IP Sets
=========================
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test3
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	myIP
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test2
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test
```

そんなもんはねぇ！と言われてしまいました。
`ip_list_to_set.py` を見ると、以下の引き数処理が追加されています。

```
parser.add_argument('--ignore-ssl-validation', action='store_true', dest='ignore_ssl_validation', required=False, help='Ignore SSL certification validation. Be careful when you use this as it disables a recommended security check. Required for Deep Security Managers using a self-signed SSL certificate')
```

そう言えば、個別DSMはデフォルトで自己署名証明書が使用されています。
個別DSMに対しては、このオプションが必要なようですね。

では、もう一度

```
$ python ip_list_to_set.py --list -m xxx.xxx.xxx.xxx --dsm-port 4119 -u webapi -p xxxxxxxx --ignore-ssl-validation
***********************************************************************
* IGNORING SSL CERTIFICATE VALIDATION
* ===================================
* You have requested to ignore SSL certificate validation. This is a less secure method
* of connecting to a Deep Security Manager (DSM). Please ensure that you have other
* mitigations and security controls in place (like restricting IP space that can access
* the DSM, implementing least privilege for the Deep Security user/role accessing the
* API, etc).
*
* During script execution, you'll see a number of "InsecureRequestWarning" messages.
* These are to be expected when operating without validation.
***********************************************************************
/home/ec2-user/aws-waf/dsawswaf/requests/packages/urllib3/connectionpool.py:789: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)

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	awswaf

Available AWS WAF IP Sets
=========================
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test3
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	myIP
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test2
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test
/home/ec2-user/aws-waf/dsawswaf/requests/packages/urllib3/connectionpool.py:789: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
```

なんかすごく警告文がずらずら出ますが、情報は取れましたね。

では、`21	awswaf` をAWS WAFのConditionに追加しましょう。
まずは、dryrun。
大丈夫そうですね。（自己署名証明書に起因する警告は省略しました）

```
$ python ip_list_to_set.py -d 21 -m xxx.xxx.xxx.xxx --dsm-port 4119 -u webapi -p xxxxxxxx --ignore-ssl-validation --dryrun
:
***********************************************************************
* DRY RUN ENABLED. NO CHANGES WILL BE MADE
***********************************************************************
Will request the creation of [awswaf]
:
```

では、実行。
できたみたいですね。

```
$ python ip_list_to_set.py -d 21 -m xxx.xxx.xxx.xxx --dsm-port 4119 -u webapi -p xxxxxxxx --ignore-ssl-validation
:
Converted 4 IP List entries to 4 IP Set entries
Updated IP Set [awswaf] with ID [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]
:
```
できました。

```
python ip_list_to_set.py --list -m xxx.xxx.xxx.xxx --dsm-port 4119 -u webapi -p xxxxxxxx --ignore-ssl-validation
:
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	awswaf

Available AWS WAF IP Sets
=========================
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test3
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	myIP
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test2
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	test
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx	awswaf ★★★
:
```

#おまけ
Deep Security 側のIPリストに空行が入っていると処理ができないようです。
IPリストは、コメントや空行が入ってないものを使用しましょう。

今日はここまでです。
お疲れ様でした。