Protegendo seu servidor com IPTables

(Last Updated On: 7 de agosto de 2017)

Estamos configurando um novo servidor de banco de dados aqui na Alura para armazenar os dados dos alunos. Na reunião ficou decidido, por questões de segurança que:

  • Para que usuários maliciosos, ou vírus, não encontrem nossa máquina, não será possível realizar ping;
  • Para prevenir de hackers , ou vírus, tentar acessar nosso banco vamos bloqueá-lo de acessos remotos.

Legal, já que temos essas duas tarefas, começaremos pelo ping. Antes de tentarmos bloquear o ping, vamos verificar se o mesmo funciona, fazendo nossa máquina pingar (ping) o nosso servidor (192.168.0.1):

Viram? Nosso servidor está respondendo as requisições ping…

Como a resposta ao ping já vem habilitada por padrão na maioria das distribuições Linux, principalmente nas destinadas a serem servidores, precisamos bloqueá-las. Mas como podemos fazer isso?

Bloqueando o ping com o iptables

Bom, para bloquear o ping precisamos de uma ferramenta capaz de barrar protocolos, ou acesso a portas.

Para barrá-los vamos construir uma parede (firewall), na qual conterá regras que irão bloquear essas requisições. No Linux nós temos o iptables para resolver isso.

Para isso, temos que estar logados como superusuário, ou seja, como root. Feito isso vamos usar o iptables, inserir uma nova regra (-I) que entrará (INPUT) no servidor , no topo da nossa tabela de regras, isto é, na posição 1:

# iptables -I INPUT 1

Agora que indicamos a nossa ação de bloqueio, precisamos adicionar mais algumas informações para especificar o nosso objetivo, isto é, bloquear o ping.

Como o ping funciona pelo protocolo ICMP, é ele que vamos indicar. Sendo assim, vamos bloquear o protocolo (-p) ICMP (icmp):

# iptables -I INPUT 1 -p icmp

Temos também que informar o tipo que queremos bloquear no protocolo, que no caso é a resposta do servidor --icmp-type echo-request, após isso, definimos a ação (-j) para bloquear (DROP) os pacotes :

# iptables -I INPUT 1 -p icmp --icmp-type echo-request -j DROP

Note que o nosso comando é um pouco grande, será que funciona? Vamos testar:

Bom, ele executou, mas como podemos ter certeza que está funcionando? Testando, né? Portanto, faremos novamente o teste do ping:

Note que agora ele não responde mais ao ping! Ou seja, resolvemos a nossa primeira necessidade. Agora, se alguém tentar pingar o nosso servidor, ele não será encontrado.

Vamos dar uma olhada na nossa tabela e ver a regra que acabamos de criar.

Para o iptables mostrar a tabela de regras, basta falarmos para ele listar (-L) a tabela que queremos, no nosso caso é a tabela de entrada (INPUT).

# iptables -L INPUT

Nossa regra já está na tabela.

Porém, o nosso banco dados ainda não foi bloqueado, portanto, a gente precisa fazer isso agora.

Bloqueando uma porta com o iptables

Estamos utilizando um banco de dados MariaDB.

Em geral, a instalação pergunta se desejamos permitir ou não o acesso a outras máquinas. Com isso você já pode se proteger. Senão vamos nos proteger agora autorizando o acesso somente a máquina local. Mas como podemos bloquear um banco dados?

Para acessar um banco de dados, precisamos informar o endereço dele, junto da sua porta. Como iremos acessar internamente, o endereço será o nosso localhost, isto é, a nossa máquina local e, no caso, queremos que o acesso local seja realizado.

Em outras palavras, precisamos apenas bloquear a porta que dá acesso ao serviço do banco, pois, dessa forma, garantimos que ninguém o acesse.

O comando para bloquear uma porta é parecido com o anterior. A diferença é que precisamos informar a porta que desejamos bloquear.

Neste caso, é a porta de destino da requisição. Então basta informar o --destination-port junto do número, que para o banco de dados MariaDB é 3306.

# iptables -I INPUT 1 -p tcp --destination-port 3306 -j DROP

Se alguém tentar acessar remotamente nosso banco de dados obterá fracasso:

Agora nosso banco de dados está bloqueado dos acessos externos. Ele só será acessado do próprio servidor, ou então, se alguém acessar o servidor remotamente.

Muito bem! Conseguimos bloquear a porta. Vamos agora tentar acessar nosso banco diretamente do nosso servidor:

“Hum… por quê não conseguimos acessar nosso banco?”

Quando bloqueamos o acesso a porta de todas as máquinas, isso inclui a nossa própria.

Liberando acesso de um endereço a uma porta

Para resolver esse problema, precisamos apenas permitir o acesso do nosso próprio servidor.

O comando para isso é parecido com o de bloquear. A única diferença é que, após informarmos a porta, precisamos dizer o endereço de origem (-s), que no nosso caso é o localhost, ou seja, o 127.0.0.1. Lembrando que ao invés de bloquear (DROP), precisamos aceitar requisições, portanto ACCEPT.

Novamente, o comando completo fica assim:

# iptables -I INPUT 1 -p tcp --destination-port 3306 -s 127.0.0.1 -j ACCEPT

Mas se eu colocar INPUT 1, não vai sobrescrever a outra regra?

O comando -I insere uma nova regra, logo, quando digitarmos o comando acima, ele ficará na primeira posição de nossa tabela de regras, enquanto o que estava nessa posição irá para a segunda.

Vamos listar nossa tabela novamente para ter certeza disso:

# iptables -L INPUT

Viram? Nossas três regras estão na tabela do firewall.

Bom agora que já temos todas as regras criadas podemos falar para o iptables salvá-las. Então iptables-save para salvá-las.

Agora todas as nossas regras estão salvas no servidor.

Pontos de atenção

Vale lembrar que o Linux é um sistema case sensitive, isto é, letras maiúsculas e minúsculas são diferenciadas. Mudar um parâmetro pode fazer o comando não funcionar como esperado.

Também temos que lembrar que todos os comando acima são feitos como superusuário, ou seja, precisamos utilizar o sudo ou estar logados como root para funcionar.

Vale lembrar também que é preciso cuidado ao executar comandos como superusuário para não comprometer o sistema.

Conclusão

Nesse post vimos como configurar um firewall no Linux utilizando o iptables. Bloqueando tanto um protocolo, quanto uma porta. Também vimos como aceitar a requisição de um endereço IP.

E aí, o que achou? Já sabia dessas técnicas? Conhece outras? Compartilhe conosco nos comentários. 🙂

Gostou do IPTables? Esse é apenas o começo quando falamos de segurança. Existem muitas coisas mais.

Aqui na Alura temos um curso de segurança de redes com iptables e pfSense!

Nele você vai aprender a configurar um firewall para proteger seu servidor de possíveis ataques e ameaças, como trabalhar com virtualização, proteger sua instância na Amazon EC2 e muito mais.

FIQUE POR DENTRO

Próximo ArtigoCriando componentes CSS com o padrão BEM