【目次】
1. はじめに
過去のブログ記事で、特定のURIをラベルで除外する方法をご説明しました。
AWS WAF ラベル機能の利用方法
今回は他にも考えられる様々な許可パターンをご説明したいと思います。
2. 例1:サービス内容が特定の条件下で提供されているケース
対象のサービスを特定の条件下で提供されている場合、接続元を絞るようなルールとマネージドルールの組み合わせが考えられます。
以下では、国による制限と、IPアドレスでの制限の例を記載します。
特定の国を対象とした場合
国による制限を必要とする場合は、特定の国以外をBLOCKするルールとマネージドルールを適用しましょう。
国を制限した上で、不審なアクセスを検知するルールでの検査を行う場合、以下のようなルールかつ順序での適用が有効です。
- 特定の国以外をBLOCKするルール
- マネージドルール
特定の国以外をBLOCKするルールは、Not Statementと地理的一致ルールステートメントを使用します。
指定する条件の例:
- If a request: doesn’t match the statement (NOT)
- Inspect: Originates from a country in
- Country codes: Japan – JP
- IP address to use to determine the country of origin: Source IP address
- Action: Block
特定の接続元(IP)を対象とした場合
特定のIPアドレスからのみアクセスを受け付ける場合は、特定のIPアドレス以外をBLOCKするルールと組み合わせます。
上記と同じように、以下のルールかつ順序となります。
- 特定のIPアドレス以外をBLOCKするルール
- マネージドルール
こちらのルールの場合、国を指定するルールとは異なりあらかじめIP Setsの作成が必要です。
IP Setsの作成方法は、AWS公式ドキュメントの IP セットの作成と管理 をご参考ください。
IP Setsを用意した上で、ルール上は以下の通り選択します。
指定する条件の例:
- If a request: doesn’t match the statement (NOT)
- Inspect: Originates from an IP address in
- IP set: 作成したIP Setsの名前
- IP address to use to determine the country of origin: Source IP address
- Action: Block
なお、上記は Web ACLのデフォルトアクション(Default web ACL action for requests that don’t match any rules) がALLOWとなっている場合(※)を想定しています。
※ルールにマッチしないリクエストは許可したい構成です。
もし、基本的にはすべてのリクエストをBLOCKとした上で、ルール上で明示的に許可するリクエスト(接続元のIPアドレス)を指定したい場合は、デフォルトアクションにBLOCKを選択し、以下のルールを適用することで実現可能です。
- マネージドルール
- 特定のIPアドレスをALLOWするルール
指定する条件の例:
- If a request: matches the statement
- Inspect: Originates from an IP address in
- IP set: 作成したIP Setsの名前
- IP address to use to determine the country of origin: Source IP address
- Action: Allow
3. 例2:管理者作業がルールにマッチしてしまうケース
管理者による作業の場合、更新等を実施した際にWAFのルールにマッチしてしまうことがあります。
今回は、特定のルールに更新作業がマッチしたという前提で、該当するルールからのみ除外するケースとして考えてみましょう。
本ケースでは、3つほど例をご紹介します。
以前公開した以下のブログ記事でも類似の内容をご紹介しておりますので、あわせてご参考ください。
AWS WAF ラベル機能の利用方法
管理者であれば、基本的には特定のIPアドレスからのリクエストがほとんどかと思いますので、1つ目の例はIPアドレスを使用した条件です。
AWSが提供するマネージドルールでは、ルールごとに必ずラベルが存在しますので、この例ではAWSが提供するマネージドルールとIPアドレスを使用します。
この例でのルールと順序は以下の通りです。
- マネージドルール
管理者作業にマッチした該当ルールのアクションをCOUNTにする - 該当ルールのラベル & 特定のIPアドレス以外をBLOCKするルール
「該当ルールのラベル & 特定のIPアドレス以外をBLOCK」というルールは、マネージドルール内の該当ルールをCOUNTにした上で新規作成する必要があります。
マネージドルール内の該当ルールをCOUNTにする際は、ルールグループ内のルールアクションのオーバーライド を使用して、アクションの書き換えをする必要があります。
また、「該当ルールのラベル & 特定のIPアドレス以外をBLOCK」というルールではIPアドレスが条件に含まれるため、あらかじめIP Setsの用意が必要です。
ラベルは、プルダウンの一覧から探すか、ルール名を入力すると選択肢が絞れますので、いずれかの方法で一致するものを選んでください。
指定する条件の例:
- If a request: matches all the statements (AND)
- 1つ目の条件
- Inspect: Has a label
- Match scope: Label
- Match key: awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body
- 2つ目の条件
- Negate statement (NOT): チェックをいれる
- Inspect: Originates from an IP address in
- IP set: 作成したIP Setsの名前
- IP address to use to determine the country of origin: Source IP address
- Action: Block
2つ目は、特定のURI配下が管理者作業の対象で、一般ユーザーはアクセスできない場合などに、URIで除外する例です。
考え方はIPアドレスの場合と同じで、条件がURIに変わる点が異なります。
- マネージドルール
管理者作業にマッチした該当ルールのアクションをCOUNTにする - 該当ルールのラベル & 特定のURI配下以外をBLOCK
URIを指定する際は、検査対象(Inspect)にはURI pathを選択します。
また、URIの一致条件の指定 が必要となります。
特定のURI配下の場合は、特定の値から始まることが多いかと思いますが、その場合は「Starts with string」を指定します。
もし、特定の値を含む場合には、「Contains string」を選択するか、正規表現を使用するという方法もあります。
3つ目は、管理者による作業の際に特定のヘッダー項目と値が含まれる場合、そちらを条件に含める例です。
- マネージドルール
管理者作業にマッチした該当ルールのアクションをCOUNTにする - 該当ルールのラベル & 特定のヘッダー以外をBLOCK
ヘッダーの場合も、IPアドレスやURI条件と同じような対応となります。
検査対象(Inspect)にはSingle headerを選択し、ヘッダー項目名とそのヘッダーに含まれる値を指定します。
4. 例3:その他の許可ケース
複数のHostへのアクセスを1つのWAFで管理する場合、特定のHostは特殊な環境である場合や、一時的にWAFのルールで検知しないよう範囲外としたいといったことも考えられます。
そのような場合には、以下の方法が活用できます。
特定のHostをALLOWする方法
この場合、指定したHostへのアクセスの場合は最初にALLOWとなりますので、後続のマネージドルールでは検査されず、WAFでの検査対象外になります。
- 特定のHostをALLOWするルール
- マネージドルール
特定のHostをALLOWするルールは、以下のように指定します。
指定する条件の例:
- If a request: matches the statement
- Inspect: Single header
- Header field name: host
- Match type: Exactly matches string
- String to match: example.com
- Action: Allow
特定のHostを除外する方法
こちらは、「例2:管理者作業がルールにマッチしてしまうケース」の3つ目にご紹介した、ヘッダー項目と値を用いた方法と同じです。
除外する際は、ラベル単体での指定ではなく、Namespaceを用いて以下のような形で指定をします。
awswaf:managed:aws:core-rule-set:
ただし、この方法ですとどのルールで検知したかの特定が難しくなる懸念もございますので、そういった場合にはマネージドルールに含まれるルールの分だけ「該当ルールのラベル & 特定のヘッダー(Host)以外をBLOCK」というルールを追加する方法がよさそうです。
マネージドルールに含まれるルール数が多い場合には、除外するためのルールがその分増えることになりますので、あまり現実的ではない場合もありますが、もし大半のルールからは除外したいが、一部ルールだけは検査対象としたい状況には有効かもしれません。
スコープダウンステートメントを用いる方法
マネージドルールをご利用の場合、ルールごとの個別の調整は直接はできませんが、特定のマネージドルール全体で検査対象とするリクエストを絞ることが可能です。
スコープダウンステートメントは、AWSが提供するマネージドルールだけではなく、AWS Marketplaceにてサードパーティが販売するマネージドルールでも利用が可能となっています。
特定のHostを除外したいマネージドルールにチェックを入れ、Editをクリックするとスコープダウンステートメントを指定する箇所が表示されますので、「Only inspect requests that match a scope-down statement」を選択してから条件を指定します。
指定する条件の例:
- If a request: doesn’t match the statement (NOT)
- Inspect: Single header
- Header field name: host
- Match type: Exactly matches string
- String to match: example.com
スコープダウンステートメントとなりますので、アクションの指定はありません。
マネージドルールは多くの場合、どのルールでもマッチしたらBLOCKするという動作を行いますので、除外をする場合にはNot Statementを使用します。
なお、WAFの検査対象としたいHostが1つのみの場合など、ある程度条件が決まっている場合は、「If a request」以下で「matches the statement」を選択すれば、「特定のHostの場合のみ検査する」という指定が可能です。
5. おわりに
マネージドルールはルールごとのシグネチャを変更することができないため、特定のケースを許可したい場合などは、ラベルを用いた除外などで別途対応が必要です。
状況によって有用な手法は異なるため、上記も参考にご利用の環境に適した許可方法を選択いただければと思います。