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

Lecture de 3 minute(s)
0

Mes instances AWS Elastic Beanstalk reçoivent des demandes provenant d'un nom d'hôte indésirable.

Résolution

Dans un environnement Elastic Beanstalk doté d'un équilibreur de charge de type Application Load Balancer, utilisez AWS WAF comme ressource personnalisée pour protéger vos instances contre les attaques. Vous pouvez choisir de bloquer un nom d’hôte ou plusieurs noms d'hôte.

Blocage d’un nom d'hôte

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

2.    Mettez à jour votre fichierwaf.config en vous basant sur l’exemple suivant.

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" ]}`'

Remarque : vous devez remplacer BlockedHost1 par le nom d'hôte que vous souhaitez bloquer dans votre environnement Elastic Beanstalk.

3.    Créez ou mettez à jour votre environnement Elastic Beanstalk avec le fichier waf.config créé à l'étape précédente.

Important : si vous exécutez votre fichier waf.config dans un environnement Elastic Beanstalk existant qui ne possède pas d'équilibreur de charge de type Application Load Balancer, une erreur s'affichera. En effet, le type d'équilibreur de charge peut uniquement être défini au moment de la création de l'environnement. Vous pouvez changer votre type d'équilibreur de charge grâce à un déploiement bleu/vert. Pour en savoir plus, consultez la section Configuration d’un Application Load Balancer.

4.    Pour vérifier que BlockedHost1 ne peut plus envoyer de demandes à votre environnement Elastic Beanstalk, commencez par ouvrir un terminal. Ensuite, pour simuler une demande provenant de exampletoblock.com, exécutez cette commande :

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

Remarque : vous devez remplacer exampletoblock.com par le nom d'hôte configuré sur waf.config que vous souhaitez bloquer. Remplacez http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com par l’URL de votre environnement Elastic Beanstalk.

Si le nom d'hôte est bloqué, vous recevez un résultat similaire à cet exemple :

> 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 cette commande :

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

Si la demande aboutit, le code d'état 200 s'affiche. Vous recevez alors un résultat similaire à celui-ci :

> 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

Blocage de plusieurs noms d'hôtes

Pour bloquer plusieurs noms d'hôtes, ajoutez-les à une liste de contrôle d'accès Web (WEB ACL) 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 :

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

Informations connexes

Ajout et personnalisation des ressources de l'environnement Elastic Beanstalk

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 6 mois