既知の望まないホストの攻撃から Elastic Beanstalk 環境を保護するにはどうすればよいですか。
最終更新日: 2020 年 5 月 28 日
AWS Elastic Beanstalk インスタンスが、望まないホスト名からのリクエストを取得しています。Elastic Beanstalk インスタンスを保護して、このホスト名からのリクエストを取得しないようにするには、どうすればよいですか。
簡単な説明
Application Load Balancer を設定した Elastic Beanstalk 環境では、望まないホスト名の攻撃からインスタンスを保護するためのカスタムリソースとして AWS WAF を使用することができます。
Elastic Beanstalk 環境で望まないホスト名をブロックするには、下記セクションのいずれかの手順を実施します。
- 1 つのホスト名をブロックする
- 複数のホスト名をブロックする
解決方法
1 つのホスト名をブロックする
1. .ebextensions ディレクトリで waf.config 設定ファイルを作成します。
2. 次の例を参考にして waf.config ファイルを更新します。BlockedHost1 は、Elastic Beanstalk 環境からブロックしたいホスト名に置き換えてください。
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" ]}`'
3. ステップ 2 の waf.config ファイルを使用して Elastic Beanstalk 環境を作成または更新します。
重要: Application Load Balancer が設定されていない既存の Elastic Beanstalk 環境で waf.config ファイルを実行すると、エラーが発生します。このエラーが発生する理由は、このロードバランサータイプを指定できるのが環境作成時のみであるためです。詳細については、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 で設定した、ブロックしたいホスト名に置き換えます。コマンドの URL は Elastic Beanstalk 環境の 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 を使用するウェブアクセスコントロールリスト (ウェブ 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