Protegendo seu servidor com IPTables
Estamos configurando um novo servidor de banco de dados aqui na Alura para armazenar os dados dos alunos, vamos como configurar o IPTables no nosso servidor, bloqueando protocolos, portas e permitindo acesso de uma máquina. 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 artigo 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.
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.