iptables - OK, ** agora ** estou fazendo certo?

5

Esta é uma continuação de uma pergunta anterior onde perguntei se minha configuração do iptables está correta.

Sistema CentOS 5.3.

Resultado pretendido: bloqueia tudo, exceto ping, ssh, Apache e SSL.

Com base no conselho do xenoterracide e nas outras respostas à pergunta (obrigado pessoal), criei este script:

# Establish a clean slate
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F # Flush all rules
iptables -X # Delete all chains

# Disable routing. Drop packets if they reach the end of the chain.
iptables -P FORWARD DROP

# Drop all packets with a bad state
iptables -A INPUT -m state --state INVALID -j DROP
# Accept any packets that have something to do with ones we've sent on outbound
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Accept any packets coming or going on localhost (this can be very important)
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp -j ACCEPT

# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Block all other traffic 
iptables -A INPUT -j DROP

Agora, quando listo as regras, obtenho ...

# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  any    any     anywhere             anywhere            state INVALID 
    9   612 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh 
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:http 
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:https 
    0     0 DROP       all  --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5 packets, 644 bytes)
 pkts bytes target     prot opt in     out     source               destination

Eu corri e ainda consigo logar, então é bom. Alguém notou algo importante fora de moda?

    
por Agvorth 15.11.2009 / 07:41

3 respostas

3

Parece bom para a maior parte. A principal coisa é que você provavelmente deve usar o iptables-save e o iptables-restore em vez de executar repetições do iptables. O método iptables-save / restore fornece atualizações em massa atômicas (como uma transação de banco de dados), para que você saiba que nada pode entrar (ou NÃO entrar) porque suas alterações no iptables foram concluídas pela metade quando os pacotes de rede chegaram. Essa alteração também permitirá que você elimine as políticas ACCEPT iniciais, de modo que apenas defina a política preferencial (preferencialmente para DENY) e, em seguida, as regras individuais (exceções que são ACEITAS).

Além disso, você pode querer olhar um pouco mais para o ICMP (em vez de permitir tudo). Ouvi dizer que alguns aspectos do ICMP são bastante duvidosos nos dias de hoje. Pessoalmente, não acho que valha a pena, já que muitas coisas de gerenciamento de tráfego e diagnóstico dependem do ICMP.

Sobre o comentário de womble "don't use iptables": Eu não iria tão longe a ponto de dizer que você não deveria usar o iptables (ou iptables-save / restore) diretamente, mas eu recomendaria olhar para o FERM. É essencialmente apenas iptables, com uma linguagem mais expressiva e menos repetitiva, além de suporte variável. Por exemplo, seus comandos do iptables:

iptables -P INPUT ACCEPT
...
# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Ficaria mais parecido com isso no ferm:

# allow some incoming TCP
chain INPUT {
    policy ACCEPT;
    proto tcp dport (ssh httpd https) ACCEPT;
}

Muito melhor, né? ;)

Por fim, NÃO execute o SSH na porta padrão de 22. Mova-o para outro endereço (edite o arquivo de configuração e recarregue o sshd). Você pode fazer isso mesmo enquanto estiver conectado através de ssh, mas é melhor ter outro método de acesso ao mexer com regras de ssh ou firewall (baseadas em console, como fornecidas por hosts virtuais dedicados). Além disso, procure configurar algo como fail2ban eventualmente. Mas eu não usaria isso sem um IP fixo (do meu lado) e regras de firewall específicas para permitir acesso, não importando o quê, antes de qualquer bloqueio que o fail2ban faz.

    
por 15.11.2009 / 11:07
1

Parece bom, uma preferência pessoal minha seria adicionar

-m state --state NEW

para essas regras

# Allow ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Allow httpd
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Allow SSL
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

E altere a política padrão de INPUT, FORWARD para DROP, tornando

# Block all other traffic 
iptables -A INPUT -j DROP

redundante

    
por 15.11.2009 / 12:50
-1

Eu diria que se você estiver usando o iptables diretamente em todos , você não está fazendo certo.

    
por 15.11.2009 / 07:46