Firewall: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(43 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 6: Linha 6:
-->
-->


Um '''''Firewall''''' tem por objetivo aplicar '''políticas de segurança''' no acesso a um rede ou servidor. O '''''firewall''''' pode ser do tipo '''filtros de pacotes''', atuando no nível da camada IP, ou '''[[Servidor Proxy]]''',  atuando no nível das aplicações.
Um '''''Firewall''''' tem por objetivo aplicar '''políticas de segurança''' no acesso a uma rede ou servidor. O '''''firewall''''' pode ser do tipo '''filtros de pacotes''', atuando no nível da camada IP, ou '''[[Servidor Proxy]]''',  atuando no nível das aplicações.


[[Arquivo:Firewall.png]]
[[Arquivo:Firewall.png]]
Linha 19: Linha 19:
  man iptables
  man iptables


===Tabelas (Tables)===
Com o '''Iptables''' é possível cinco tipos diferentes '''tabelas''' ('''Tables''') para filtragem ou tratamento de pacotes, cada uma delas com diferentes tipos de '''regras''' ('''Chain''').
:Parâmetro: -t
:tabelas:
:*'''filter''' -> tabela ''default'' para filtragem de pacotes
:*'''nat''' -> implementa o NAT (''network address translation'')
:*'''mangle''' -> alteração de pacotes
:*'''raw''' -> implementação de rastreamento de conexões
:*'''security''' -> usada para controle de segurança de acesso
===Regras (Chain)===
Para verificar as regras existentes, pode utilizar o comando:
Para verificar as regras existentes, pode utilizar o comando:
  sudo iptables -L
  sudo iptables -L
:Parâmetro: -L (lista regras).


  Chain INPUT (policy ACCEPT)
  Chain INPUT (policy ACCEPT)
Linha 30: Linha 44:
  Chain OUTPUT (policy ACCEPT)
  Chain OUTPUT (policy ACCEPT)
  target    prot opt source              destination
  target    prot opt source              destination
:Cada '''Chain''' é um conjunto de regras utilizadas para '''filtrar pacotes'''. Por default há três grupos de regras ('''INPUT''', '''FORWARD''' e '''OUTPUT'''), todas com a política '''ACCEPT''' (aceitar) como padrão. Observa-se também o cabeçalho de cada coluna que formam as regras: '''target''' (alvo), '''prot''' (protocolo), '''opt''' (opções), '''source''' (fonte) e '''destination''' (destino).
 
Cada '''Chain''' é um conjunto de '''regras''' utilizadas para '''filtrar pacotes'''.  
 
;Tipos de Chain: Por default há três tipos de regras:
#'''INPUT''', pacotes destinados ao ''Socket'' local;
#'''FORWARD''', pacotes a serem roteados;
#'''OUTPUT''',pacotes originados localmente.
 
;Policy: Para cada '''Chain''' é estabelecida uma '''policy''' (política), quais sejam:
#'''ACCEPT''' (aceitar), deixa o pacote passar (política '''''default''''');
#'''DROP''', descarta o pacote;
#'''RETURN''', avança para a próxima regra.
 
Observa-se também o '''cabeçalho''' de cada coluna que formam as '''regras''':
:*'''target''' (alvo),  
:*'''prot''' (protocolo),  
:*'''opt''' (opções),  
:*'''source''' (fonte) e  
:*'''destination''' (destino).


===Exemplos de filtros de pacotes TCP e UDP===
===Exemplos de filtros de pacotes TCP e UDP===
Referência: <ref name=MORIMOTO>MORIMOTO, C. E. Seridores Linux: Guia prático, Sul Editores, Porto Alegre, 2013.</ref>.
Referência: <ref name=MORIMOTO>MORIMOTO, C. E. Seridores Linux: Guia prático, Sul Editores, Porto Alegre, 2013.</ref>.


1) Exemplo de regra que pode ser utilizada em um computador desktop conectado a Internet para ignorar conexões vindas em qualquer porta TCP:
;Exemplo 1: Regra que pode ser utilizada em um computador desktop conectado a Internet para '''ignorar conexões''' vindas em qualquer porta '''TCP''':
:*Execute a regra no seu Servidor:
*Execute a regra no seu Servidor:
  sudo iptables -A INPUT -p tcp --syn -j DROP
  sudo iptables -A INPUT -p tcp --syn -j DROP
:*Verifique o resultado com:
:Comando:
:*'''-A INPUT''', (-A append) adiciona regra INPUT,
:Parâmetros:
:*'''-p tcp --syn''', (-p protocol) protocolo TCP e pacote SYN solicitando abertura de conexão,
:*'''-j DROP''', (-j jump) define que o pacote será descartado.
 
*Verifique o resultado com:
  sudo iptables -L
  sudo iptables -L


Linha 44: Linha 82:
  target  prot opt source      destination         
  target  prot opt source      destination         
  DROP    tcp  --  anywhere    anywhere      tcp flags:FIN,SYN,RST,ACK/SYN
  DROP    tcp  --  anywhere    anywhere      tcp flags:FIN,SYN,RST,ACK/SYN
:*Teste o acesso ao '''servidor Web''' de seu servidor;
*Teste o acesso ao '''servidor Web''' de seu servidor;
:*Elimine a regra com o comando:
*Elimine a regra com o comando:
  sudo iptables -D INPUT -p tcp --syn -j DROP
  sudo iptables -D INPUT -p tcp --syn -j DROP
:*Teste novamente o acesso ao '''servidor Web'''.
:Comando:
:*'''-D''', (-d delete) deleta a regra.
*Teste novamente o acesso ao '''servidor Web'''.


2) Exemplo de regra que permite aos computadores da rede interna de se conectar normalmente, mas bloqueia tudo que vem da Internet em qualquer porta TCP ou UDP:  
;Exemplo 2: Regra que permite aos computadores da '''rede interna''' de se conectar normalmente, mas '''bloqueia''' tudo que vem da Internet em qualquer porta '''TCP''' ou '''UDP''':  
  sudo iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT
  sudo iptables -A INPUT -p tcp --syn -s 192.168.70.0/255.255.254.0 -j ACCEPT
  sudo iptables -A INPUT -p tcp --syn -j DROP
  sudo iptables -A INPUT -p tcp --syn -j DROP
  sudo iptables -A INPUT -p udp -j DROP
  sudo iptables -A INPUT -p udp -j DROP


3) Regra equivalente a anterior, mas aceita conexões SSH:  
:Comando:
:*'''-s 192.168.70.0/255.255.254.0''', (-s source) especifica a fonte .
 
;Exemplo 3: Regra equivalente a anterior, mas '''aceita''' conexões '''SSH''':  
  sudo iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
  sudo iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
  sudo iptables -A INPUT -p tcp --syn -s 192.168.0.0/255.255.255.0 -j ACCEPT
  sudo iptables -A INPUT -p tcp --syn -s 192.168.70.0/255.255.254.0 -j ACCEPT
  sudo iptables -A INPUT -p tcp --syn -j DROP
  sudo iptables -A INPUT -p tcp --syn -j DROP
  sudo iptables -A INPUT -p udp -j DROP
  sudo iptables -A INPUT -p udp -j DROP


;Sequência de análise das regras: O '''Iptables''' processa os comandos em sequência, regra por regra. Se um pacote vem para a porta 22 ele é aceito antes de ir para as demais regras. Se não passou pela primeira regra mas vem de um dos endereços da rede local é imediatamente aceito. Os demais vão para as duas últimas regras e acabam recusados <ref name=MORIMOTO/>.
===Sequência de análise das regras===
O '''Iptables''' processa os comandos em sequência, regra por regra. Se um pacote vem para a porta 22 ele é aceito antes de ir para as demais regras. Se não passou pela primeira regra mas vem de um dos endereços da rede local é imediatamente aceito. Os demais vão para as duas últimas regras e acabam recusados <ref name=MORIMOTO/>.


Todas as regras podem ser eliminadas com o comando:
Todas as regras podem ser eliminadas com o comando:
  sudo iptables -F
  sudo iptables -F
:Comando:
:*'''-F''' (-F flush) apaga todas as regras.
===Exemplo de filtro de pacotes ICMP===
Pacotes do '''[[Protocolo ICMP]]''' são utilizados por aplicativos importantes para a administração de redes, como o '''ping''' e o '''traceroute'''. Também servem para enviar '''mensagens de erro e controle''' entre hosts e roteadores, alertando sobre anormalidades no funcionamento do roteamento e da rede, informando situações como destino inalcançável, redirecionamentos, esgotamento de tempo, etc. Portanto, o '''bloqueio de pacotes ICMP deve ser evitado, ou realizado com critério'''.


===Configuração do NAT no Linux===
;Filtro de ICMP ping:
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
 
===Regras úteis de segurança com Iptables===
 
Na Internet é possível encontrar várias dicas e regras úteis de segurança com Iptables, segue alguns links:
*[https://www.vivaolinux.com.br/dica/Regras-uteis-de-seguranca-com-iptables TAIOQUE, J.L. Regras úteis de segurança com iptables,2004]
 
==Configuração do NAT no Linux==


O '''[[NAT]]''' é um mecanismo que possibilita a uma rede local usar apenas um endereço '''IP público''' no que concerne ao mundo exterior e utilizar endereços '''IP privados''' no que concerne a rede interna.
O '''[[NAT]]''' é um mecanismo que possibilita a uma rede local usar apenas um endereço '''IP público''' no que concerne ao mundo exterior e utilizar endereços '''IP privados''' no que concerne a rede interna.
[[Arquivo:Nat.png]]


O '''NAT''' no Ubuntu se configura com '''iptables''' com os seguintes comandos:
O '''NAT''' no Ubuntu se configura com '''iptables''' com os seguintes comandos:
  modprobe iptable_nat
  modprobe iptable_nat
  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth1 -j MASQUERADE
#O primeiro comando ativa o '''NAT''' no módulo '''iptables'''.  
#O primeiro comando ativa o '''NAT''' no módulo '''iptables'''.  
#O segundo comando define a regra para fazer com que todo o tráfego originado em 192.168.1.0/24, e que sai pela interface eth1 deve ser mascarado com o endereço IP dessa interface <ref name=VALLE2>VALLE, O. T. Gerência de Redes, Diário Aula, 2014. http://wiki.sj.ifsc.edu.br/wiki/index.php/GER20706-2014-1</ref>.
#O segundo comando define a regra para fazer com que todo o tráfego originado em 192.168.0.0/16, e que sai pela interface eth1 deve ser mascarado com o endereço IP dessa interface <ref name=VALLE2>VALLE, O. T. Gerência de Redes, Diário Aula, 2014. http://wiki.sj.ifsc.edu.br/wiki/index.php/GER20706-2014-1</ref>.
 
Utilizamos o '''iptables''' para ativar o '''NAT''' no módulo [[Rede e Roteamento]].


==Proxy transparente com Iptables==
==Proxy transparente com Iptables==
Linha 83: Linha 141:
Com o '''Iptables''' é possível construir um '''Proxy transparente''', evitando que seja necessário informar no navegador o endereço do servidor e a porta.
Com o '''Iptables''' é possível construir um '''Proxy transparente''', evitando que seja necessário informar no navegador o endereço do servidor e a porta.


;Exemplo de configuração de roteador: Roteador com '''Firewall''' ('''Iptables''') e '''Proxy''' ('''Squid''') servindo a '''rede local''' com '''IP privado''' 192.168.0.0/16 pela interface Eth0 e acesso a '''Internet''' com '''IP público''' 200.17.101.10 pela interface Eth1 <ref GITE, V. Linux: Setup a transparent proxy with Squid in three easy steps, nixCraft, 2006.
===Exemplo de configuração de roteador com firewall e proxy===
http://www.cyberciti.biz/tips/linux-setup-transparent-proxy-squid-howto.html /ref>
Roteador com '''Firewall''' ('''Iptables''') e '''Proxy''' ('''Squid''') servindo a '''rede local''' com '''IP privado''' 192.168.0.0/16 pela interface Eth0 e acesso a '''Internet''' com '''IP público''' 200.17.101.10 pela interface Eth1:


[[Arquivo:ProxyTransparente.png]]
[[Arquivo:ProxyTransparente.png]]
Passos para a configuração:
#Configurar '''Squid''' para funcionar em '''modo transparente''';
#Configurar o servidor como '''roteador NAT''';
#Configurar o '''Iptables''' para encaminhar toda '''requisição HTTP''' para '''porta 3128'''.
Referência: <ref> GITE, V. Linux: Setup a transparent proxy with Squid in three easy steps, nixCraft, 2006. http://www.cyberciti.biz/tips/linux-setup-transparent-proxy-squid-howto.html </ref>
;Configuração do Squid: Arquivo '''/etc/squidw/squid.conf''':
#  TAG: http_port
http_port 3128 transparent
#  TAG: acl
#  ...
#  Demais regras de acesso acl do Firewall
;Configuração do servidor como roteador NAT: Setar para que o servidor '''encaminhe''' pacotes:
echo 1 > /proc/sys/net/ipv4/ip_forward
:Configurar '''NAT''' com '''Iptables''' de forma a mascarar pacotes vindos da interface Eth0 (rede local) e saindo pela interface Eth1 (Internet) como o endereço desta interface:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth1 -j MASQUERADE
;Configuração do Iptables: Adicionar regras para que toda '''requisição HTTP''' ('''porta 80''') seja redirecionada o '''Squid''', na '''porta 3128''':
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.0.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
==Tarefa: Proxy transparente==
Implementar com '''Iptables''' um '''proxy transparente''' para acesso ao '''servidor Web'''. No caso, configurar somente o acesso ao servidor e não a computadores da rede local, para o que seria necessário um roteador.


==Referências==
==Referências==
<references />
<references />



Edição atual tal como às 11h41min de 16 de novembro de 2023

Firewall

Um Firewall tem por objetivo aplicar políticas de segurança no acesso a uma rede ou servidor. O firewall pode ser do tipo filtros de pacotes, atuando no nível da camada IP, ou Servidor Proxy, atuando no nível das aplicações.

Firewall com Iptables

O Iptables é uma ferramenta que permite implementar regras para firewall, disponível em todas as distribuições Linux.

O Iptables normalmente já vem instalado no Ubuntu.

As páginas man fornecem referência para utilizar o comando iptables para construir regras para filtros de pacotes':

man iptables

Tabelas (Tables)

Com o Iptables é possível cinco tipos diferentes tabelas (Tables) para filtragem ou tratamento de pacotes, cada uma delas com diferentes tipos de regras (Chain).

Parâmetro: -t
tabelas:
  • filter -> tabela default para filtragem de pacotes
  • nat -> implementa o NAT (network address translation)
  • mangle -> alteração de pacotes
  • raw -> implementação de rastreamento de conexões
  • security -> usada para controle de segurança de acesso

Regras (Chain)

Para verificar as regras existentes, pode utilizar o comando:

sudo iptables -L
Parâmetro: -L (lista regras).
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Cada Chain é um conjunto de regras utilizadas para filtrar pacotes.

Tipos de Chain
Por default há três tipos de regras:
  1. INPUT, pacotes destinados ao Socket local;
  2. FORWARD, pacotes a serem roteados;
  3. OUTPUT,pacotes originados localmente.
Policy
Para cada Chain é estabelecida uma policy (política), quais sejam:
  1. ACCEPT (aceitar), deixa o pacote passar (política default);
  2. DROP, descarta o pacote;
  3. RETURN, avança para a próxima regra.

Observa-se também o cabeçalho de cada coluna que formam as regras:

  • target (alvo),
  • prot (protocolo),
  • opt (opções),
  • source (fonte) e
  • destination (destino).

Exemplos de filtros de pacotes TCP e UDP

Referência: [1].

Exemplo 1
Regra que pode ser utilizada em um computador desktop conectado a Internet para ignorar conexões vindas em qualquer porta TCP:
  • Execute a regra no seu Servidor:
sudo iptables -A INPUT -p tcp --syn -j DROP
Comando:
  • -A INPUT, (-A append) adiciona regra INPUT,
Parâmetros:
  • -p tcp --syn, (-p protocol) protocolo TCP e pacote SYN solicitando abertura de conexão,
  • -j DROP, (-j jump) define que o pacote será descartado.
  • Verifique o resultado com:
sudo iptables -L
Chain INPUT (policy ACCEPT)
target   prot opt source      destination         
DROP     tcp  --  anywhere    anywhere       tcp flags:FIN,SYN,RST,ACK/SYN
  • Teste o acesso ao servidor Web de seu servidor;
  • Elimine a regra com o comando:
sudo iptables -D INPUT -p tcp --syn -j DROP
Comando:
  • -D, (-d delete) deleta a regra.
  • Teste novamente o acesso ao servidor Web.
Exemplo 2
Regra que permite aos computadores da rede interna de se conectar normalmente, mas bloqueia tudo que vem da Internet em qualquer porta TCP ou UDP:
sudo iptables -A INPUT -p tcp --syn -s 192.168.70.0/255.255.254.0 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
sudo iptables -A INPUT -p udp -j DROP
Comando:
  • -s 192.168.70.0/255.255.254.0, (-s source) especifica a fonte .
Exemplo 3
Regra equivalente a anterior, mas aceita conexões SSH:
sudo iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -s 192.168.70.0/255.255.254.0 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
sudo iptables -A INPUT -p udp -j DROP

Sequência de análise das regras

O Iptables processa os comandos em sequência, regra por regra. Se um pacote vem para a porta 22 ele é aceito antes de ir para as demais regras. Se não passou pela primeira regra mas vem de um dos endereços da rede local é imediatamente aceito. Os demais vão para as duas últimas regras e acabam recusados [1].

Todas as regras podem ser eliminadas com o comando:

sudo iptables -F
Comando:
  • -F (-F flush) apaga todas as regras.

Exemplo de filtro de pacotes ICMP

Pacotes do Protocolo ICMP são utilizados por aplicativos importantes para a administração de redes, como o ping e o traceroute. Também servem para enviar mensagens de erro e controle entre hosts e roteadores, alertando sobre anormalidades no funcionamento do roteamento e da rede, informando situações como destino inalcançável, redirecionamentos, esgotamento de tempo, etc. Portanto, o bloqueio de pacotes ICMP deve ser evitado, ou realizado com critério.

Filtro de ICMP ping
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Regras úteis de segurança com Iptables

Na Internet é possível encontrar várias dicas e regras úteis de segurança com Iptables, segue alguns links:

Configuração do NAT no Linux

O NAT é um mecanismo que possibilita a uma rede local usar apenas um endereço IP público no que concerne ao mundo exterior e utilizar endereços IP privados no que concerne a rede interna.

O NAT no Ubuntu se configura com iptables com os seguintes comandos:

modprobe iptable_nat
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth1 -j MASQUERADE
  1. O primeiro comando ativa o NAT no módulo iptables.
  2. O segundo comando define a regra para fazer com que todo o tráfego originado em 192.168.0.0/16, e que sai pela interface eth1 deve ser mascarado com o endereço IP dessa interface [2].

Proxy transparente com Iptables

Um Servidor Proxy isolado, montado com Squid, além da configuração do servidor é necessário configurar cada um dos navegadores e outros programas que vão acessar a Internet via servidor Proxy.

Com o Iptables é possível construir um Proxy transparente, evitando que seja necessário informar no navegador o endereço do servidor e a porta.

Exemplo de configuração de roteador com firewall e proxy

Roteador com Firewall (Iptables) e Proxy (Squid) servindo a rede local com IP privado 192.168.0.0/16 pela interface Eth0 e acesso a Internet com IP público 200.17.101.10 pela interface Eth1:

Passos para a configuração:

  1. Configurar Squid para funcionar em modo transparente;
  2. Configurar o servidor como roteador NAT;
  3. Configurar o Iptables para encaminhar toda requisição HTTP para porta 3128.

Referência: [3]

Configuração do Squid
Arquivo /etc/squidw/squid.conf:
#  TAG: http_port
http_port 3128 transparent

#  TAG: acl
#  ...
#  Demais regras de acesso acl do Firewall
Configuração do servidor como roteador NAT
Setar para que o servidor encaminhe pacotes:
echo 1 > /proc/sys/net/ipv4/ip_forward
Configurar NAT com Iptables de forma a mascarar pacotes vindos da interface Eth0 (rede local) e saindo pela interface Eth1 (Internet) como o endereço desta interface:
modprobe iptable_nat
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth1 -j MASQUERADE
Configuração do Iptables
Adicionar regras para que toda requisição HTTP (porta 80) seja redirecionada o Squid, na porta 3128:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.0.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Tarefa: Proxy transparente

Implementar com Iptables um proxy transparente para acesso ao servidor Web. No caso, configurar somente o acesso ao servidor e não a computadores da rede local, para o que seria necessário um roteador.

Referências

  1. 1,0 1,1 MORIMOTO, C. E. Seridores Linux: Guia prático, Sul Editores, Porto Alegre, 2013.
  2. VALLE, O. T. Gerência de Redes, Diário Aula, 2014. http://wiki.sj.ifsc.edu.br/wiki/index.php/GER20706-2014-1
  3. GITE, V. Linux: Setup a transparent proxy with Squid in three easy steps, nixCraft, 2006. http://www.cyberciti.biz/tips/linux-setup-transparent-proxy-squid-howto.html

--Evandro.cantu (discussão) 10h01min de 23 de fevereiro de 2016 (BRT)