Denegar la dirección IP en AWS ELB

10

Tengo, más o menos, la siguiente configuración en AWS:

Balanceador de carga elástico con 3 máquinas o 3 zonas de disponibilidad diferentes. Mi grupo de seguridad permite 0.0.0.0/0:80 ya que es mi aplicación de rieles (nginx, unicorn).

Me preguntaba si hay alguna forma de negar el acceso a mi aplicación a una dirección IP pública específica. He estado leyendo la documentación de AWS, pero como los SG "niegan todo" no hay forma de negar solo una dirección IP específica.

¿Algunas ideas? ¿iptables en las 3 máquinas detrás del balanceador de carga?

¡Gracias!

boris quiroz
fuente

Respuestas:

16

Una solución sencilla es usar una regla de entrada ACL de red VPC. Esto solo funciona si su ELB está en una VPC, pero si lo ha creado en los últimos años, debería estar en el predeterminado.

Para prohibir 1.2.3.4 por ejemplo, haga lo siguiente:

  1. Inicie sesión en AWS.
  2. Navega hacia VPC.
  3. Elija Network ACLsdel menú de la izquierda.
  4. Elija la ACL asociada con la VPC en la que se encuentra su ELB.
  5. Elige la Inbound Rulespestaña.
  6. Elija Edity agregue una nueva regla con los siguientes atributos:
    • Regla n. ° 50 (cualquier número siempre que sea menor que la regla que PERMITE a TODOS)
    • Tipo: TODO el tráfico
    • Protocolo: TODOS
    • Rango de puertos: TODOS
    • Fuente: 1.2.3.4/32
    • Permitir / Denegar: DENY

Hay mucha más información sobre las ACL de red aquí: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html

Tama
fuente
1

No, no hay opción para bloquear las IP con el grupo de seguridad.

El grupo de seguridad es esencialmente una lista blanca, en lugar de una lista negra.

Todo está denegado de forma predeterminada y puede abrir puertos de forma selectiva según sus necesidades, pero no puede bloquear ninguna persona / ip específica.

Para eso, la mejor solución es, como usted dijo, IPtables en las 3 máquinas diferentes.

Estoy seguro de que en adelante los grupos de seguridad de AWS también tendrán esta funcionalidad, pero no a partir de ahora.

Napster_X
fuente
1

Si solo necesita incluir algunas IP en la lista negra, probablemente podría usar nginx_http_access_module en su servidor web.

Sebastián cruz
fuente
El principal problema con esto es que necesito descubrir cómo hacerlo "automáticamente", ya que todas mis configuraciones son administradas por Chef. Necesito algo como fail2ban o denyhost para decirle a alguna configuración de Chef que bloquee algunas direcciones IP ...
boris quiroz
1

Para eso, la mejor solución es, como usted dijo, IPtables en las 3 máquinas diferentes.

En realidad, esa no es una buena solución, ya que la IP remota ( $remote_addren Nginx) será del equilibrador de carga de Amazon. Prohibición que resultará en la prohibición de todo el tráfico reenviado.

Tendrá que inspeccionar los paquetes y encontrar el X-Forwarded-Forencabezado HTTP , IPtables no es consciente del protocolo de esa manera.

Me conformé con la siguiente solución para 2 IP traviesas en 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;
}

Introduciendo una variable $client_ip, solo para que también pueda probar esto localmente, donde no hay http_x_forwarded_fordisponible ...

Ligeramente fuera de tema pero publicado por conveniencia, también agregué esa ip del cliente a mis registros de acceso:

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;

No es bonito, pero espero que ayude

kvz
fuente