Negar endereço IP no AWS ELB


10

Eu tenho, mais ou menos, a seguinte configuração na AWS:

Balanceador de carga elástico com 3 máquinas ou 3 zonas de disponibilidade diferentes. Meu grupo de segurança permite 0.0.0.0/0:80, pois é meu aplicativo de trilhos (nginx, unicorn).

Eu queria saber se há alguma maneira de negar o acesso ao meu aplicativo para um endereço IP público específico? Eu tenho lido a documentação da AWS, mas como os SGs "negam tudo", não há como negar apenas um endereço IP específico.

Alguma ideia? iptables nas 3 máquinas atrás do balanceador de carga?

Obrigado!

Respostas:


16

Uma solução direta é usar uma regra de entrada da ACL de rede da VPC. Isso funciona apenas se o seu ELB estiver em uma VPC, mas se você o tiver criado nos últimos anos, deverá estar no padrão.

Para banir o 1.2.3.4, por exemplo, faça o seguinte:

  1. Faça login na AWS.
  2. Navegue para VPC.
  3. Escolha Network ACLsno menu à esquerda.
  4. Escolha a ACL associada à VPC em que seu ELB está.
  5. Escolha a Inbound Rulesaba
  6. Escolha Edite adicione uma nova regra com os seguintes atributos:
    • Regra #: 50 (qualquer número, desde que seja menor do que a regra que PERMITE DE TODOS)
    • Tipo: Todo o tráfego
    • Protocolo: ALL
    • Faixa de portas: ALL
    • Fonte: 1.2.3.4/32
    • Permitir / Negar: DENY

Há muito mais informações sobre ACLs de rede aqui: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html


1

Não, não há opção para bloquear IPs com o grupo de segurança.

O grupo de segurança é essencialmente uma lista branca, em vez de lista negra.

Tudo é negado por padrão e você pode abrir portas seletivamente de acordo com sua necessidade, mas não pode bloquear pessoas / ip específicos.

Para isso, a melhor solução é, como você disse, tabelas de IP nas três máquinas diferentes.

Tenho certeza de que daqui para frente os grupos de segurança da AWS também terão essa funcionalidade, mas não a partir de agora.


1

Se você só precisar colocar alguns IPs na lista negra, provavelmente poderá usar o nginx_http_access_module no seu servidor da web.


O principal problema disso é que preciso descobrir como fazê-lo "automagicamente", pois todas as minhas configurações são gerenciadas pelo Chef. Eu preciso de algo como denyhost fail2ban ou para contar alguma configuração Chef bloquear alguns endereços IP ...
Boris Quiroz

1

Para isso, a melhor solução é, como você disse, tabelas de IP nas três máquinas diferentes.

Na verdade, essa não é uma boa solução, pois o ip remoto ( $remote_addrno Nginx) será do loadbalancer da Amazon. A proibição resultará na proibição de todo o tráfego encaminhado.

Você terá que inspecionar os pacotes e encontrar o X-Forwarded-Forcabeçalho HTTP , o IPtables não tem conhecimento de protocolo assim.

Eu resolvi a seguinte solução para 2 IPs impertinentes no 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;
}

Introduzindo uma variável $client_ip, apenas para que eu também pudesse testar isso localmente, onde não há http_x_forwarded_fordisponível.

Ligeiramente offtopic, mas postando por conveniência, também adicionei o IP do cliente aos meus logs de acesso:

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;

Não é bonito, mas espero que ajude

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.