AWS WAF v2 の AWS マネージドルールグループ一覧を AWS CLI で出力してみた
コンバンハ、千葉(幸)です。
AWS WAF v2 で使用できるルールグループには大きく以下の種類があります。
- カスタマーが作成・管理するルールグループ
- マネージドルールグループ
- AWS によるもの(AWS マネージドルールグループ)
- AWS Marketplace を通じてサブスクライブする 3rd パーティによるもの
- AWS FirewallManager や ShieldAdvanced など他のサービスにより管理されるルールグループ
今回スコープとするのは太字になっている AWS マネージドルールグループであり、その一覧は以下から確認できます。
このページの内容を確認すれば概ね事足りるのですが、もうちょっとまとまった形で一覧を引っこ抜けないかなと思い AWS CLI でいくつかのコマンドを試してみました。
- list-available-managed-rule-groups — AWS CLI 2.6.3 Command Reference
- list-available-managed-rule-group-versions — AWS CLI 2.6.3 Command Reference
- describe-managed-rule-group — AWS CLI 2.6.3 Command Reference
思ったようにキレイに抜けたわけではないですが、各コマンドの使い心地を記しておきます。
なお、今回使用した AWS CLI のバージョンは 2.4.6 です。AWS CloudShell での試行も問題ないことを確認済みです。
AWS WAF マネージドルールグループの対応リージョンに注意
先に AWS WAF マネージドルールグループの一覧を示したものが以下です。(この表は頑張って手動で作りました。こういう形で一覧で抜けるのが理想でした。)
カテゴリ | ルールグループ名 | 和名 | WCU | サブスクリプション料金 |
---|---|---|---|---|
ベースライン | AWSManagedRulesCommonRuleSet | コアルールセット | 700 | なし |
ベースライン | AWSManagedRulesAdminProtectionRuleSet | 管理者保護 | 100 | なし |
ベースライン | AWSManagedRulesKnownBadInputsRuleSet | 既知の不正な入力 | 200 | なし |
ユースケース固有 | AWSManagedRulesSQLiRuleSet | SQLデータベース | 200 | なし |
ユースケース固有 | AWSManagedRulesLinuxRuleSet | Linux OS | 200 | なし |
ユースケース固有 | AWSManagedRulesUnixRuleSet | POSIX OS | 100 | なし |
ユースケース固有 | AWSManagedRulesWindowsRuleSet | Windows OS | 200 | なし |
ユースケース固有 | AWSManagedRulesPHPRuleSet | PHPアプリケーション | 100 | なし |
ユースケース固有 | AWSManagedRulesWordPressRuleSet | WordPressアプリケーション | 100 | なし |
IPレピュテーション | AWSManagedRulesAmazonIpReputationList | Amazon IPレピュテーション | 25 | なし |
IPレピュテーション | AWSManagedRulesAnonymousIpList | 匿名IPリスト | 50 | なし |
Botコントロール | AWSManagedRulesBotControlRuleSet | Botコントロール | 50 | 10.00 USD/月 |
ATP | AWSManagedRulesATPRuleSet | アカウント乗っ取り防止 | 50 | 10.00 USD/月 |
ここで最下段のAWSManagedRulesATPRuleSet
は対応するリージョンが限定されています。東京リージョンや大阪リージョンでは 2022年5月時点で非対応です。対応していないリージョンを指定して AWS CLI コマンドを実行すると結果に現れてきませんのでご注意ください。
今回はすべて明示的にリージョンとしてus-east-1
を指定してコマンドを実行します。
「対象のリージョンで対応したもののみ一覧化したい」ということであれば、使用したいリージョンを指定してコマンド実行するのもよいでしょう。
AWS マネージドルールグループ一覧をリストする
まずはじめに試すのは以下コマンドです。
このコマンドでは以下の結果を得られます。
- ベンダー名
- マネージドルールグループ名
- バージョニングがサポートされているか(AWS マネージドルールグループの場合 null)
- ルールグループの説明
以下のようにオプションを指定して実行してみました。
aws wafv2 list-available-managed-rule-groups \ --scope REGIONAL \ --query 'ManagedRuleGroups[?VendorName==`AWS`] | [*].[Name]' \ --region us-east-1 \ --output text
AWS Marketplace で3rd パーティのマネージドルールグループをサブスクライブしていない限り結果に現れてくるのは AWS マネージドルールグループのみですが、明示的にVendorName
としてAWS
を指定してフィルタリングしてみました。
実行結果は以下のとおりです。
AWSManagedRulesCommonRuleSet AWSManagedRulesAdminProtectionRuleSet AWSManagedRulesKnownBadInputsRuleSet AWSManagedRulesSQLiRuleSet AWSManagedRulesLinuxRuleSet AWSManagedRulesUnixRuleSet AWSManagedRulesWindowsRuleSet AWSManagedRulesPHPRuleSet AWSManagedRulesWordPressRuleSet AWSManagedRulesAmazonIpReputationList AWSManagedRulesAnonymousIpList AWSManagedRulesBotControlRuleSet AWSManagedRulesATPRuleSet
AWS WAF マネージドルールグループの説明もつける
名前だけだと味気ないので、説明も付け合わせてみます。
aws wafv2 list-available-managed-rule-groups \ --scope REGIONAL \ --query 'ManagedRuleGroups[?VendorName==`AWS`] | [*].[Name,Description]' \ --region us-east-1 \ --output text
実行結果は以下のとおりです。ちょっと説明文が長いですね。
AWSManagedRulesCommonRuleSet Contains rules that are generally applicable to web applications. This provides protection against exploitation of a wide range of vulnerabilities, including those described in OWASP publications. AWSManagedRulesAdminProtectionRuleSet Contains rules that allow you to block external access to exposed admin pages. This may be useful if you are running third-party software or would like to reduce the risk of a malicious actor gaining administrative access to your application. AWSManagedRulesKnownBadInputsRuleSet Contains rules that allow you to block request patterns that are known to be invalid and are associated with exploitation or discovery of vulnerabilities. This can help reduce the risk of a malicious actor discovering a vulnerable application. AWSManagedRulesSQLiRuleSet Contains rules that allow you to block request patterns associated with exploitation of SQL databases, like SQL injection attacks. This can help prevent remote injection of unauthorized queries. AWSManagedRulesLinuxRuleSet Contains rules that block request patterns associated with exploitation of vulnerabilities specific to Linux, including LFI attacks. This can help prevent attacks that expose file contents or execute code for which the attacker should not have had access. AWSManagedRulesUnixRuleSet Contains rules that block request patterns associated with exploiting vulnerabilities specific to POSIX/POSIX-like OS, including LFI attacks. This can help prevent attacks that expose file contents or execute code for which access should not been allowed. AWSManagedRulesWindowsRuleSet Contains rules that block request patterns associated with exploiting vulnerabilities specific to Windows, (e.g., PowerShell commands). This can help prevent exploits that allow attacker to run unauthorized commands or execute malicious code. AWSManagedRulesPHPRuleSet Contains rules that block request patterns associated with exploiting vulnerabilities specific to the use of the PHP, including injection of unsafe PHP functions. This can help prevent exploits that allow an attacker to remotely execute code or commands. AWSManagedRulesWordPressRuleSet The WordPress Applications group contains rules that block request patterns associated with the exploitation of vulnerabilities specific to WordPress sites. AWSManagedRulesAmazonIpReputationList This group contains rules that are based on Amazon threat intelligence. This is useful if you would like to block sources associated with bots or other threats. AWSManagedRulesAnonymousIpList This group contains rules that allow you to block requests from services that allow obfuscation of viewer identity. This can include request originating from VPN, proxies, Tor nodes, and hosting providers (including AWS). This is useful if you want to filter out viewers that may be trying to hide their identity from your application. AWSManagedRulesBotControlRuleSet AWS WAF Bot Control offers you protection against automated bots that can consume excess resources, skew business metrics, cause downtime, or perform malicious activities. Bot Control provides additional visibility through Amazon CloudWatch and generates labels that you can use to control bot traffic to your applications. AWSManagedRulesATPRuleSet Account takeover prevention provides protection for your login page against stolen credentials, credential stuffing attacks, brute force login attempts, and other anomalous login activities. With account takeover prevention, you can prevent unauthorized access that may lead to fraudulent activities, or inform legitimate users to take a preventive action.
AWS マネージドルールグループのバージョンの取得
続いて試すのは以下コマンドです。
ここではマネージドルールグループごとに以下の情報を取得できます。
- バージョン名
- バージョン更新日時
このコマンドでは対象として単一のマネージドルールグループを指定する必要があります。先ほどルールグループの一覧を取得する術を確認できたため、結果を一つずつ渡してループ処理を行う形式にします。
aws wafv2 list-available-managed-rule-groups \ --scope REGIONAL \ --query 'ManagedRuleGroups[?VendorName==`AWS`] | [*].[Name]' \ --region us-east-1 \ --output text \ | while read group; do echo "## $group" aws wafv2 list-available-managed-rule-group-versions \ --scope=REGIONAL \ --vendor-name AWS \ --name $group \ --limit 20 \ --query 'Versions[].[Name,LastUpdateTimestamp]' \ --region us-east-1 \ --output table done
実行結果は以下のとおりです。
## AWSManagedRulesCommonRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_2.0 | 2022-01-10T22:22:15.078000+09:00 | | Version_1.2 | 2021-10-27T18:17:25.968000+09:00 | | Version_1.1 | 2021-10-25T22:08:53.586000+09:00 | | Version_1.0 | 2021-10-05T22:30:24.892000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesAdminProtectionRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_1.1 | 2021-10-25T21:17:54.937000+09:00 | | Version_1.0 | 2021-10-05T23:30:18.861000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesKnownBadInputsRuleSet ------------------------------------------------------ | ListAvailableManagedRuleGroupVersions | +---------------+------------------------------------+ | Version_1.14 | 2022-04-01T02:09:09.501000+09:00 | | Version_1.13 | 2022-03-31T21:45:58.085000+09:00 | | Version_1.12 | 2022-03-31T10:14:42.020000+09:00 | | Version_1.9 | 2022-01-28T16:25:38.837000+09:00 | | Version_1.7 | 2021-12-18T09:30:45.673000+09:00 | | Version_1.8 | 2021-12-18T08:11:00.272000+09:00 | | Version_1.6 | 2021-12-14T15:45:13.297000+09:00 | | Version_1.5 | 2021-12-12T02:36:54.585000+09:00 | | Version_1.4 | 2021-12-11T17:21:58.277000+09:00 | | Version_1.3 | 2021-12-11T00:35:32.614000+09:00 | | Version_1.2 | 2021-12-10T16:57:12.988000+09:00 | | Version_1.1 | 2021-10-26T00:50:30.815000+09:00 | | Version_1.0 | 2021-10-05T22:47:59.041000+09:00 | +---------------+------------------------------------+ ## AWSManagedRulesSQLiRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_2.0 | 2022-01-10T22:46:01.029000+09:00 | | Version_1.1 | 2021-10-25T22:26:12.842000+09:00 | | Version_1.0 | 2021-10-06T00:04:39.928000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesLinuxRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_2.0 | 2021-11-24T15:33:10.589000+09:00 | | Version_1.1 | 2021-10-25T23:24:39.099000+09:00 | | Version_1.0 | 2021-10-05T23:07:53.132000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesUnixRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_1.1 | 2021-10-25T22:43:16.107000+09:00 | | Version_1.0 | 2021-10-06T00:20:07.983000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesWindowsRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_2.0 | 2021-11-24T15:51:22.911000+09:00 | | Version_1.1 | 2021-10-26T01:22:07.345000+09:00 | | Version_1.0 | 2021-10-05T22:05:23.764000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesPHPRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_1.1 | 2021-10-25T23:11:10.925000+09:00 | | Version_1.0 | 2021-10-05T23:48:17.400000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesWordPressRuleSet ----------------------------------------------------- | ListAvailableManagedRuleGroupVersions | +--------------+------------------------------------+ | Version_1.1 | 2021-10-25T22:58:59.639000+09:00 | | Version_1.0 | 2021-10-06T01:00:50.655000+09:00 | +--------------+------------------------------------+ ## AWSManagedRulesAmazonIpReputationList ## AWSManagedRulesAnonymousIpList ## AWSManagedRulesBotControlRuleSet ## AWSManagedRulesATPRuleSet
AWSManagedRulesKnownBadInputsRuleSet
のバージョンが歯抜けになっています。これはマネジメントコンソールから見ても同じです。バージョンには有効期限切れという考え方があり、歯抜けになっているのは有効期限切れのバージョンです。
また、すべての AWS マネージドルールグループがバージョニングに対応しているわけではないことが分かりました。
AWS マネージドルールグループ内のルールの取得
最後に試すのは以下コマンドです。
このコマンドでは主に以下の情報を取得できます。
- 新しいバージョン通知用の SNS トピック(バージョニング有効なルールグループのみ)
- キャパシティ(WCU)
- ルール一覧
- ルール名
- アクション(AWS マネージドルールの場合はすべて
Black
)
- 使用可能なラベル
こちらも対象として単一のルールグループの指定が必要なためループ処理を行います。今回はルールグループの WCU とルール一覧を取得するようにしてみました。
aws wafv2 list-available-managed-rule-groups \ --scope REGIONAL \ --query 'ManagedRuleGroups[?VendorName==`AWS`] | [*].[Name]' \ --region us-east-1 \ --output text \ | while read group; do echo "## $group" aws wafv2 describe-managed-rule-group \ --vendor-name AWS \ --name $group \ --scope REGIONAL \ --query '{Capacity:Capacity,Rules:Rules[*].[Name]}' \ --region us-east-1 \ --output table done
実行結果は以下のとおりです。
## AWSManagedRulesCommonRuleSet ------------------------------------------- | DescribeManagedRuleGroup | +-------------------------+---------------+ | Capacity | 700 | +-------------------------+---------------+ || Rules || |+---------------------------------------+| || NoUserAgent_HEADER || || UserAgent_BadBots_HEADER || || SizeRestrictions_QUERYSTRING || || SizeRestrictions_Cookie_HEADER || || SizeRestrictions_BODY || || SizeRestrictions_URIPATH || || EC2MetaDataSSRF_BODY || || EC2MetaDataSSRF_COOKIE || || EC2MetaDataSSRF_URIPATH || || EC2MetaDataSSRF_QUERYARGUMENTS || || GenericLFI_QUERYARGUMENTS || || GenericLFI_URIPATH || || GenericLFI_BODY || || RestrictedExtensions_URIPATH || || RestrictedExtensions_QUERYARGUMENTS || || GenericRFI_QUERYARGUMENTS || || GenericRFI_BODY || || GenericRFI_URIPATH || || CrossSiteScripting_COOKIE || || CrossSiteScripting_QUERYARGUMENTS || || CrossSiteScripting_BODY || || CrossSiteScripting_URIPATH || |+---------------------------------------+| ## AWSManagedRulesAdminProtectionRuleSet ------------------------------- | DescribeManagedRuleGroup | +------------------+----------+ | Capacity | 100 | +------------------+----------+ || Rules || |+---------------------------+| || AdminProtection_URIPATH || |+---------------------------+| ## AWSManagedRulesKnownBadInputsRuleSet ------------------------------------------ | DescribeManagedRuleGroup | +-------------------------+--------------+ | Capacity | 200 | +-------------------------+--------------+ || Rules || |+--------------------------------------+| || JavaDeserializationRCE_BODY || || JavaDeserializationRCE_URIPATH || || JavaDeserializationRCE_QUERYSTRING || || JavaDeserializationRCE_HEADER || || Log4JRCE || || Host_localhost_HEADER || || PROPFIND_METHOD || || ExploitablePaths_URIPATH || |+--------------------------------------+| ## AWSManagedRulesSQLiRuleSet ------------------------------------------- | DescribeManagedRuleGroup | +-------------------------+---------------+ | Capacity | 200 | +-------------------------+---------------+ || Rules || |+---------------------------------------+| || SQLiExtendedPatterns_QUERYARGUMENTS || || SQLi_QUERYARGUMENTS || || SQLi_BODY || || SQLi_COOKIE || || SQLi_URIPATH || |+---------------------------------------+| ## AWSManagedRulesLinuxRuleSet -------------------------- |DescribeManagedRuleGroup| +--------------+---------+ | Capacity | 200 | +--------------+---------+ || Rules || |+----------------------+| || LFI_URIPATH || || LFI_QUERYSTRING || || LFI_COOKIE || |+----------------------+| ## AWSManagedRulesUnixRuleSet ------------------------------------------------- | DescribeManagedRuleGroup | +-----------------------------+-----------------+ | Capacity | 100 | +-----------------------------+-----------------+ || Rules || |+---------------------------------------------+| || UNIXShellCommandsVariables_QUERYARGUMENTS || || UNIXShellCommandsVariables_BODY || |+---------------------------------------------+| ## AWSManagedRulesWindowsRuleSet ------------------------------------------- | DescribeManagedRuleGroup | +-------------------------+---------------+ | Capacity | 200 | +-------------------------+---------------+ || Rules || |+---------------------------------------+| || WindowsShellCommands_COOKIE || || WindowsShellCommands_QUERYARGUMENTS || || WindowsShellCommands_BODY || || PowerShellCommands_COOKIE || || PowerShellCommands_QUERYARGUMENTS || || PowerShellCommands_BODY || |+---------------------------------------+| ## AWSManagedRulesPHPRuleSet -------------------------------------------------- | DescribeManagedRuleGroup | +------------------------------+-----------------+ | Capacity | 100 | +------------------------------+-----------------+ || Rules || |+----------------------------------------------+| || PHPHighRiskMethodsVariables_QUERYARGUMENTS || || PHPHighRiskMethodsVariables_BODY || |+----------------------------------------------+| ## AWSManagedRulesWordPressRuleSet ------------------------------------------------ | DescribeManagedRuleGroup | +----------------------------+-----------------+ | Capacity | 100 | +----------------------------+-----------------+ || Rules || |+--------------------------------------------+| || WordPressExploitableCommands_QUERYSTRING || || WordPressExploitablePaths_URIPATH || |+--------------------------------------------+| ## AWSManagedRulesAmazonIpReputationList ------------------------------------ | DescribeManagedRuleGroup | +----------------------+-----------+ | Capacity | 25 | +----------------------+-----------+ || Rules || |+--------------------------------+| || AWSManagedIPReputationList || || AWSManagedReconnaissanceList || |+--------------------------------+| ## AWSManagedRulesAnonymousIpList ----------------------------- | DescribeManagedRuleGroup | +-----------------+---------+ | Capacity | 50 | +-----------------+---------+ || Rules || |+-------------------------+| || AnonymousIPList || || HostingProviderIPList || |+-------------------------+| ## AWSManagedRulesBotControlRuleSet --------------------------------- | DescribeManagedRuleGroup | +--------------------+----------+ | Capacity | 50 | +--------------------+----------+ || Rules || |+-----------------------------+| || CategoryAdvertising || || CategoryArchiver || || CategoryContentFetcher || || CategoryEmailClient || || CategoryHttpLibrary || || CategoryLinkChecker || || CategoryMiscellaneous || || CategoryMonitoring || || CategoryScrapingFramework || || CategorySearchEngine || || CategorySecurity || || CategorySeo || || CategorySocialMedia || || SignalAutomatedBrowser || || SignalKnownBotDataCenter || || SignalNonBrowserUserAgent || |+-----------------------------+| ## AWSManagedRulesATPRuleSet --------------------------------------- | DescribeManagedRuleGroup | +------------------------+------------+ | Capacity | 50 | +------------------------+------------+ || Rules || |+-----------------------------------+| || VolumetricIpHigh || || VolumetricSession || || AttributeCompromisedCredentials || || AttributeUsernameTraversal || || AttributePasswordTraversal || || AttributeLongSession || || TokenRejected || || SignalMissingCredential || |+-----------------------------------+|
AWS マネージドルールグループのバージョン変更通知の SNS トピックを確認する
以下ページにある通り、マネージドルールグループの更新を通知してくれる SNS トピックが存在します。
先ほどのコマンドを一部変更し、ルールグループごとの結果を確認してみます。
aws wafv2 list-available-managed-rule-groups \ --scope REGIONAL \ --query 'ManagedRuleGroups[?VendorName==`AWS`] | [*].[Name]' \ --region us-east-1 \ --output text \ | while read group; do echo "## $group" aws wafv2 describe-managed-rule-group \ --vendor-name AWS \ --name $group \ --scope REGIONAL \ --query 'SnsTopicArn' \ --region us-east-1 \ --output text done
実行結果は以下のとおりです。
## AWSManagedRulesCommonRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesAdminProtectionRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesKnownBadInputsRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesSQLiRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesLinuxRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesUnixRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesWindowsRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesPHPRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesWordPressRuleSet arn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications ## AWSManagedRulesAmazonIpReputationList None ## AWSManagedRulesAnonymousIpList None ## AWSManagedRulesBotControlRuleSet None ## AWSManagedRulesATPRuleSet None
以下が読み取れました。
- バージョニングが有効なルールグループでは共通した SNS トピックが用いられること
- バージョニングが有効でないルールグループでは該当する SNS トピックが存在しないこと
ちなみにarn:aws:sns:us-east-1:248400274283:aws-managed-waf-rule-notifications
というのはリージョンごとに用意されているものではないようでした。別のリージョンを指定してコマンドを実行しても、同じ ARN が得られました。
終わりに
AWS WAF の AWS マネージドルールグループの一覧を確認するためにいくつかの AWS CLI コマンドを試してみました。大まかに以下が分かりました。
AWSManagedRulesATPRuleSet
は対応しているリージョンが限定的である- バージョニングが有効なルールグループとそうでないものがある
- バージョンの変更日時を確認できる
- WCU やルールの一覧(名称、アクション)が確認できる
何かの機会に思い出していただいて、参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。