AWS Elastic Beanstalk インスタンスが、不要なホスト名からのリクエストを受け取ります。
解決策
Application Load Balancer を使用する Elastic Beanstalk 環境では、AWS WAF をカスタムリソースとして使用して、インスタンスを攻撃から守ります。1 つのホスト名をブロックするか、複数のホスト名をブロックするかを選択できます。
1 つのホスト名をブロックする
1. .ebextensions ディレクトリに waf.config コンフィギュレーションファイルを作成します。
2. この例に基づいて、waf.config ファイルを更新してください。
option_settings:
aws:elasticbeanstalk:environment:
LoadBalancerType: application
aws:elasticbeanstalk:customoption:
BlockedHost1: 'exampletoblock.com'
Resources:
BlockedHostnames:
Type: "AWS::WAFv2::RegexPatternSet"
Properties:
Description: 'List of Hostnames to be block by WebACL'
Name: BlockedHostsSet
RegularExpressionList:
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost1" }}
Scope: REGIONAL
WafAcl:
Type: "AWS::WAFv2::WebACL"
Properties:
Description: "Web ACL to Block requests from unknown hosts on AWSEBV2LoadBalancer"
Name: "BlockHostACL"
Scope: REGIONAL
DefaultAction:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: BlockHostACLMetric
Rules:
- Name: BlockedHostsRule
Priority: 1
Action:
Block: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: UnknownHostRule1
Statement:
RegexPatternSetReferenceStatement:
Arn: '`{ "Fn::GetAtt" : ["BlockedHostnames", "Arn" ]}`'
FieldToMatch:
SingleHeader:
Name: Host
TextTransformations:
- Priority: 0
Type: NONE
WebACLAssociation:
Type: AWS::WAFv2::WebACLAssociation
Properties:
ResourceArn: '`{ "Ref" : "AWSEBV2LoadBalancer" }`'
WebACLArn: '`{ "Fn::GetAtt" : ["WafAcl", "Arn" ]}`'
**注:**BlockedHost1 は、Elastic Beanstalk 環境からブロックしたいホスト名に置き換えてください。
3. 前のステップの waf.config ファイルを使用して、Elastic Beanstalk 環境を作成または更新します。
**重要:**Application Load Balancer のない既存の Elastic Beanstalk 環境で waf.config ファイルを実行すると、エラーが発生します。ロードバランサータイプは環境の作成時にのみ定義できるため、エラーが発生します。ロードバランサータイプをブルー/グリーンデプロイに変更します。詳細については、](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-alb.html)Application Load Balancer の設定[を参照してください。
4. BlockedHost1 が Elastic Beanstalk 環境へのリクエスト送信がブロックされていることを確認するには、まずターミナルを開きます。次に、exampletoblock.com から送信されるリクエストをシミュレートするには、以下のコマンドを実行します:
$ curl -I -H 'host: exampletoblock.com' http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com
注:exampletoblock.com を、ブロックしたいwaf.config に設定されているホスト名に置き換えてください。http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com を Elastic Beanstalk environment URL に置き換えてください。
ホスト名がブロックされている場合、次の例のような出力が表示されます:
> HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Mon, 20 Apr 2020 17:31:14 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
5. 通常のリクエストをシミュレートするには、次のコマンドを実行します:
$ curl -I http://ENV-NAME.ENV-ID.eu-west-1.elasticbeanstalk.com
リクエストが成功すると、成功した 200 ステータスコードが表示されます。次のような出力が表示されます:
> HTTP/1.1 200 OK
Date: Mon, 20 Apr 2020 17:38:04 GMT
Content-Type: text/html
Content-Length: 3352
Connection: keep-alive
Server: nginx/1.16.1
複数のホスト名をブロック
複数のホスト名をブロックするには、RegexPatternSet を使用するウェブアクセスコントロールリスト (WEB ACL) にホスト名を追加します。waf.config ファイルに、RegularExpressionList のカスタムオプションとして追加のホスト名を追加します:
option_settings:
aws:elasticbeanstalk:environment:
LoadBalancerType: application
aws:elasticbeanstalk:customoption:
BlockedHost1: 'exampletoblock.com'
BlockedHost2: 'anothertoblock.com'
Resources:
BlockedHostnames:
Type: "AWS::WAFv2::RegexPatternSet"
Properties:
Description: 'List of Hostnames to be block by WebACL'
Name: BlockedHostsSet
RegularExpressionList:
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost1" }}
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost2" }}
Scope: REGIONAL
関連情報
Elastic Beanstalk 環境リソースを追加してカスタマイズする