はじめに
先日、 CloudFrontの定額料金プラン(Flat-rate pricing plan) について調べる機会がありました。AWSドキュメントを読み込んでいると、以下の制約についての記述を発見しました。
ディストリビューションがウェブ ACL の Firewall Manager サービスを有効にしている。Firewall Manager は、CloudFront ディストリビューションの WebACL を料金プランで管理しません。
引用元:CloudFront 定額料金プラン - AWS Documentation
「つまり、CloudFront定額料金プランを選択したリソースは、Firewall Manager(FMS)で保護できないってこと??」
組織のセキュリティ統制としてFMSを利用している環境では、これが事実であれば運用上の大きな課題になります。
そこで今回は、実際にFirewall Manager環境下でCloudFront定額料金プランを選択したリソースを作成し、保護できるのかを検証しました。その結果と対策をシェアします。
TL;DR(結論)
-
結論:Firewall ManagerでCloudFront定額料金プランを選択したリソースを保護することはできない。
-
対策: Firewall Managerを用いて全社的なWAF保護を強制させたい組織は、SCP(サービスコントロールポリシー)やIAMポリシーを使用して、CloudFront定額料金プランを契約できないように制限する必要がある。
CloudFront定額料金プランとは
本題に入る前に、CloudFront定額料金プランについて簡単におさらいします。
CloudFront 定額料金プランは、Amazon CloudFront グローバルコンテンツ配信ネットワーク (CDN) と複数の AWS サービスおよび機能を組み合わせたもので、超過料金なしの月額料金で提供されます。
定額料金プランでは、月額料金に次の内容が含まれます。
・ CloudFront CDN
・ AWS WAF と DDoS 保護
・ ボット管理と分析
・ (中略)
引用元:定額料金プラン - Amazon CloudFront の料金 - Amazon CloudFront
このプランの最大の特徴は、月額固定料金の中にAWS WAFの利用枠があらかじめ組み込まれている点です。無料プラン(月額0 USD)でも、以下の3つのAWSマネージドルールグループが利用できます。
-
Core rule set(コアルールセット)
-
Known bad inputs(既知の不正な入力)
-
Amazon IP reputation list(Amazon IP 評価リスト)
検証内容
それでは、FMSが有効な環境でこのプランを選択するとどうなるのかを検証します。
【検証環境の前提】
-
AWS Organizationsによるマルチアカウント環境で、Firewall Managerの初期セットアップは完了済み。
-
CloudFrontディストリビューションに対するFMSのセキュリティポリシー(WAFV2の自動アタッチ)を以下のように作成。
{
"Policy": {
"PolicyId": "************",
"PolicyUpdateToken": "************",
"PolicyName": "************",
"PolicyDescription": "",
"SecurityServicePolicyData": {
"Type": "WAFV2",
"ManagedServiceData": "{\"preProcessRuleGroups\":[{\"ruleGroupType\":\"ManagedRuleGroup\",\"overrideAction\":{\"type\":\"NONE\"},\"sampledRequestsEnabled\":true,\"excludeRules\":[],\"managedRuleGroupIdentifier\":{\"managedRuleGroupName\":\"AWSManagedRulesSQLiRuleSet\",\"vendorName\":\"AWS\",\"versionEnabled\":null,\"version\":null,\"managedRuleGroupConfigs\":null}}],\"postProcessRuleGroups\":[],\"defaultAction\":{\"type\":\"ALLOW\"},\"customRequestHandling\":null,\"associationConfig\":null,\"tokenDomains\":null,\"customResponse\":null,\"type\":\"WAFV2\",\"overrideCustomerWebACLAssociation\":true,\"sampledRequestsEnabledForDefaultActions\":true,\"optimizeUnassociatedWebACL\":true,\"webACLSource\":\"DEFAULT\"}"
},
"ResourceType": "AWS::CloudFront::Distribution",
"ExcludeResourceTags": false,
"RemediationEnabled": true,
"DeleteUnusedFMManagedResources": false,
"IncludeMap": {
"ACCOUNT": [],
"ORG_UNIT": [
"ou-************"
]
}
}
}
検証結果
上記の環境で、CloudFrontコンソールから「定額料金プラン」を選択してディストリビューションを作成しました。
結果として、CloudFront定額料金プランを選択したCloudFrontディストリビューションは、Firewall ManagerによるWebACLの自動アタッチの対象外となり、保護されませんでした。
やはりドキュメントの記載通り、定額料金プランのWAF管理機能とFMSの機能は競合(あるいは仕様として除外)されてしまうようです。組織としてFMSによる統制(SQLiルールの強制適用など)を効かせたい場合、定額プランの利用はセキュリティの抜け穴になってしまいます。
SCPでCloudFront定額料金プランを選択できないようにする
セキュリティ統制を維持するためには、開発者が勝手に定額料金プランを選択できないようにブロックする必要があります。
CloudFrontの定額料金プランを利用開始する際、裏側では pricingplanmanager:CreateSubscription というアクションが実行されます。したがって、以下のSCP(Service Control Policy)をOrganizationsレベルで適用することで利用を制限できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyPricingPlanSubscription",
"Effect": "Deny",
"Action": "pricingplanmanager:CreateSubscription",
"Resource": "*"
}
]
}
【要注意】ブロック時のマネジメントコンソールの挙動
このSCPを適用した状態で、マネジメントコンソールから定額プランを選択して「Create distribution」を押下すると、以下のようなエラーが表示されます。
これを見ると、一見「CloudFrontディストリビューションの作成自体に失敗した」ように見えます。
しかし、CloudFrontのディストリビューション一覧を確認してみると……
なんと、サブスクリプション(定額プラン)の契約には失敗しつつも、従来の「従量課金(Pay-as-you-go)」としてディストリビューション自体は作成されているのです。
そして、従量課金プランで作成されたため、FMSの管理対象と認識され、後から自動的にFMSで定義したWebACLがアタッチされました。
コンソール上のエラー表示と実際の裏側の挙動(リソース作成は成功している)にギャップがあるため、開発者が混乱する可能性があります。「エラーが出たから作られていないだろう」と放置すると、意図しないリソースが残ってしまうため、この仕様には注意が必要です。
最後に
今回の検証で、 「Firewall Managerを利用している組織では、CloudFrontの定額料金プランによる保護は適用できない」 ことが明確になりました。
FMSを使って組織全体に特定のWAFルール(例:SQLi対策やIP制限など)を強制している環境では、統制の抜け穴を防ぐためにSCPによるpricingplanmanager:CreateSubscription のDeny設定を検討してみてください。また、コンソールから作成した際のエラー時の挙動には少し癖があるため、社内開発者へのアナウンスも併せて行うと親切かもしれません。
本記事が、AWS Organizations環境下でセキュリティ統制を設計・運用している方の参考になれば幸いです!



