Eu tenho tentado montar um script básico do iptables do servidor que funcione para a maioria dos sites executando apenas um servidor da Web básico usando HTTP (S) e SSH (portas 80, 443 e 22). Afinal, a maioria dos VPS só precisa dessas regras de portas iniciais e pode adicionar portas de correio ou de jogo posteriormente, conforme necessário.
Até agora, tenho o seguinte conjunto de regras e fiquei pensando se alguém sabe de um script melhor ou de alguma melhoria que possa ser adicionada.
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections (only 4 attempts by an IP every 3 minutes, drop the rest)
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
O iptables é uma das partes mais importantes da segurança de sua caixa (veja também fail2ban) e, no entanto, existem muitas pessoas como eu que têm problemas para entender tudo o que é necessário para criar um firewall básico seguro para nossos servidores.
Qual é a maneira mais segura de abrir apenas as portas básicas necessárias para um servidor da web?
Atualização: cyberciti.biz possui outro script iptables que parece muito bom.
Além disso, em vez de usar Denyhosts ou fail2ban, você pode usar o próprio iptables para bloquear tentativas repetidas incorretas de SSH .
modprobe
não estiver instalado (ou houver outro erro antes de abrir a porta 22), você ficará fora do servidor.Respostas:
A maneira mais segura de trabalhar com o iptables é fechar tudo e abrir apenas o que você precisa. Estou meio distraído, por isso sempre tento ser o mais preguiçoso possível, para não cometer erros que possam levar o servidor a ficar inseguro.
Eu uso este, apenas um pouco de atribuição variável deve ser feito para que ele funcione.
Eu o uso há algum tempo, e qualquer tipo de modificação será muito apreciada se facilitar a administração.
fonte
Parece bom, mas você pode apertar um pouco mais as coisas. O sinalizador -s é o IP de origem ou o nome de domínio e você adiciona "-s 198.23.12.32" ou qualquer que seja o seu endereço IP para permitir apenas o SSH do seu IP de origem. Você também pode escolher um intervalo de IPs de origem usando a notação de estilo CIDR .
Você deve ter cuidado ao registrar chamadas negadas. O endereço IP do seu servidor será verificado por bots, scripts de crianças, etc., e o arquivo de log poderá ficar grande rapidamente. A menos que você esteja tentando diagnosticar um problema específico que você acha que pode estar relacionado a alguém tentando quebrar seu firewall, eu removeria essa opção.
Você também pode vincular o fail2ban ao iptables para um pseudo-IDS. O fail2ban verificará seus arquivos de log e poderá bloquear um IP se tentarem entrar no sistema. Por exemplo, se um determinado endereço IP falhar ao efetuar login no SSH 5 vezes, você poderá bloqueá-lo por um dia inteiro. Ele também funciona em FTP e em muitos outros (incluindo bots ruins atingindo o Apache). Eu o uso em todos os meus servidores para fornecer uma proteção extra contra ataques de força bruta.
fonte
Dê uma olhada no Shorewall. A configuração padrão da interface única seria um bom ponto de partida. É fácil de configurar e possui macros para coisas como SSH e acesso à Web. Pode ser configurado para bloquear o servidor no nível desejado quando o firewall é desligado. Com o Shorewall-lite, você pode executar uma compilação de firewall em outro servidor. É fácil configurar o registro no nível desejado.
Para um servidor HTTP básico, você deseja abrir o acesso recebido às portas 80 e 443 se usar HTTPS. O acesso SSH de alguns endereços restritos é geralmente desejado. Você também pode bloquear o acesso de saída. Abra o firewall apenas para servidores e serviços necessários. NTP e DNS devem ser abertos, bem como um canal para buscar patches.
fonte
Eu diria que esse é um firewall muito bom, exceto que ele é voltado para interromper o tráfego de entrada e não se concentra no tráfego de saída ou de saída. Em muitos casos, é tão importante se concentrar nas conexões de saída de uma caixa quanto nas de entrada. No infeliz caso em que a máquina é realmente explorada, seria bom impedir o download de kits raiz adicionais ou a conexão com nós de comando e controle, ou o que seja.
BillThor começou a falar sobre isso acima, mas estou apenas respondendo com exemplos específicos. Uma das coisas boas do iptables é que ele pode se lembrar do estado da conexão, isso pode ter implicações no desempenho em sites com tráfego intenso, mas você pode alterar seu acesso de entrada no http / https para permitir apenas respostas em conexões estabelecidas, por exemplo, ou limitar especificamente certos privilégios não privilegiados usuários de ter acesso de saída. Então, suas regras de saída teriam cláusulas RELACIONADAS, ESTABELECIDAS, que impediriam toda uma série de ataques auxiliares e retardariam os que exigem um estágio secundário para realmente explorar uma caixa, o que é muito comum.
Finalmente, eu diria que é melhor definir a política do iptables -P DROP em vez de ter um REJECT anexado no final. É principalmente uma questão de preferência, mas pode reduzir erros ao anexar a cadeias com regras existentes em vez de inserir ou liberar / reiniciar.
fonte
-A INPUT -j REJECT
para-A INPUT -P DROP
?