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.