Aceitar RELACIONADO, ESTABELECIDO para todas as fontes nas tabelas de ip é considerado "muito aberto"?


9

Eu sempre vi a regra -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTaplicada. Embora eu não seja um especialista, essa linha em particular me preocupa. É bastante óbvio que a regra permite todo o tráfego, com a única exceção de que a conexão deve ter sido estabelecida ou relacionada a uma conexão estabelecida.

Cenário

  • Permitirei conexões à porta SSH padrão 22da LAN dos servidores na sub-rede 192.168.0.0/16ou o que for.
  • SuperInsecureApp®expõe algo na porta 1337, que eu adiciono à minha INPUTcadeia.
  • Eu adicionei a conntrackregra para aceitar ESTABLISHEDe RELATEDde todas as fontes
  • A política da cadeia é DROP

Então, basicamente, esse shoud de configuração permite conexões SSH apenas da LAN, enquanto permite tráfego de entrada na porta 1337 do mundo.

É aqui que minha confusão floresce. Exporia de conntrackalguma forma uma falha de segurança que permitiria obter uma conexão estabelecida em 1337 (já que é mundial), e depois utilizaria essa conexão para obter acesso à porta SSH (ou a qualquer outra porta)?

Respostas:


8

Eu não consideraria o tráfego ESTABELECIDO e RELACIONADO muito aberto. Você pode omitir RELATED, mas definitivamente deve permitir ESTABELECIDO. Ambas as categorias de tráfego usam estados conntrack.

As conexões ESTABELECIDAS já foram validadas por outra regra. Isso torna muito mais simples implementar regras unidirecionais. Isso apenas permite que você continue transações na mesma porta.

Conexões RELACIONADAS também são validadas por outra regra. Eles não se aplicam a muitos protocolos. Novamente, eles tornam muito mais simples a configuração de regras. Eles também garantem o seqüenciamento adequado das conexões onde se aplicam. Isso realmente torna suas regras mais seguras. Embora isso possibilite a conexão em uma porta diferente, essa porta deve fazer parte apenas de um processo relacionado, como uma conexão de dados FTP. Quais portas são permitidas são controladas por módulos conntrack específicos do protocolo.

Ao permitir conexões ESTABELECIDAS e RELACIONADAS, você pode se concentrar em quais novas conexões deseja que o firewall aceite. Também evita regras quebradas destinadas a permitir o tráfego de retorno, mas que permitem novas conexões.

Como você classificou o programa na porta 1337 como inseguro, ele deve ser iniciado usando um ID de usuário não raiz dedicado. Isso limitará o dano que alguém pode causar se conseguir quebrar o aplicativo e obter acesso aprimorado.

É altamente improvável que uma conexão na porta 1337 possa ser usada para acessar a porta 22 remotamente, mas é possível que uma conexão com a porta 1337 possa ser usada para proxy de uma conexão com a porta 22.

Convém garantir que o SSH seja protegido em profundidade:

  • Use hosts.allow para limitar o acesso, além das restrições de firewall.
  • Impeça o acesso root ou, pelo menos, exija o uso de chaves e limite seu acesso no arquivo allowed_keys.
  • Auditar falhas de logon. Um scanner de log pode enviar relatórios periódicos de atividades incomuns.
  • Considere usar uma ferramenta como fail2ban para bloquear automaticamente o acesso em falhas de acesso repetidas.

Embora este tenha sido um exemplo arbitrário, a primeira coisa que faço em novos servidores é sempre desabilitar o acesso root e a autenticação de texto sem formatação no sshd - essa é uma dica muito boa. Além disso, o fail2ban já está instalado na configuração da vida real a partir da qual o exemplo foi inspirado. "As conexões ESTABELECIDAS já foram validadas por outra regra" era exatamente o que eu não tinha certeza e responde perfeitamente à minha pergunta. Obrigado pela sua resposta muito clara!
Dencker

Pergunta paralela: Do ponto de vista do desempenho, isso muda alguma coisa se a conntrackregra estiver no início ou no fim da cadeia? Pelo que entendi iptables, ele teria que processar todas as regras em conexões estabelecidas se elas estivessem no final, e somente essa regra única se fosse colocada no início?
Dencker

@ Dencker Você deseja a regra ESTABELECIDA, RELACIONADA primeiro. Aceitará de longe o maior tráfego. Além disso, convém ter as regras que aceitam mais tráfego, embora seja melhor pesar muito para facilitar a leitura. Minhas regras são agrupadas, sensíveis à latência, alto tráfego (agrupadas por tipo), outras. O Iptables possui contadores que permitem ver quanto tráfego cada regra procede. Eu uso o Shorewall, que adiciona alguns padrões úteis e possui um arquivo de regras de fácil leitura para criar meus firewalls.
BillThor

2

ESTABELECIDO e RELACIONADO são recursos da filtragem de pacotes "com estado", em que a filtragem não depende apenas de um conjunto de regras estático, mas também do contexto em que os pacotes são considerados. Você precisa de ESTABELECIDO para permitir que as conexões funcionem, e precisa de RELATED para mensagens relevantes de ICMP. A filtragem com estado permite filtrar com mais precisão em comparação com as regras estáticas "sem estado".

Vejamos primeiro ESTABELECIDO. Por exemplo, considere o TCP na porta 22. O iniciador (cliente) envia um SYNpara serverIPaddr:22. O servidor retorna SYN+ACKao cliente. Agora é a vez do cliente enviar um ACK. Como deve ser a regra de filtragem no servidor, de modo que apenas a "correspondência" ACKseja aceita? Uma regra sem estado geral seria semelhante a

-A INPUT --proto tcp --port 22 -j ACCEPT

que é mais liberal do que a regra de estado de acordo. A regra sem estado permite segmentos TCP arbitrários, por exemplo, ACKou FINsem ter estabelecido uma conexão primeiro. Os scanners de portas podem explorar esse tipo de comportamento para impressões digitais do SO.

Agora vamos dar uma olhada em RELATED. Isso é usado para mensagens ICMP, principalmente mensagens de erro. Por exemplo, se um pacote do servidor para o cliente for descartado, uma mensagem de erro será enviada ao servidor. Essa mensagem de erro está "relacionada" à conexão estabelecida anteriormente. Sem a regra RELATED, seria necessário permitir mensagens de erro recebidas em geral (sem contexto) ou, como é costume em muitos sites, eliminar completamente o ICMP e aguardar o tempo limite na camada de transporte. (Observe que essa é uma má ideia para o IPv6; o ICMPv6 desempenha um papel mais importante para o IPv6 do que o ICMP para o legado do IP.)

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.