待望のAPI Gateway用のWAFマネージドルールがF5から出たので使ってみた!

API Gatewayに対してAWS WAFを直接利用できるようになりました、そこで利用するのに最適なWAFマネージドルールがF5からリリースされたので早速使ってみました!API Gatewayを利用する環境ではいい選択肢になると思います!
2019.03.26

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

こんにちは、臼田です。

ついに来ました!先日API GatewayでAWS WAFを直接利用できるようになりましたが、そこで真価を発揮するAWS WAFマネージドルールがF5さんからリリースされました!

AWS Marketplace: F5 Rules for AWS WAF - API Security Rules

早速見ていきましょう。

概要

上記マーケットプレイスのページでは下記のように書かれています。

Protects against API attacks, web attacks (such as XML external entity attacks) and sever side request forgery. The rule set includes support for XML and JSON payloads, and common web API frameworks.

XMLやJSONペイロードや、一般的なWeb APIフレームワークがサポートされ、XXEやSSRFなどのAPIサービスに対する攻撃を防ぐことが期待できます。

何が嬉しいの?

これまで各社からリリースされていたマネージドサービスは一般的なWebアプリケーションに対する防御が想定されていたため、例えばApacheやWordPress等のミドルウェアに対する攻撃の対策も含まれていました。

保護対象がこれらを利用したサービスであった場合には有用ですが、API Gateway + Lambdaのような環境ではそのルールがフルに役に立つ状況ではありませんでした。

今回のルールは、逆にそのようなものは省き、APIサービスでよく利用されるXMLやJSONペイロード等に特化した防御ルールが多数含まれていると考えられるので、それが正しければまさにAPI Gatewayに最適なマネージドルールが提供されたということになります。

やってみた

早速やってみます。

まずマネージドルールをSubscribeしてWebACLに適用する必要があります。これについては下記で説明していますので省略します。不明な方はこちらを参照してください。

【新機能】AWS WAFマネージドルールを使ってWordPressに対する攻撃を防いでみた #reinvent

次にAPI Gatewayを作成します。検証用のためMOCKを利用したサンプルを利用します。

API Gatewayの新規作成にて下記のように「APIの例」を選択して作成します。

そのままデプロイします。

新しいステージを作成してデプロイします。

ステージエディターにてWebACLを選択できるので、作成したものを適用して「変更を保存」します。

作成されたURLにアクセスすることによりアプリケーションが動くことが確認できます。

それでは早速攻撃してみます。

今回はXXEを試してみたいと思います。みんなの徳丸先生がちょうどいいサンプルを書いてくださっていますので、これを利用してみます。

$ curl -i -X POST \
>   https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/test/pets \
>   -H 'cache-control: no-cache' \
>   -H 'content-type: application/xml' \
>   -d '<?xml version="1.0" encoding="utf-8" ?>
> <!DOCTYPE foo [ > <!ENTITY credential SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/test-role">
> ]>
> <user>
> <name>徳丸浩</name>
> <address>&credential;</address>
> </user>'
HTTP/2 403
date: Tue, 26 Mar 2019 11:49:01 GMT
content-type: application/json
content-length: 23
x-amzn-requestid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x-amzn-errortype: ForbiddenException
x-amz-apigw-id: xxxxxxxxxxxx

{"message":"Forbidden"}

ステータス403のForbiddenということで、AWS WAFでブロックしていることが確認できました。

マネジメントコンソールからも下記のようにブロックが確認できました。

まとめ

API GatewayにAWS WAFが適用できるようになったことに合わせ、マネージドルールも出てきました!

これによりAPI Gatewayに対する攻撃を守る手段が増えました。

API Gatewayを利用している場合には、ぜひ検討してみてはいかがでしょうか?