AWS WAF
AWS Black Belt Tech Webinar 2015
アマゾン ウェブ サービス ジャパン株式会社
荒⽊靖宏
アジェンダ
•
AWS WAF
•
General Overview
•
位置付け
AWS WAF
(Web Application
Firewall)
Why AWS WAF?
•
アプリ脆弱性
Good users
Bad guys
Web server
Database
Exploit
Why AWS WAF?
•
Abuse
Good users
Bad guys
Why AWS WAF?
•
Application DDoS
Good users
Bad guys
What is AWS WAF?
•
Application DDoS
Good users
Bad guys
Web server
Database
AWS
What is AWS WAF?
•
Application DDoS
Good users
Bad guys
Web server
Database
AWS
WAF
AWS WAF rules:
1: BLOCK from
悪者
.
What is AWS WAF?
•
Application DDoS
Good users
Bad guys
Web server
Database
AWS
WAFとは?
•
Web Application Firewall (WAF) は
、
HTTPトラフィックを
フィルタなどの制御をするためのアプライアンスや
、
サーバプ
ラグインなどのルールセットのこと
。
•
WAFは以下4つで提供されることが多い
•
Pure Play:
スタンドアローンのアプライアンスやソフトウェア
•
CDN: Content Delivery Network
へのバンドル
•
Load Balancer:
ロードバランサへのバンドル
•
Universal Threat Manager (UTM):
統合セキュリティ管理
なぜWAFを使うのか
•
WAFは
、
Webサイトやアプリケーションが
、
攻撃されてダウン
したりデータが流出したりすることがないように⼿助けをする
•
WAF
の⼀般的なユースケース
•
SQL Injection (SQLi) 、Cross Site Scripting (XSS)
対策
•
Web
クローラ、スクレイピング等の
BOT
対策
•
DDoS緩和
(HTTP/HTTPS floods)
•
ガートナーのレポートによると
、
導⼊理由の25-30%はPCI-DSS対応のため
AWS WAF
カスタムルールに
よるフィルタ
SQLインジェクション
XSSなどの
、
これまでのWAF
これまでのWAF
•
ルールが増えるにつれ誤検知(
False positive
)
これまでのWAF
これまでの WAF
•
導⼊と維持コストが⾼すぎる
•
プロフェッショナルサービス
が必要になる
お客様の要望に応じてAWSが実現したWAF
•
実践的なセキュ
リティモデルを
簡単に導⼊
•
フレキシブルに
ルールをカスタ
マイズできる
•
DevOpsとの統
合
それらを
AWS
の「使っただけ」の⽀払い
AWS WAF
•
Amazon
CloudFrontとの併⽤
•
クラウドベースの防御
•
セルフサービス
、
簡単なデプロイ
、
使った分だけのお⽀払い
•
オートスケール
•
DevOpsと相性がいい
•
“Do it yourself”
AWS WAFとMarketplaceの併⽤について
Marketplace WAFs
•
EC2
インスタンス上で動作
•
マネージドサービス
、BYOL、1
時間単
位など様々
•
スケールさせるには別途設定
、
変更点
、
特別作業等必要
CloudFront Edge Location EC2 users hackers
bad bots scrapingsite SQL Injection, XSS, other attacks legitimate traffic
悪意をもったトラフィックを含めて
HTTP/HTTPS
であれば通る
ELBCloudFront without WAF
S3
AND/ OR
Customer On Premises Environment
これまでのWAF配置
CloudFront Edge Location users hackersbad bots scrapingsite SQL Injection,
XSS, other attacks legitimate
traffic
WAF on EC2は
ELB
でサンドイッチする
。
結果
、
複雑になり
、
レイテンシ
も上昇する
EC2 ELB WAF ELB ELB Sandwich Customer On Premises EnvironmentOrigin Origin Storage WAF
CloudFront with AWS WAF
CloudFront Edge Location WAF users hackersbad bots scrapingsite SQL Injection, XSS, other attacks legitimate traffic
不正なトラフィックはエッジロケーションにある
WAF
でブロック
。
•
AWS
外のリソースでも
OK
•
動的なコンテンツでも静的なコンテンツでも
OK
EC2 ELB S3 AND/ OR Customer On Premises EnvironmentAWS WAF Components
1.
Web Access Control Lists (WebACL)
2.
条件
– IP
アドレス
/
⽂字列
/ SQL
インジェクション
3.
ルール
-
順位
/
アクション
4.
AWS
リソース
(
現状ではCloudFront)
5.
レポート (リアルタイムのメトリクスとサンプリングされたリ
AWS WAF:
WebACL
•
WebACLsは
、
condition, rules, action
で構成
•
WebACLsは⼀つあるいは複数の
CloudFront distributionに適⽤
•
WebACLsはリアルタイムのメトリクス
と
、
サンプリングされたリクエストを
ルールごとに表⽰
AWS WAF:
Conditions
•
Conditionsはwebリクエストを判定するコン
ポーネント
•
Conditionsでは⼀致判定を⾏う
•
IPアドレス i.e., /8, /16, /24, /32
•
⽂字列, i.e., URI, クエリ⽂字列, ヘッダ, etc.
•
SQLインジェクション, i.e., looks for invalid
SQL statements
Match conditions: IPSets
CIDR はオクテット毎の設定:
•
192.0.0.0/8 – Matches 192.*.*.*
•
192.168.0.0/16
•
192.168.32.0/24
•
192.168.32.64/32 – IPアドレスべた指定は/32を使う
制限について
l
IPSetあたり
1,000 CIDR
まで
l
webACLあたり
、CIDR
はトータルで
10,000
まで
Match conditions: Strings and bytes
Webリクエストの内容と照合する
Host: www.example.com
User-Agent: Mozilla/5.0 (Macintosh; … Accept: image/png,image/*;q=0.8,*/ *;q=0.5
Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate
Referrer: http://www.example.com/ Connection: keep-alive
AWS
WAF
RAW request headers
CloudFront
Check: Header “Referrer”
Match Type: Contains Match: “example.com” Action: ALLOW
Rule
String match condition
Match conditions: Strings and bytes
Host: www.example.com User-Agent: badbot Accept: image/png,image/*;q=0.8,*/ *;q=0.5 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflateReferrer: http://www.example.com/ Connection: keep-alive
AWS
WAF
RAW request headers
CloudFront
Check: Header “User-Agent”
Match Type: Contains Match: “badbot”
Action: BLOCK
Rule
String match condition
Match conditions: Strings and bytes
“transforms”をつかってちょっとした変更には対応可能
Host: www.example.com User-Agent: bAdBoT Accept: image/png,image/*;q=0.8,*/ *;q=0.5 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflateReferrer: http://
www.InTeRnEtkItTiEs.com/
Connection: keep-alive
AWS
WAF
RAW request headers
CloudFront
Check: Header “User-Agent”
Transform: To lower Match Type: Contains Match: “badbot”
Action: BLOCK
Rule
String match condition
Match conditions: Strings and bytes
条件
1.
Contains
2.
Exact
3.
Begins with
4.
Ends with
5.
Contains word
Transformation
1.
Convert to lowercase
2.
HTML decode
3.
空⽩除去
4.
Simplify command line
5.
URL decode
Match conditions: Strings and bytes
悪意のあるバイナリの発⾒にはBase64エンコードが使える
“iVBORw0KGgoAAAAN”
8950 4e47
0d0a 1a0a
0000 000d
bad.bin
1. Select binary file
2. Base64 encode
3. Set match criteria
$> base64 bad.bin
iVBORw0KGgoAAAAN
Match conditions: SQLインジェクション
query strings
を
URL decode
後にチェックする
SQLiについては
AWS WAFが定義
しているコードの
Match conditions: SQLインジェクション
/login?x=testʼ UNION ALL select NULL
--クエリ文字列のチェックには
URL decode
AWS WAF:
Rules
•
ルールはあらかじめ決められたcondition
とアクションのセット
•
利⽤可能なアクション
•
Block
•
Allow
•
Count
•
ルールは論理的には結合している
(AND)
•
ルールは複数のWebACLsと適⽤される
Reuse conditions
•
web ACL
の再利⽤イメージ
CloudFront distributions Web ACL #1 Web ACL #2 Shared blacklistAWS WAF:
Resource
•
WebACLsはCloudFront distributionsに適⽤される
•
ルールは再利⽤できる:ひとつのWebACLを全ての
distributionsに使える
AWS WAF:
Reporting and Logs
•
Real-Time Metrics (CloudWatch):
•
ブロック
•
許可
•
カウントのみ
–
分析のためのルールはすぐに適
⽤される
–
時間区切りはグラフをスライド
させて指定できる
•
WAFのログはCloudFrontと統
合
AWS WAF:
Request Process
HTTP/HTTPSのリク エストがCloudFront に発せられる WAFはリクエストを レビューし、CFに対 してallow/denyを伝 える CFはWAFの対象かど うかを判定 WAFはメトリクスを Cloudwatchに送る。 利⽤者はルールをいつ でも変更可 CloudFront経由でコンテンツ配送 エラーページがCloudFrontから戻され る費⽤について
⽉間の費⽤例
–
テスト⽤ (1 rule): $6
–
Small site (6 rules, 58M views): $46
ネガティブ
•
多くの本番はこちら
•
ALLOW by default
•
BLOCK known-bad threats
ルール戦略
ポジティブ
•
制限実⾏時が多い
•
BLOCK by default
•
ALLOW known-good
Examples
•
BLOCK マルウェア配布
IP
レンジ
•
BLOCK “{;}”
Examples
•
ALLOW オフィスの
IP
レンジ
•
ALLOW referrer header
緩和戦略
•
Static policies –
よく知られた⼿法の脅威むけ
•
Reactive policies –
⼿法が変化する脅威向け
AWS WAF
パートナー
カウント機能を使った脅威発⾒
Count mode
Alert on Amazon CloudWatch metrics
Get sampled requests
これらをあわせた典型的な使い⽅
•
Ruleの順番に注意!
1.
WhiteListed IPs – ALLOW
2.
BlackListed IPs – BLOCK
3.
BlackListedSignatures – BLOCK
4.
SQLInjection – COUNT
5.
SuspiciousActivity - COUNT
レポート⾃動化の流れ
CloudWatch Alarm SNS Topic AWS Lambda AWS WAFOperator
SNS Topic1. Alarm on count 2. Send
Amazon SNS notification 4. Format sampled requests 5. Get sampled requests 6. Send email notification
AWS WAF:
End to End Flow
1)
WebACLの作成
2)
Conditions (IP, string match, SQL)作成
3)
RulesとActions (order, rule, action)作成
4)
WebACLをCloudFrontに適⽤
AWS WAF:
Update WAF resources via API
•
トークンベースで処理:
変更⽤トークン取得:
WAF
リソースを変更するための⼀回
限りのトークンを取得
変更のためにトークン使⽤
ステータス確認のためにトークン使⽤: INSYNCは
、
変更中で
あることを⽰す
1
2
3
GetChangeToken
$ aws waf get-change-token
{
"ChangeToken”:"d4c4f53b-9c7e-47ce-9140-0ee5765d6bff"
Create*
$ aws waf
create-web-acl
--name Test
--metric-name Test
--default-action Type=ALLOW
--change-token d4c4f53b-9c7e-47ce-9140-0ee5765d6bff
GetChangeTokenStatus
$ aws waf
get-change-token-status
--change-token d4c4f53b-9c7e-47ce-9140-0ee5765d6bff
{
"ChangeTokenStatus":{
”ChangeToken":"
d4c4f53b-9c7e-47ce-9140-0ee5765d6bff
",
“Status”:
"PROVISIONED", OR
"PENDING", OR
"INSYNC"
]
},
}
Update*Set
$ aws waf update-ip-set --ip-set-id --change-token d4c4f53b-9c7e-47ce-9140-0ee5765d6bff --updates [ {"Action": "INSERT", "IPSetDescriptor": {"Type": "IPV4", "Value": "192.168.0.0/16"} }, {"Action": "INSERT", "IPSetDescriptor": {"Type": "IPV4", "Value": "192.168.5.0/24"} } ]GetSampledRequests
GetSampledRequestsは
、
指定された時間内(最⼤
3
時間前まで)
に⾏われた最⼤
500
リクエストをサンプリングした情報を得るのに
つかう
。
{
"
MaxItems
":
number
,
"
RuleId
": "
string
",
"
TimeWindow
": {
"
EndTime
":
number
,
"
StartTime
":
number
},
"
WebAclId
": "
string
"
}
WAF Example:
A Technical Implementation
WAF Example:
Blocking Bad Bots
•
必要なもの
•
IPSet
: ブロックするIPアドレスリスト
•
Rule
: IPSetにマッチしたら
、
ブロックする
•
WebACL: デフォルトではリクエストは許可
。
Ruleに含まれる
•
加えて必要なのは…
•
悪いボットを検出する⽅法
•
悪いボットのIPアドレスをIPSetに追加する⽅法
WAF Example:
悪いボットの検出
•
robots.txt にスクレイプ禁⽌
条項を書いておく
•
スクレイプ禁⽌コンテンツへの
リンクを隠しリンクとして書い
ておく
•
$ cat webroot/robots.txt
•
User-agent: *
•
Disallow: /honeypot/
•
<a href="/honeypot/"
class="hidden"
aria-hidden="true">click me</a>
WAF Example: 悪いボットのブラックリスト
•
悪いボット (robots.txtを無視するも
の)は隠しリンクをリクエストする
•
トリガスクリプトが
•
ソースIPアドレスを検出
•
トークンを変更
•
ソースIPアドレスをIPSetのブ
ラックリストに追加
•
WebACLは続くリクエストをブロッ
ク
$ aws --endpoint-url https://carrot.amazon.com/ carrot get-change-token {
"ChangeToken": "acbc53f2-46db-4fbd-b8d5-dfb8c466927f”
}
$ aws --endpoint-url https://
carrot.amazon.com/ carrot update-ip-set
--cli-input-json '{ "IPSetId": ”<<IP SET ID>>", "ChangeToken":
"acbc53f2-46db-4fbd-b8d5-dfb8c466927f", "Updates": [ { "Action": "INSERT", "IPSetDescriptor": { "Type":
"IPV4", "Value": ”<<SOURCE IP>>/32" } } ] }’ {
"ChangeToken": "acbc53f2-46db-4fbd-b8d5-dfb8c466927f”