Comment protéger mon environnement Elastic Beanstalk contre les attaques d'hôtes indésirables connus ?

Dernière mise à jour : 28/05/2020

Mes instances AWS Elastic Beanstalk reçoivent des demandes d'un nom d'hôte indésirable. Comment puis-je empêcher mes instances Elastic Beanstalk d'obtenir des demandes de ce nom d'hôte ?

Brève description

Dans un environnement Elastic Beanstalk avec un équilibreur de charge d'application, vous pouvez utiliser AWS WAF comme ressource personnalisée pour protéger vos instances contre les attaques de noms d'hôte indésirables.

Pour bloquer votre environnement Elastic Beanstalk contre les noms d'hôte indésirables, suivez les étapes de l'une des sections suivantes :

  • Bloquer un nom d'hôte
  • Bloquer plusieurs noms d'hôte

Résolution

Bloquer un nom d'hôte

1.    Créez un fichier de configuration waf.config dans votre répertoire .ebextensions.

2.    Mettez à jour le fichier elbsg.config en vous reportant à l'exemple suivant : Veillez à remplacer BlockedHost1 par le nom d'hôte que vous souhaitez bloquer de votre environnement 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.    Créez ou mettez à jour votre environnement Elastic Beanstalk avec votre fichier waf.config de l'étape 2.

Important : si vous exécutez votre fichier waf.config sur un environnement Elastic Beanstalk existant qui n'a pas d'équilibreur de charge d'application, vous obtenez une erreur. Vous recevez l'erreur, car le type d'équilibreur de charge peut être défini uniquement lors de la création de l'environnement. Pour plus d'informations, consultez Configuration d'un équilibreur de charge d'application. Vous pouvez modifier le type de votre équilibreur de charge avec un déploiement bleu/vert.

4.    Pour confirmer que BlockedHost1 ne peut pas envoyer de demandes à votre environnement Elastic Beanstalk, ouvrez un terminal, puis exécutez la commande suivante pour simuler une demande provenant de exampletoblock.com.

$ curl -I -H 'host: exampletoblock.com' http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com

Remarque : remplacez exampletoblock.com par le nom d'hôte configuré sur waf.config que vous souhaitez bloquer. Remplacez l'URL de la commande par l'URL de votre environnement Elastic Beanstalk.

Si le nom d'hôte est bloqué, vous obtenez une sortie similaire à ce qui suit :

> 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.    Pour simuler une demande normale, exécutez la commande suivante :

$ curl -I http://ENV-NAME.ENV-ID.eu-west-1.elasticbeanstalk.com

Si la demande aboutit, vous voyez un code de statut 200 réussi et recevez une sortie similaire à ce qui suit :

> 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

Bloquer plusieurs noms d'hôte

Vous pouvez bloquer plusieurs noms d'hôte en ajoutant les noms d'hôte à une liste de contrôle d'accès web (ACL web) qui utilise RegexPatternSet.

Dans votre fichier waf.config ajoutez des noms d'hôte supplémentaires en tant qu'options personnalisées dans la liste RegularExpressionList. Voici un exemple :

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

Cette page vous a-t-elle été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?