Refuser l'adresse IP sur AWS ELB

10

J'ai plus ou moins suivi la configuration sur AWS:

Equilibreur de charge élastique avec 3 machines o 3 zones de disponibilité différentes. Mon groupe de sécurité autorise 0.0.0.0/0:80 car c'est mon application rails (nginx, unicorn).

Je me demandais s'il y avait un moyen de refuser l'accès à mon application à une adresse IP publique spécifique? J'ai lu la documentation AWS, mais comme les SG "refusent tout", il n'y a aucun moyen de refuser une seule adresse IP spécifique.

Des idées? iptables sur les 3 machines derrière l'équilibreur de charge?

Merci!

boris quiroz
la source

Réponses:

16

Une solution simple consiste à utiliser une règle entrante ACL réseau VPC. Cela ne fonctionne que si votre ELB est dans un VPC, mais si vous l'avez créé au cours des dernières années, il devrait être dans celui par défaut.

Pour interdire 1.2.3.4 par exemple, procédez comme suit:

  1. Connectez-vous à AWS.
  2. Accédez à VPC.
  3. Choisissez Network ACLsdans le menu de gauche.
  4. Choisissez l'ACL associée au VPC dans lequel se trouve votre ELB.
  5. Choisissez l' Inbound Rulesonglet.
  6. Choisissez Editet ajoutez une nouvelle règle avec les attributs suivants:
    • Règle #: 50 (n'importe quel nombre tant qu'il est inférieur à la règle qui autorise de TOUS)
    • Type: TOUS les trafics
    • Protocole: TOUS
    • Plage de ports: TOUS
    • Source: 1.2.3.4/32
    • Autoriser / Refuser: REFUSER

Il y a beaucoup plus d'informations sur les ACL réseau ici: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html

Tama
la source
1

Non, il n'y a pas d'option pour bloquer les IP avec un groupe de sécurité.

Le groupe de sécurité est essentiellement une liste blanche, au lieu d'une liste noire.

Tout est refusé par défaut et vous pouvez ouvrir sélectivement des ports en fonction de vos besoins, mais vous ne pouvez pas bloquer des personnes / ip spécifiques.

Pour cela, la meilleure solution est, comme vous l'avez dit, des IPtables sur les 3 machines différentes.

Je suis sûr qu'à l'avenir, les groupes de sécurité AWS auront également cette fonctionnalité, mais pas pour l'instant.

Napster_X
la source
1

Si vous n'avez besoin que de mettre sur liste noire quelques adresses IP, vous pouvez probablement utiliser nginx_http_access_module sur votre serveur Web.

Sebastian Cruz
la source
Le principal problème avec cela, c'est que j'ai besoin de comprendre comment le faire "automagiquement", car toutes mes configurations sont gérées par Chef. J'ai besoin de quelque chose comme fail2ban ou denyhost pour dire à une config Chef de bloquer certaines adresses IP ...
boris quiroz
1

Pour cela, la meilleure solution est, comme vous l'avez dit, des IPtables sur les 3 machines différentes.

En fait, ce n'est pas une bonne solution car l'IP distant ( $remote_addrdans Nginx) proviendra de l'équilibreur de charge d'Amazon. Une interdiction qui entraînera l'interdiction de tout le trafic transféré.

Vous devrez inspecter les paquets et trouver l'en- X-Forwarded-Fortête HTTP , IPtables n'est pas compatible avec le protocole comme ça.

Je me suis contenté de la solution suivante pour 2 adresses IP coquines dans Nginx

set $client_ip $remote_addr;
if ($http_x_forwarded_for) {
  set $client_ip $http_x_forwarded_for;
}

if ($client_ip = "123.123.123.123") {
  return 403;
}

if ($client_ip = "123.123.123.234") {
  return 403;
}

Présentation d'une variable $client_ip, juste pour que je puisse aussi tester cela localement, là où il n'y en a pas de http_x_forwarded_fordisponible ..

Légèrement hors sujet mais postant pour plus de commodité, j'ai également ajouté cette adresse IP client à mes journaux d'accès:

log_format main "\$client_ip - \$remote_user [\$time_local] \"\$request\" \$status \$body_bytes_sent \"\$http_referer\" \"\$http_user_agent\"";
access_log /var/log/nginx.access.log main;

Ce n'est pas joli, mais j'espère que ça aide

kvz
la source