既知の望まないホストの攻撃から 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

この記事は役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合