Boas regras de partida do iptables para um servidor web?


12

Estou instalando um novo servidor centos 5.4 e gostaria de ter um conjunto de regras limpas para a inicialização do mu iptables.

Quais seriam as boas regras para começar?

Este é um bom ponto de partida:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Para qual é essa regra:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

ATUALIZAÇÃO:

Será um servidor web com FTP (obrigatório), apache, SSH, mysql.


Eu uso essa regra simples .... Feche tudo e trabalhe de trás para frente e abra o que for necessário. Para um servidor da web, a porta 80/443 normalmente é o único serviço público. Bloqueie todo o resto ou limite o acesso - por exemplo, limite o ssh para IPs especificados ou rede privada.
— jeffatrackaid

Respostas:


13

Suas regras do IPTables parecem ser mais apropriadas para o seu servidor. Mas eu sugeriria algumas mudanças possíveis:

  • A menos que você precise permitir acesso SSH, MySQL e FTP de toda a Internet, seria muito mais seguro usar a opção '--source' para restringir o acesso nessas portas somente a partir de determinados endereços IP aprovados. Por exemplo, para permitir apenas o acesso SSH a partir do endereço IP 71.82.93.101, você alteraria a quinta regra para 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Você provavelmente precisará adicionar uma regra separada para cada endereço IP individual que deseja permitir; consulte esta pergunta para obter mais informações sobre isso: iptables IPs de origem múltipla .

  • A menos que esta máquina esteja executando um servidor DNS, você provavelmente desejará bloquear o acesso à porta 'domínio' (53). Para fazer isso, basta remover a linha 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Isso também deve responder à sua pergunta final, BTW.) Se você estiver realmente executando um servidor DNS, deixe essa regra no lugar.

  • Se você precisar permitir acesso remoto ao cliente MySQL pela rede, precisará adicionar a linha 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' para abrir o acesso externo à porta MySQL padrão . Mas NÃO faça isso a menos que seja realmente necessário - se você precisar apenas de acesso local ao MySQL (para um aplicativo PHP executando no Apache, por exemplo), não precisará fornecer acesso remoto ao MySQL. E, a menos que você queira correr o risco de ser invadido, se abrir a porta 3306 para a rede, certifique-se de exigir senhas fortes para todas as contas de usuário do MySQL e que os pacotes do servidor MySQL estejam atualizados.

  • Um de seus comentários ('Permitir ssh, dns, ldap, ftp e serviços da web') menciona serviços LDAP, mas essa regra não existe em sua configuração. Isso acontece muito quando eu copio e modifico uma configuração de exemplo. Isso não afetará a função, mas eu corrigiria o comentário, pois comentários enganosos podem causar indiretamente, confundindo você ou outro administrador no futuro.

Na minha experiência, é difícil criar um conjunto perfeito de regras do IPTables, mas acho que você definitivamente está no caminho certo. Além disso, boa sorte em aprender mais sobre o IPTables - essas regras podem parecer complexas a princípio, mas é uma habilidade muito útil para qualquer administrador de sistemas Linux.


1
Em vez de permitir o acesso remoto ao MySQL através do firewall, você pode apenas garantir que todos que precisam acessar o servidor MySQL tenham o direito de encaminhar a porta SSH.
— Pt

Os encaminhamentos de porta SSH são uma alternativa potencial para abrir a porta e bloquear as permissões do MySQL. Mas, a menos que ele esteja lidando com dados confidenciais e / ou seja um alvo de alto perfil (o que tornaria os recursos de criptografia do SSH úteis), não vejo a vantagem. Afinal, o encapsulamento SSH tem suas próprias desvantagens, incluindo: aborrecimentos de instalação / configuração; aumento da utilização da CPU e limitação da largura de banda (devido ao tamanho do buffer estático do OpenSSH). E se ele não quiser que todos os seus clientes remotos do MySQL tenham logins locais?
— Ryan B. Lynch

No que diz respeito aos comentários que não correspondem às regras, as regras do ICMP permitem traceroutes, descoberta de PMTU e outras mensagens úteis, mas não permitem pings (solicitação de eco e resposta de eco).
— Gerald Combs

Gerald, é uma boa pegada, eu nem percebi isso. Ele provavelmente deve alterar o comentário para observar que o ping NÃO é permitido ou deve adicionar regras que permitam o tráfego de solicitação / resposta de eco do ICMP.
— Ryan B. Lynch

4

Definitivamente, procure restringir também o tráfego de saída.

Eu já vi muitos casos em que as explorações do PHP resultam em alguém usando 'curl' ou 'wget' para buscar código malicioso de outro lugar e depois executá-lo no seu servidor para ingressar em uma botnet.

Se você não espera que o Apache (como exemplo) precise conversar com outros sites, restrinja o tráfego e economize um pouco de dor na linha!


2

Essas regras estão prontas para serem importadas via "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

E só para constar ... essas políticas padrão também devem ser definidas, SE o iptables-restore acima não for usado:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Editei sua postagem - o StackOverflow é um formato de pergunta / resposta. Por favor, leia o FAQ: stackoverflow.com/faq
— 89c3b1b8-b1ae-11e6-b842-48d705

Isso apresentará problemas de desempenho, já que a regra de estado aparece por último aqui e deve aparecer primeiro, pois corresponde à grande maioria dos pacotes.
— Michael Hampton

0

Por que você permite ftp e dns? O seu servidor fornece esses serviços? O FTP não deve realmente ser usado, exceto em alguns casos de uso muito específicos, use SFTP (não o FTPS). Além disso, por que especificar todas as outras portas por nomes simbólicos e http por numérico 80? Você acabou de copiar isso de outro lugar? Nenhuma cópia e aconselhamento compensará a falta de entendimento. Certifique-se de entender TCP, IP, firewalls e os protocolos dos serviços que você irá fornecer.


Não pretendo ofender, cara, mas acho que sua resposta pode ser vista como algo descortês e condescendente. Além disso, você não está realmente respondendo à pergunta. Se o autor da pergunta não compreender, você não acha que seria melhor falar com respeito e dar-lhe alguma educação específica sobre o assunto?
— Ryan B. Lynch

Você provavelmente está correto. Meus comentários podem parecer negativos, mas não foram feitos dessa maneira. Eu estava tentando listar perguntas que acionariam processos de pensamento relevantes. E como não conheço o nível básico de compreensão, não comecei a escrever um livro. Mas você está absolutamente correto sobre o tom inútil. Felizmente, você escreveu uma resposta muito mais útil.
— Pt
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.