AWS

WAF Web ACLをAPI Gatewayに適用する

スポンサーリンク
WAF Web ACLをAPI Gatewayに適用する AWS
スポンサーリンク
スポンサーリンク

WAF Web ACLをAPI Gatewayに適用する

AWS WAFは以下の4種類のリソースに適用することができます。

  • ALB
  • CloudFront
  • API Gateway
  • AppSync

今回はAPI Gatewayに適用する方法を確認します。

なおWAFをALBに適用する方法については、以下のページをご確認ください。

WAFをCloudFrontに適用する方法については、以下のページをご確認ください。

WAFをAppSyncに適用する方法については、以下のページをご確認ください。

構築する環境

AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 | 佐々木 拓郎, 林 晋一郎, 金澤 圭 | 産業研究 | Kindleストア | Amazon
Amazonで佐々木 拓郎, 林 晋一郎, 金澤 圭のAWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。
Diagram of apply WAF Web ACL to API Gateway

WAF Web ACLを作成します。
地理制限を行います。
具体的にはルールグループを自作し、その中に日本(JP)からのアクセスをブロックするルールを設定します。
作成したWeb ACLをAPI Gatewayに適用します。

API Gatewayを作成し、バックエンドにLambdaを配置します。
ユーザからHTTPリクエストを受けた場合、API Gatewayがエンドポイントとなって、代わりにLambda関数を呼び出し、同関数の実行結果をユーザに返すというシンプルな構成です。
API GatewayはREST APIタイプで作成します。

Lambda関数のランタイム環境はPython3.8とします。
関数の動作ですが、実行すると「Hello form Awstut !」という文字列を返すという単純な内容とします。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

awstut-fa/053 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

テンプレートファイルのポイント解説

本ページでは、CloudFrontにWAFを適用する方法を中心に取り上げます。

WAFの基本的な事項については、以下のページをご確認ください。

WAFで地理制限する方法については、以下のページをご確認ください。

REST APIタイプのAPI Gatewayに関する基本的な事項については、以下のページをご確認ください。

(参考)REST APIタイプのAPI Gatewayリソース

以下のAWS公式サイトで言及されている通り、WAFを適用できるAPI GatewayのタイプはREST APIタイプです。

HTTP API と REST API 間で選択する - Amazon API Gateway
HTTP API と REST API の違いについて説明します。
Resources: RestApi: Type: AWS::ApiGateway::RestApi Properties: EndpointConfiguration: Types: - EDGE Name: !Ref Prefix Deployment: Type: AWS::ApiGateway::Deployment DependsOn: - Method Properties: RestApiId: !Ref RestApi Resource: Type: AWS::ApiGateway::Resource Properties: ParentId: !GetAtt RestApi.RootResourceId PathPart: !Sub "${Prefix}-resource" RestApiId: !Ref RestApi Stage: Type: AWS::ApiGateway::Stage Properties: DeploymentId: !Ref Deployment RestApiId: !Ref RestApi StageName: !Sub "${Prefix}-stage" Method: Type: AWS::ApiGateway::Method Properties: AuthorizationType: NONE HttpMethod: GET Integration: ConnectionType: INTERNET Credentials: !GetAtt ApiGatewayRole.Arn IntegrationHttpMethod: POST Type: AWS_PROXY Uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${FunctionArn}/invocations" ResourceId: !Ref Resource RestApiId: !Ref RestApi
Code language: YAML (yaml)

特別な設定は不要です。
リソースの定義において、URLのPATHの一部を「fa-053-resource」と設定します。
ステージの定義において、ステージ名を「fa-053-stage」と設定します。

Web ACL

Resources: WebACL: Type: AWS::WAFv2::WebACL Properties: DefaultAction: Allow: {} Name: !Sub "${Prefix}-WebACL" Rules: - Name: !Sub "${Prefix}-WebACL-GeoRestriction" OverrideAction: None: {} Priority: 0 Statement: RuleGroupReferenceStatement: Arn: !GetAtt RuleGroup.Arn VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Sub "${Prefix}-WebACL-GeoRestriction" SampledRequestsEnabled: true Scope: REGIONAL VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Ref Prefix SampledRequestsEnabled: true
Code language: YAML (yaml)

Scopeプロパティがポイントです。
Web ACLをCloudFrontに適用する場合は「CLOUDFRONT」、それ以外のリソースの場合は「REGIONAL」となります。
今回はAPI Gatewayですから後者となります。

Resources: WebACLAssociation: Type: AWS::WAFv2::WebACLAssociation Properties: ResourceArn: !Sub "arn:aws:apigateway:${AWS::Region}::/restapis/${RestApi}/stages/${StageName}" WebACLArn: !GetAtt WebACL.Arn
Code language: YAML (yaml)

API GatewayにWAFを適用するためのリソースです。
ResourceArnプロパティで、WAFを適用するAPI Gatewayを指定します。
指定方法は以下のように説明されています。

For an Amazon API Gateway REST API: arn:aws:apigateway:region::/restapis/api-id/stages/stage-name

AWS::WAFv2::WebACLAssociation

ですから上記の要件を満たすために、組み込み関数Fn::Subを使用して、APIのIDとステージ名を埋め込んで設定します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • API Gatewayの名前:fa-053
  • API Gatewayのエンドポイント:https://dv68zdrmge.execute-api.ap-northeast-1.amazonaws.com/
  • API Gatewayのステージ名:fa-053-stage
  • API Gatewayのリソース名:fa-053-resource
  • WAFの名前:fa-053-WebACL

AWS Management Consoleからもリソースを確認します。
まずAPI Gatewayを確認します。

The Detail of API Gateway.

ステージのページを見えると、WAFが適用されていることがわかります。

次にWeb ACLを確認します。

The detail of WAF Web ACL.

Web ACL側からも、このACLがAPI Gatewayに適用されていることがわかります。

動作確認

準備が整いましたので、日本からCloudFrontにアクセスします。
今回アクセスするべきURLは、リソースとステージの情報を組み合わせて定まります。
具体的には以下のURLとなります。

https://dv68zdrmge.execute-api.ap-northeast-1.amazonaws.com/fa-053-stage/fa-053-resource/

Access to API Gateway was blocked by the WAF Web ACL.

アクセスが拒否されました。
日本からアクセスしたため、API Gatewayに到達する前に、WAF Web ACLによってブロックされたということです。

確認のために、地理制限のアクションを変更します。

Changed WAF Web ACL rules from blocking to counting.

ルールのアクションをブロックからカウント、つまりルールは生かしつつ、ルールに該当するトラフィック数を数えるだけに変更しました。

改めてAPI Gatewayにアクセスします。

Access to API Gateway was counted by the WAF Web ACL.

API Gatewayにアクセスできるようになりました。
ルールのアクションがブロックからカウントだけになり、アクセスが可能になったためです。

まとめ

WAF ACLをAPI Gatewayに適用する方法を確認しました。

タイトルとURLをコピーしました