Ir ao conteúdo
  • Cadastre-se

[TUTORIAL] Firewall seguro no Linux (avançado)


Posts recomendados

Citar

NOTA: Para baixar todos os comandos de uma vez e poder colar no terminal (DESATUALIZADO): http://pastebin.com/UsufFHFk

 

NOTA 2: Esse tutorial não destinado a iniciantes. Não prossiga se não souber como reverter as alterações.

 

NOTA 3: Essa configuração é usada por mim mesmo, estou mais que aberto a sugestões, críticas ou melhoramentos.

 

NOTA 4: Esse Firewall é para computadores domésticos, e não para servidores.

 

Sim, o Linux é seguro e todos nós sabemos disso. Mas não podemos deixar de comentar sobre o Firewall do mesmo (netfilter) e sobre como configurá-lo de forma correta.

 

Por padrão, o netfiler e sua front-ent Iptables estão configurados para aceitar qualquer conexão, tanto de entrada quanto de saida. Isso para mim é um absurdo pois basta um serviço vulnerável e "BUM", um cracker pode já ter invadido seu sistema.

Tendo isso em vista eu sempre configurei o meu iptables da forma mais segura que eu conseguia em um curto período de tempo, mas quando comecei a jogar com a Steam percebi que seria impossível criar regras para os jogos pois alguns usam portas dinâmicas, isto é, hora usam portas 8783, hora usam 5412 (só um exemplo fictício). Foi então que tropecei no GUFW, uma ferramenta com interface gráfica que pode ser configurada tanto para negar todos os pacotes de entrada/saida quanto dinamicamente "autorizar" tudo que for relacionado a Steam. Isso não é legal? :) Ééé, não. Pelo menos pra mim. Se eu não tenho estudos mostrando  a eficácia de um produto, eu não uso, e se você olhar as configuraçoes do GUFW vai perceber que elas são beeem basicas. Como eu sou louco (laudo emitido por um psiquiatra), resolvi estudar um pouco mais a fundo o iptables para que pudesse configurá-lo da forma correta. Mas pera ai, e a Steam? Eu não uso mais, não jogo mais e provavelmente vou ficar um tempão sem usar.

 

Resolvi criar uma configuração segura e ao mesmo tempo fácil de ler por qualquer ser humano. Ela funciona, é segura, e tudo que você precisa fazer é COPIAR e COLAR os comandos que vou descrever (com algumas alterações necessárias). Simples não?

Mãos a obra.

 

Vou começar explicando que é possível criar Grupos de regras no iptables para que fique mais fácil juntar tudo e facilitar as coisas. Exemplo: posso criar um grupo chamado "pacotes inválidos" e direcionar várias regras sobre pacotes inválidos para esse grupo, e esse grupo tem um só comando no final (exemplo: DROP, ou ACCEPT). Isso facilita muito a criação dos logs também. Aqui vai um exemplo:

# anti-spoof
iptables -N In_RULE_0
iptables -A INPUT -i enp0s7   -s amarildo   -j In_RULE_0
iptables -A In_RULE_0  -j LOG  --log-level info --log-prefix "RULE 0 -- DENY "
iptables -A In_RULE_0  -j DROP

A primeira linha está COMENTADA, ou seja, tem um sustenido na frente (#, mais conhecido como "Hashtag") e isso significa que essa linha não será executada. Eu dei um nome a essa regra para facilitar, "Anti spoof".

 

A segunda linha cria uma regra geral (grupo) chamada "In_RULE_0". Posso criar várias regras que no fim vão cair dentro dessa regra 0, inclusive todos os Logs.

pacotes inválidos

A terceira linha especifica que tudo que vier da minha placa de rede (enp0s7) em direção ao meu PC/Hostname (amarildo) cairá na regra In_RULE_0.

(OBS: troque 'enp0s7' para sua placa de rede [eth0 ou seja lá qual for], e troque 'amarildo' pelo seu Hostname [/etc/hostname]).

 

A quarta linha informa que tudo nessa regra geral será logado. Informa também o nível de log, e o TIPO de log.

 

A ultima linha informa que todas as sub-regras criadas antes (linhas acima) sofrerão um "DROP", isto é, o Firewall vai silenciosamente negar todos os pacotes dessa regra.

 

1ª Regra - Negar tudo, e ir abrindo aos poucos

 

O segredo de todo firewall seguro é fechar todas as portas e ir abrindo as que você precisa. Isso é seguro, e deve ser seguido em vez de abrir tudo e fechar o que você não precisa (esse último é errado e necessita de muito mais atenção, e portanto pode levar a ERROS).

 

Vamos então bloquear tudo.

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

BLOQUEANDO DIVERSOS TIPOS DE ATAQUES

 

Vamos agora negar todas as conexões que estavam ativas antes de iniciarmos nosso firewall

iptables -A INPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP
iptables -A OUTPUT  -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP

Agora vamos negar todos os pacotes que possuem estado INVÁLIDO, e vamos dizer ao firewall que nos avise sobre isso (log)

iptables -N drop_invalid
iptables -A OUTPUT   -m state --state INVALID  -j drop_invalid 
iptables -A INPUT    -m state --state INVALID  -j drop_invalid 
iptables -A INPUT -p tcp -m tcp --sport 1:65535 --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j drop_invalid 
iptables -A drop_invalid -j LOG --log-level debug --log-prefix "INVALID state -- DENY "
iptables -A drop_invalid -j DROP

Regra anti-spoof, sendo logada qualquer tentativa de dar spoof em mim

iptables -N In_RULE_0
iptables -A INPUT -i enp0s7   -s amarildo   -j In_RULE_0 
iptables -A In_RULE_0  -j LOG  --log-level info --log-prefix "RULE 0 -- DENY "
iptables -A In_RULE_0  -j DROP

Eu bloqueio todo tipo de ICMP, assim ninguém será capaz de fazer "ping" em mim, e crio logs sobre essas tentativas

iptables -N In_RULE_1
iptables -A INPUT -p icmp  -m icmp  --icmp-type any  -j In_RULE_1
iptables -A In_RULE_1  -j LOG  --log-level info --log-prefix "RULE 1 -- DENY "
iptables -A In_RULE_1  -j DROP

Bloqueio também qualquer tentativa de fazer Whois na minha máquina, e novamente os logs sobre essas tentativas são feitos

iptables -N In_RULE_2
iptables -A INPUT -p tcp -m tcp  --dport 43  -j In_RULE_2
iptables -A In_RULE_2  -j LOG  --log-level info --log-prefix "RULE 2 -- DENY "
iptables -A In_RULE_2  -j DROP

Regra anti xmas-scan + logs sobre tentativas desse tipo de scan

iptables -N In_RULE_3
iptables -A INPUT -p tcp -m tcp   --tcp-flags ALL URG,PSH,FIN  -j In_RULE_3
iptables -A In_RULE_3  -j LOG  --log-level info --log-prefix "RULE 3 -- DENY "
iptables -A In_RULE_3  -j DROP

Se algo passar dessa regra, bloquear tudo relacionado a esse tipo de ataque, e logar

iptables -N In_RULE_4
iptables -A INPUT -p tcp -m tcp   --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN  -j In_RULE_4
iptables -A In_RULE_4  -j LOG  --log-level info --log-prefix "RULE 4 -- DENY "
iptables -A In_RULE_4  -j DROP

Bloquear fragmentos de IP e criar logs caso alguém tente

iptables -N In_RULE_5
iptables -A INPUT -p all  -f   -j In_RULE_5
iptables -A In_RULE_5  -j LOG  --log-level info --log-prefix "RULE 5 -- DENY "
iptables -A In_RULE_5  -j DROP

Impedir que façam "Who" na sua máquina, e logar tudo

iptables -N In_RULE_6
iptables -A INPUT -p udp -m udp  --dport 513  -j In_RULE_6
iptables -A In_RULE_6  -j LOG  --log-level info --log-prefix "RULE 6 -- DENY "
iptables -A In_RULE_6  -j DROP

Bloquear tracerout, e logar caso alguém tente

iptables -N In_RULE_7
iptables -A INPUT -p udp -m udp  --dport 33434:33524  -j In_RULE_7
iptables -A In_RULE_7  -j LOG  --log-level info --log-prefix "RULE 7 -- DENY "
iptables -A In_RULE_7  -j DROP

LIBERANDO O NECESSÁRIO DE ENTRADA

 

Agora que já temos uma defesa de entrada podemos liberar serviços necessários para acessar a Internet. O primeiro passo é liberar todo o tráfego ESTABLISHED e o tráfego RELATED. O primeiro, ESTABLISHED, é tráfico que nós estabelecemos, como quando abrimos uma página da Internet. O segundo é todo tipo de tráfego relacionado ao primeiro.

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

Agora vamos liberar a nossa rede interna, de dentro do nosso computador (ela não precisa de filtros)

iptables -A INPUT -i lo   -m state --state NEW  -j ACCEPT

LIBERANDO A SAÍDA

 

Agora vamos liberar o tráfego de saída. Antes de liberar o que precisamos, vamos ter certeza de que não passaremos tráfego inválido para outras pessoas.

iptables -A OUTPUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m state --state NEW -j DROP

Novamente liberamos o tráfego ESTABLISHED (estabelecido) e RELATED (relacionado)

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

Liberamos também o loopback (rede interna)

iptables -A OUTPUT -o lo   -m state --state NEW  -j ACCEPT

Agora liberamos o DNS

iptables -A OUTPUT -p tcp -m tcp  --dport 53  -m state --state NEW  -j ACCEPTiptables -A OUTPUT -p udp -m udp  --dport 53  -m state --state NEW  -j ACCEPT

FTP:

iptables -A OUTPUT -p tcp -m tcp  --dport 21  -m state --state NEW  -j ACCEPT

http

iptables -A OUTPUT -p tcp -m tcp  --dport 80  -m state --state NEW  -j ACCEPT

https

iptables -A OUTPUT -p tcp -m tcp  --dport 443  -m state --state NEW  -j ACCEPT

IMAP (protocolo de e-Mail)

iptables -A OUTPUT -p tcp -m tcp  --dport 143  -m state --state NEW  -j ACCEPT

POP3 (alguns clientes de e-mail fornecem isso, é para você manter seu e-Mail no seu computador e não guardar nada no servidore de quem fornece o serviço)

iptables -A OUTPUT -p tcp -m tcp  --dport 110  -m state --state NEW  -j ACCEPT

Impressora (mude a porta conforme necessário)

iptables -A OUTPUT -p tcp -m tcp  --dport 515  -m state --state NEW  -j ACCEPT

SMTP (e-Mail via Navegador de Internet)

iptables -A OUTPUT -p tcp -m tcp  --dport 25  -m state --state NEW  -j ACCEPT

SMTPS (Clientes de e-Mail como Thunderbird ou KMail) [pode variar a porta]

iptables -A OUTPUT -p tcp -m tcp  --dport 465  -m state --state NEW  -j ACCEPT

OpenVPN

iptables -A OUTPUT -p udp -m udp  --dport 1194  -m state --state NEW  -j ACCEPT

Kpasswd

iptables -A OUTPUT -p udp -m udp  --dport 464  -m state --state NEW  -j ACCEPT

Regras para liberar a Steam

# Steam
iptables -A OUTPUT -p udp --dport 27000:27030 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 27014:27050 -j ACCEPT
iptables -A OUTPUT -p udp --dport 3478 -j ACCEPT
iptables -A OUTPUT -p udp --dport 4379 -j ACCEPT
iptables -A OUTPUT -p udp --dport 4380 -j ACCEPT

Regra para o KMail:

# KMail

iptables -A OUTPUT -p tcp -m tcp  --dport 993  -m state --state NEW  -j ACCEPT

 

Regra para OpenPGP

iptables -A OUTPUT -p tcp -m tcp  --dport 11371  -m state --state NEW  -j ACCEPT


Regra para SVN

iptables -A OUTPUT -p tcp -m tcp  --dport 3690  -m state --state NEW  -j ACCEPT

Regra para KTorrent

iptables -A OUTPUT -p tcp -m tcp  --dport 6881  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p udp -m udp  --dport 6881  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p udp -m udp  --dport 8881  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp  --dport 8881  -m state --state NEW  -j ACCEPT
iptables -A OUTPUT -p udp -m udp  --dport 7881  -m state --state NEW  -j ACCEPT

Regra para Git

iptables -A OUTPUT -p tcp -m tcp  --dport 9418  -m state --state NEW  -j ACCEPT

Regra para FlightGear
 

iptables -A OUTPUT -p tcp -m tcp  --dport 8888  -m state --state NEW  -j ACCEPT

OBS: A porta que o FlightGear usa para baixar cenários muda constantemente. Para saber qual porta usar naquele determinado dia ou semana, basta abrir aqui: http://scenery.flightgear.org/svn-server

 

 

NEGANDO TUDO QUE NÃO SE ENCAIXA NAS REGRAS ACIMA

 

Se algum tráfego for diferente do que especificamos, o Firewall negará tudo, e criará um log sobre isso.

Bloquearemos todo o tráfego UDP restante

iptables -N RULE_21
iptables -A OUTPUT -p udp -m udp  -j RULE_21
iptables -A INPUT -p udp -m udp  -j RULE_21
iptables -A RULE_21  -j LOG  --log-level info --log-prefix "RULE 21 -- DENY "
iptables -A RULE_21  -j DROP

Agora todo tráfego TCP

iptables -N RULE_22
iptables -A OUTPUT -p tcp -m tcp  -j RULE_22
iptables -A INPUT -p tcp -m tcp  -j RULE_22
iptables -A RULE_22  -j LOG  --log-level info --log-prefix "RULE 22 -- DENY "
iptables -A RULE_22  -j DROP

Qualquer tentativa de se conectar ao Firewall será negada e logada

iptables -N RULE_23
iptables -A OUTPUT  -d amarildo   -j RULE_23 
iptables -A INPUT  -j RULE_23
iptables -A RULE_23  -j LOG  --log-level info --log-prefix "RULE 23 -- DENY "
iptables -A RULE_23  -j DROP

Novamente logada e negada. Redundância.

iptables -N RULE_24
iptables -A OUTPUT  -j RULE_24
iptables -A INPUT  -j RULE_24
iptables -A RULE_24  -j LOG  --log-level info --log-prefix "RULE 24 -- DENY "
iptables -A RULE_24  -j DROP

Criei essa configuração com a ajuda do programa "fwbuilder". Estou disponibilizando o arquivo .fwb e o arquivo script compilado que pode ser rodado em quase todas as distruibuições Linux.

 

Também estou disponibilizando o arquivo de texto com todos os comandos.

 

O HASH sha256sum do arquivo "Firewall.tar.gz" é: b0c53de7e3a83ea95eea483dc3074a378337c0194e67bb2500228c426f0adeb8

 

O HASH 256sum do arquivo "2.tar.gz" é: 1a93d7c6e350a73d118552bb514fb113798f4b0c669ca1fa682a0839c3ed2ce7

Firewall.tar.gz

2.tar.gz

  • Curtir 8
Link para o comentário
Compartilhar em outros sites

Pode-se usar o ufw invés do iptables. É mais simples, indicado para usos domésticos.

Mas eu falei sobre o UFW ali em cima :) Na verdade o GUFW é um GUI para o UFW.

 

Foi então que tropecei no GUFW, uma ferramenta com interface gráfica que pode ser configurada tanto para negar todos os pacotes de entrada/saida quanto dinamicamente "autorizar" tudo que for relacionado a Steam. Isso não é legal? :) Ééé, não. Pelo menos pra mim. Se eu não tenho estudos mostrando  a eficácia de um produto, eu não uso, e se você olhar as configuraçoes do GUFW vai perceber que elas são beeem basicas.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Talvez eu tenha me expressado mal. Eu quis colocar o UFW como uma alternativa, não como um substituto para o IPTABLES — preferiu por você. Sem sombra de dúvidas, o IPTABLES é uma solução mais especializada.

 

Por outro lado, eu não indico uso de interface gráfica para o UFW. Sugiro seu uso a partir da linha de comandos. Pode-se gerenciar configurações criando-se um arquivo de configuração para cada aplicação. É bem prático, simples e funcional. Não estou certo disso, porque atualmente estou afastado do assunto, mas parece-me até que o UFW acaba fazendo regras IPTABLES, por baixo.

 

Independentemente de qualquer coisa que tenha afirmado, seu tutorial é válido e muito interessante. Parabéns!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@alexandre.mbm Sim, obviamente os UFW/GUFW são uma ótima alternativa para aqueles que não tem tempo de aprender o IPTABLES :D Acho que quem se expressou mal foi eu :P

Em minha opinião o GUFW é mais indicado a iniciantes pois eles não precisam digitar comandos, é tudo "ao alcance de um clique".

 

Sim, o UFW executa comandos para o iptables. O GUFW é uma GUI front-end para o UFW, que executa comandos no iptables.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Temos também o SuSEfirewall2 no openSUSE/SLES e mais recentemente o firewalld no Fedora/RHEL/CentOS.

 

Gosto do SuSEfirewall2. Por baixo dos panos é um script em shell. O firewalld é um daemon em Python.

 

Documentação relacionada:

 

https://www.suse.com/documentation/sled11/book_security/data/cha_security_firewall.html

https://activedoc.opensuse.org/book/opensuse-security-guide/chapter-13-masquerading-and-firewalls
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Doh.

 

Falando no SUSE, quem usar o SuSEfirewall2 e o fail2ban não deve esquecer de conferir se o pacote SuSEfirewall2-fail2ban está instalado. Serve para configurar o serviço do firewall para ser sempre iniciado junto (e antes) do fail2ban através de arquivos drop in de configuração do systemd. Se a ordenação não estiver presente, o SuSEfirewall2 apagará as cadeias criadas pelo fail2ban e este não funcionará.

 

Sai fora do escopo do tópico do AmarildoJr por tratar-se de software usado predominantemente em servidores, porém é uma dica importante.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@AmarildoJr se eu quiser abrir alguma porta específica.. tipo XXX para TCP, e YYY para udp... ou um range XXX~X2X2X2 como eu faço?

 

vou reinstalar o linux hoje e gostei da dica, mas eu uso torrent e não uso as portas padrões

 

E como fazer com que a conexão não mude seu nome? eu conecto via usb.... não lembro, embora já fiz, de como fixá-la

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ilkyest, ótima pergunta.

 

No caso da Steam, por exemplo, ela usa algumas portas UDP, de 27000 até a 27015, então fica:

iptables -A OUTPUT -p udp --dport 27000:27015 -j ACCEPT

Além do UDP acima a Steam também precisa de certas portas TCP, como:

iptables -A OUTPUT -p tcp --dport 27014:27050 -j ACCEPT

Então para especificar para o Firewall que você quer abrir de uma porta até outra basta separar a porta de início e a porta de fim com dois pontos.

 

Lembre-se que a ORDEM em que você coloca as regras é importante, então não ponha tais regras antes dos bloqueios, e nem depois ;)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Estou enferrujado nisso, mas, AmarildoJr, pelo que lembro '-m state' não é recomendável por estar obsoleto e correr o risco de ser até removido em futuras versões do kernel -- se bem que faz tempo que está assim e até agora não foi removido.

Não seria melhor um 's/-m state --state/-m conntrack --ctstate/g'?

Referência (não li tudo): http://thread.gmane.org/gmane.comp.security.firewalls.netfilter.general/45564

Link para o comentário
Compartilhar em outros sites

Estou enferrujado nisso, mas, AmarildoJr, pelo que lembro '-m state' não é recomendável por estar obsoleto e correr o risco de ser até removido em futuras versões do kernel -- se bem que faz tempo que está assim e até agora não foi removido.

Não seria melhor um 's/-m state --state/-m conntrack --ctstate/g'?

Referência (não li tudo): http://thread.gmane.org/gmane.comp.security.firewalls.netfilter.general/45564

Eu fiz alguns testes, e mesmo estando obsoletas elas funcionam :) Além de serem mais fáceis de se lidar.

 

Mas você pode usar o ctstate se quiser, ex:

# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Nem depois? Como assim? Então elas devem ser colocadas onde?

Como você vai botar tal regra depois de dizer pro firewall bloquear tudo lá no final? hehehehe.

 

Você pode botar ela entre a abertura do DNS e a frase "NEGANDO TUDO QUE NÃO SE ENCAIXA NAS REGRAS ACIMA".

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Como você vai botar tal regra depois de dizer pro firewall bloquear tudo lá no final? hehehehe.

 

Você pode botar ela entre a abertura do DNS e a frase "NEGANDO TUDO QUE NÃO SE ENCAIXA NAS REGRAS ACIMA".

 

Então. Bloqueia-se tudo para depois abrir só o que se quer, não é?!

Link para o comentário
Compartilhar em outros sites

gente,primeiramente,onde aprender sobre o firewall do Ubuntu?(iniciante),segundamente (hahah-Odorico Paraguassú!!) quer compartilhar uma notícia.

O Banco santander está disponibilizando um pacote para usar o seu Internet Banking para linux.

Como o tópico está sendo lido atualmente,pode ser útil para quem precisa ou se enrola com isso.

Boa sorte,moçada!!

Link para o comentário
Compartilhar em outros sites

Eu poderia criar um tópico sobre firewalls e aplicativos de bancos, acho que esse assunto não se encaixa nesse tópico.

 

Mas para iniciantes basta usar o GUFW para bloquear a entrada e permitir tudo de saída.

 

Só lembrando: não confiem em bancos, nem empresas, nem agências do governo. Tudo que for código fechado deve ser executado em um ambiente separado, de preferência em um computador só para esse tipo de aplicações.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...