Deep SecurityのAWS WAF連携「SQLi/XSS連携」を試してみる

2016.06.15

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

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

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

そんなDSですが、更なるAWSとの連携を目指してこんなリポジトリを公開されています。
今回はその中で、AWS WAFとの連携スクリプトを試してみます。

DSのAWS WAF連携

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

  • IP List
    • Deep Securityが持っている「IP List」をAWS WAFの「IP Set」に渡す
  • SQL Injection (SQLi)
    • SQLi対策用のmatch conditionを作成する
    • 作成したmatch conditionをAWS WAFに渡す
  • cross site scripting (XSS)
    • XSS対策用のmatch conditionを作成する
    • 作成したmatch conditionをAWS WAFに渡す

前回はIP List連携を試したので、今回はその中でSQLiとXSSの連携を試してみます。

試してみた

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

2016/6/14現在、絶賛開発中です。 仕様変更されている可能性が高いので検証してから使うようにお願いします。

前準備

こちらの記事と同様の手順です。

制約

スクリプトを実行する上で幾つか制約があります。

  • 保護対象のコンピュータはAWSアカウント連携しておかないと認識されない
    • コンピュータの登録でIPアドレス/ホスト名での追加ではスクリプト側で認識してくれません
  • CloudFrontの後ろにELBがある構成のみサポート
    • 直接EC2の場合は現状サポート対象外です

Trend_Micro_Deep_Security_Manager 2

SQLi/XSS

大きく分けて2つの機能があります。

  • 一般的なSQLi/XSS対策のコンディション作成
  • EC2インスタンスにルール適用が必要かどうか分析し、ルール作成

です。

SQLインジェクションもXSSもコマンドはほぼ同じです。
python ds-to-aws-waf.py sqlipython ds-to-aws-waf.py xssの違いだけです。
今回はSQLインジェクションのみを試してみます。

Web ACLを作成は出来ないので、予め作成してCloudFrontに設定しておきます。

AWS_WAF 5

まずは、コンディションの作成を行います。
コンディション作成は--create-matchで行います。
こちらを実行すると、AWS WAFにSQLiのコンディションが追加されます。
--dryrunオプションが用意されていますので、本実行の前に試しておきましょう。

$ python ds-to-aws-waf.py sqli -u ユーザ名 -p パスワード -t テナント名 --create-match --dryrun
***********************************************************************
* DRY RUN ENABLED. NO CHANGES WILL BE MADE
***********************************************************************
Would request an AWS WAF change token to create a new SQLi match set
   SQLi match set will contain;
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'URL_DECODE', 'FieldToMatch': {'Data': 'string', 'Type': 'URI'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'URL_DECODE', 'FieldToMatch': {'Data': 'string', 'Type': 'QUERY_STRING'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'HTML_ENTITY_DECODE', 'FieldToMatch': {'Data': 'string', 'Type': 'QUERY_STRING'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'LOWERCASE', 'FieldToMatch': {'Data': 'string', 'Type': 'QUERY_STRING'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'URL_DECODE', 'FieldToMatch': {'Data': 'string', 'Type': 'BODY'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'HTML_ENTITY_DECODE', 'FieldToMatch': {'Data': 'string', 'Type': 'BODY'}}}
      {'Action': 'INSERT', 'SqlInjectionMatchTuple': {'TextTransformation': 'LOWERCASE', 'FieldToMatch': {'Data': 'string', 'Type': 'BODY'}}}

実行すると、どのようなコンディションが生成されるかが分かります。
問題ないようなので、--dryrunを外して実行します。

$ python ds-to-aws-waf.py sqli -u ユーザ名 -p パスワード -t テナント名 --create-match
Updated SQLi match set; Deep Security SQLi Guidance

すると、実行前は存在しなかったSQLi用のコンディションが追加されていることが分かります。

AWS_WAF

AWS_WAF 2

これでSQLiの一般的なコンディションの作成は完了です。
これに加え、WAFで保護すべきかを判定してルールの作成まで行うことが出来ます。
「侵入防御」の推奨設定検索の結果を元に判定を行いますので、予めコンピュータの推奨設定を検索しておきましょう。

Trend_Micro_Deep_Security_Manager_?

対象インスタンスの判定は、-lオプションで行います。
AWSアカウント内に大量にインスタンスがある場合は、リージョンやTagで絞込が可能です。
以下は、東京リージョン(ap-northeast-1)でNameタグが「DSintegration」のもののみを表示する例です。

$ python ds-to-aws-waf.py sqli -u ユーザ名 -p パスワード -t テナント名 -l -r ap-northeast-1 --tag Name=DSintegration
Requesting information from Deep Security about your deployment
************************************************************************
Completed recommendation phase
   Instance Recommendation  Suggested WACL
   i-01234567   True    00000000-1111-2222-3333-444444444444
************************************************************************

RecommendationTrueになっているとWAFでの保護が必要ということになります。
Falseの場合は、SQLインジェクションの脆弱性が存在しないため、保護は不要です。

AWS WAFルールを作成するには、-lオプションに加えて、--create-ruleオプションを付けて実行します。

$ python ds-to-aws-waf.py sqli -u ユーザ名 -p パスワード -t テナント名 -l -r ap-northeast-1 --tag Name=DSintegration --create-rule
Requesting information from Deep Security about your deployment
************************************************************************
Completed recommendation phase
   Instance Recommendation  Suggested WACL
   i-01234567   True    00000000-1111-2222-3333-444444444444
************************************************************************
Successfully created rule []
Successfully updated WACL [00000000-1111-2222-3333-444444444444]

すると、SQLi用のルールが追加されていることが分かります。

AWS_WAF 3

また、Web ACLにルールが適用されていることも確認できます!

AWS_WAF 4

これでSQLiについては完了ですが、同様にXSSについても行えば、設定ができます。

最後に

AWS WAFのルールを自分で作るのはなかなか骨が折れる作業ですが、DS連携で簡単に設定ができます。 今後AWS WAFの機能が追加されると更に有用なツールになると思います!期待しております!!