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