De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: José Messias Alves da Silva
Data de Publicação: 02 de abril de 2008
Atualmente, vivemos em uma contínua guerra virtual, onde tentativas de invasão
são frequentes não só em ambientes corporativos como também em ambientes
domésticos. Assim, pretende-se mostrar aqui como se pode implementar um
pequeno firewall pessoal como base no iptables
, o filtro de pacotes
instalado por padrão em todas as distribuições de GNU/Linux, com o intuito de
aumentar a segurança das estações de trabalho de usuários domésticos. Para
tanto, utilizar-se-á apenas a tabela filter
do iptables
, visto que
para este caso as demais tabelas são desnecessárias.
Vale ressaltar que nessa dica não há uma rigidez na construção das regras para o firewall, visto que o que pode ser bom para um certo usuário pode não ser bom para outro.
Entretanto, a intenção aqui é procurar apresentar um conjunto comum de regras aplicáveis a todos, podendo posteriormente, de acordo com o usuário, ser realizado apenas algumas adaptações.
A dica baseia-se na distribuição Debian, porém, pode ser utilizada para todas
as distribuições. Como requerimentos, caso ainda não estejam carregados,
será necessário o acréscimo dos módulos do Kernel ip_tables
e ipt_LOG
# modprobe ip_tables # modprobe ipt_LOG
O primeiro passo é verificar quais são os serviços que estão sendo executados na estação já que, em geral, de acordo com a instalação de uma dada distribuição, certos serviços já estarão rodando, tais como:
sshd |
Secure Shell Server, serviço de terminal remoto seguro. |
http |
Servidor web Apache |
rpcbind |
utilizado por alguns serviços de arquivos, como NFS. Seu uso deve ser evitado. |
Para tanto, pode-se fazer uso das ferramentas netstat
ou nmap
.
Tendo nmap
instalado na máquina, pode-se executar o seguinte comando
para identificar os serviços e portas abertas na estação:
# nmap -sS Nome_da_sua_Maquina ou Seu_endereco_IP
Starting Nmap 4.50 ( http://insecure.org ) at 2008-03-18 17:18 BRT
Interesting ports on Sua_Maquina (Seu endereco_IP):
Not shown: 1704 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
113/tcp open auth
Nmap done: 1 IP address (1 host up) scanned in 0.671 seconds
Pela saída do comando, podemos observar que há na estação os serviços
ssh
, o servidor web Apache (http
), o serviço rpcbind
(Remote Procedure Call, Chamada Remota de Procedimentos),
utilizado pelo NFS para montar uma unidade remotamente. Há, também, o
serviço auth
, que é utilizado para identificação e autorização, muito
freqüentemente usado por servidores de notícias, IRC (Internet Relay Chat)
ou Correio.
Todos esse serviços da estação estão abertos a conexões provenientes de outras
máquinas e, em geral, não se necessita disponibilizá-los, exceto feita
ao serviço ssh
, que poderá ser necessário para se conectar a partir de
uma outra máquina e que se costuma liberar apenas se esta tiver um endereço
IP fixo.
Assim, é necessário apenas escolher quais serviços se deseja disponiblizar o acesso externo. Para esta dica foi escolhido o seguinte esquema de filtragem:
localhost
ou endereço IP 127.0.0.1
.
rcpbind
, http
e auth
devem ser bloqueadas.
192.168.0.10
.
Nota: Convém comentar (para os leitores iniciantes) sobre os termos
new
, established
e related
, relacionados ao protocolo TCP. TCP é um
protocolo orientado a Conexão. Por Orientado a Conexão entende-se que todos os
pacotes chegarão ao destino, sem qualquer perda de pacotes em trânsito. Caso
um pacote seja perdido, há a retransmissão do mesmo. Essas propriedades são
obtidas por meio de um conjunto de flags. As principais flags são SYN
(SYNchronize, Sincronizar) e ACK
(ACKnowledge, Confirmar). Por
exemplo, quando se clica em um determinado link no navegador, seu
computador envia um pacote SYN
para o servidor remoto que hospeda o
link. Esse processo é o ínicio de nova conexão, representado por NEW
.
Quando o servidor recebe o pedido que tem a flag SYN
, envia um aviso
de confirmação de volta para a sua máquina, fixando a ele uma flag
SYN-ACK
. Podemos chamar essa etapa de "relacionamento" da conexão,
representada por RELATED
. Assim que a sua máquina recebe o pacote
SYN-ACK
, ela responde com um pacote ACK
final, que informa a máquina
remota que o pacote foi realmente recebido. Nesse momento, a conexão está
estabelecida, o que se representa por ESTABLISHED
.
Esse mecanismo é chamado de Three-Way-Handshake.
NEW
) para a estação a partir
de uma máquina remota, ou seja, conexões só devem ser iniciadas pela estação.
Permitir a localhost
acesso a tudo
iptables -A INPUT -s 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT
Permitir todas conexões tcp estabelecidas e já relacionadas a alguma conexão para a máquina
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Permitir acesso pelo protocolo udp apenas para o servidor DNS, supondo que este seja 192.168.0.1
iptables -A INPUT -p udp -s 192.168.0.1 -j ACCEPT
Permitir acesso SSH apenas a partir do IP 192.168.0.10
iptables -A INPUT -p tcp -s $IP_LIBERADO --dport 22 -j ACCEPT
Permitir todas as conexões de saída a partir da máquina
iptables -A OUTPUT -j ACCEPT
Deste ponto em diante, colocar-se-á Regras de Negação.
Negar todas as novos conexões tcp a partir de máquinas remotas, registrando as tentativas.
iptables -A INPUT -p tcp -m state --state NEW -j LOG iptables -A INPUT -p tcp -m state --state NEW -j DROP
Bloquear a porta 80 do servidor web Apache da máquina e, da mesma forma, também registrar as tentativas de conexão.
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j LOG iptables -A INPUT -p tcp -s 0/0 --dport 80 -j DROP
Nota: A regra LOG
sempre deve anteceder a respectiva regra de filtragem.
Bloquear os demais acessos a SSH para a máquina, registrando tentativas.
iptables -A INPUT -p tcp -s 0/0 --dport 22 -j LOG iptables -A INPUT -p tcp -s 0/0 --dport 22 -j DROP
Por fim, negar tudo que não se enquadrar em nenhuma das regras.
iptables -A INPUT -j DROP iptables -A FORWARD -j DROP
Para automatizar, cria-se um arquivo em /etc/init.d/firewall
com o
seguinte contéudo:
#!/bin/sh # # Exemplo de script Firewall Pessoal para GNU/Linux 2.6.x e iptables # # por Jose' Messias Alves da Silva # # LO_IFACE="lo" LO_IP="127.0.0.1" IP_LIBERADO="192.168.0.10" DNS="192.168.0.1" IPTABLES="/sbin/iptables" case "$1" in start) echo -e 'Iniciando Firewall Pessoal..\n' # Carregando os Modulos do Kernel modprobe ip_tables modprobe ipt_LOG # LocalHost - Aceita todos os pacotes $IPTABLES -A INPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -j ACCEPT $IPTABLES -A INPUT -p udp -s $DNS -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -p tcp -m state --state NEW -j LOG $IPTABLES -A INPUT -p tcp -m state --state NEW -j DROP $IPTABLES -A INPUT -p tcp -s 0/0 --dport 80 -j LOG $IPTABLES -A INPUT -p tcp -s 0/0 --dport 80 -j DROP # Permitir acesso SSH apenas a partir do IP 192.168.0.10 $IPTABLES -A INPUT -p tcp -s $IP_LIBERADO --dport 22 -j ACCEPT #As demais tentativas a SSH, negar $IPTABLES -A INPUT -p tcp -s 0/0 --dport 22 -j LOG $IPTABLES -A INPUT -p tcp -s 0/0 --dport 22 -j DROP # Negar tudo que nao se enquadrar nas regras anteriores $IPTABLES -A INPUT -j DROP $IPTABLES -A FORWARD -j DROP echo -e 'Firewall Pessoal Iniciado ..\n' ;; stop) echo -e 'Parando Firewall Pessoal ..\n' # Limpando regras $IPTABLES -F ;; restart) echo -e 'Reiniciando Firewall Pessoal, aguarde ..\n' $0 stop sleep 2 $0 start ;; *) echo "Sintaxe: $0 [ start | stop | restart ]" ;; esac
Após a criação do arquivo, é necessário torná-lo executável:
# chmod +x /etc/init.d/firewall
Por fim, digita-se o seguinte comando para criar os links simbólicos nos diretórios de inicialização:
# update-rc.d firewall defaults
Para iniciar o firewall, basta executar:
# /etc/init.d/firewall start
ou
# invoke-rc.d firewall start
Enfim, após a inicialização/execução do script as regras estarão carregadas no kernel, tendo se implementado um excelente firewall pessoal. Pode-se verificar se as regras foram corretamente aplicadas executando novamente o comando nmap, que mostrará que as portas estão filtradas pelo firewall:
# nmap -sS Nome_da_sua_Maquina ou Seu_endereco_IP -p 22,80,111,113
Ou simplesmente listando as regras utilizadas por meio do comando:
# iptables -L
Ademais, essa dica serve para os usuários perceberem a importância da segurança também em suas estações, incentivar e estimular a criação de firewalls pessoais bem mais poderosos.
José Messias Alves da Silva é Matemático, Cientista da Computação pela UFPI, Especialista em Administração em Redes Linux e Coordenador Geral do Grupo de Usuários Debian do Piauí.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários