Aula #40 - Firewalls



Firewalls são usados para controlar o que entra no seu sistema através da rede e o que sai do seu sistema através da rede. Como ataques e intrusões acontecem na vida real, ter um firewall corretamente configurado nos computadores é importante. Pode-se usar interfaces de rede, endereços, e bloco de endereço para decidir se o acesso será permitido ou não.




Um firewall é um sistema de segurança de rede que monitora e controla o tráfego de rede. Ele aplica regras (rules) no tráfego de entrada e no tráfego de saída para criar barreiras flexíveis dependendo do nível de segurança que cada conexão recebe.

Um firewall pode tanto ser um equipamento físico, e normalmente ficar entre a Internet e a rede interna, como pode ser um programa rodando em um servidor ou estação de trabalho. Em alguns casos, um firewall é usado para fazer roteamento de pacotes.

Os primeiros firewalls da década de 1980 eram basicamente filtros para pacotes. O conteúdo de cada pacote era analisado para decidir se o pacote seria aceito, descartado ou rejeitado. O estado da conexão não era levado em consideração.

A próxima geração de firewalls foi baseada em stateful filters (ou filtros com informação de estado) que além dos pacotes também consideram o estado da conexão. Ataques DOS (Denial of service) podem bombardear este tipo de firewall para tentar burlar as regras de segurança.

A terceira geração de firewalls é chamada de Application Layer Firewalls (ou firewall da camada de aplicação), que passa a ter conciência do tipo de aplicação e do protocolo de rede que está em uso. Este tipo de firewall pode bloquear tudo que não parece ser parte do fluxo de dados normal.Um firewall* é um sistema de segurança de rede que monitora e controla o tráfego de rede. Ele aplica regras (rules) no tráfego de entrada e no tráfego de saída para criar barreiras flexíveis dependendo do nível de segurança que cada conexão recebe.

Um firewall pode tanto ser um equipamento físico, e normalmente ficar entre a Internet e a rede interna, como pode ser um programa rodando em um servidor ou estação de trabalho. Em alguns casos, um firewall é usado para fazer roteamento de pacotes.

Os primeiros firewalls da década de 1980 eram basicamente filtros para pacotes. O conteúdo de cada pacote era analisado para decidir se o pacote seria aceito, descartado ou rejeitado. O estado da conexão não era levado em consideração.

A próxima geração de firewalls foi baseada em stateful filters (ou filtros com informação de estado) que além dos pacotes também consideram o estado da conexão. Ataques DOS (Denial of service) podem bombardear este tipo de firewall para tentar burlar as regras de segurança.

A terceira geração de firewalls é chamada de Application Layer Firewalls (ou firewall da camada de aplicação), que passa a ter conciência do tipo de aplicação e do protocolo de rede que está em uso. Este tipo de firewall pode bloquear tudo que não parece ser parte do fluxo de dados normal.




Configurar o firewall do seu computador pode ser feito com:

    • Ferramentas de linha de comando e alterando arquivos no /etc:

      iptables
      firewall-cmd
      ufw

          
    • Interfaces gráficas:

      system-config-firewall
      firewall-config
      gufw
      yast



Vamos nos concentrar nas ferramentas de linha de comando porque:


  •     Elas são mais constantes (menos alterações) que as interfaces gráficas.
  •     Elas costumam ser mais poderosas. 
  •     Elas quase não mudam entre distribuições, enquanto as GUIs (interfaces gráficas) tendem a ser muito diferentes entre distribuições diferentes.



A desvantagem é que pode parecer que é mais difícil começar pela linha de comando. Nós vamos nos concentrar no uso do pacote firewalld que fornece as ferramentas firewall-cmd e firewall-config. Para distribuições que não incluem estas ferramentas por padrão (como o RHEL 6) é fácil fazer a instalação a partir do código fonte.



FIREWALLD



O firewalld é um gestor dinâmico de firewall. Ele utiliza zonas de rede que podem ser configuradas com níveis de confiança por interface de rede ou por conexões. Ele functiona tanto com IPv4 quanto com IPv6.

Além disso, ele diferencia alterações em tempo de execução de alterações permantes, além de oferecer uma interface para que programas e serviços possam adicionar regras ao firewall.

Os arquivos de configuração ficam nas pastas /etc/firewalld e /usr/lib/firewalld; mas os arquivos na pasta /etc/firewalld tem preferência sobre os outros, e por isso apenas o conteúdo desta pasta deve ser alterado.

A ferramenta de linha de comando é o firewall-cmd. Recomendamos que você leia a saída do comando abaixo com atenção antes de continuar: 

$ firewall-cmd --help
Usage: firewall-cmd [OPTIONS...]
....
Status Options
   --state                             Return and print firewalld state
   --reload                           Reload firewall and keep state information

   --complete-reload           Reload firewall and loose state information

   --runtime-to-permanent  Create permanent from runtime configuration
....

Como a saída é aproximadamente 200 linhas, não incluímos todo o conteúdo aqui.

No entanto você deve perceber que muitas das opções tem nomes intuitivos. O serviço se chama firewalld e ele substitui o iptables. É um erro rodar o firewalld e o iptables ao mesmo tempo.


O firewalld é um serviço que precisa estar rodando para que seja possível usar e configurar o firewall. Para configurar se o serviço deve ser iniciado automaticamente e para iniciar/parar o serviço:

$ sudo systemctl [enable/disable] firewalld
$ sudo systemctl [start/stop] firewalld

Você pode ver o estado do firewall de duas formas:

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
    Active: active (running) since Tue 2015-04-28 12:00:59 CDT; 5min ago
 Main PID: 777 (firewalld)
    CGroup: /system.slice/firewalld.service
             777 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Apr 28 12:00:59 CentOS7 systemd[1]: Started firewalld - dynamic firewall daemon.

$ sudo firewall-cmd --state

running

Observe que se você possuir mais de uma interface de rede e se você estiver usando IPv4, você terá que habilitar ip forwarding (redirecionamento de ip). Duas formas são possíveis:

$ sudo sysctl net.ipv4.ip_forward=1
$ echo 1 > /proc/sys/net/ipv4/ip_forward (precisa ser executado como root para que o echo funcione corretamente)

No entando estas formas não são persistentes. Para fazer uma alteração persistente, edite o arquivo /etc/sysctl.conf e adicione a linha:

net.ipv4.ip_forward=1

e então reinicie ou:

$ sudo sysctl -p

para carregar a nova configuração sem reiniciar.


O firewalld trabalha com zonas (zones) e cada uma define um nível de confiança com um comportamento específico para o tráfego de entrada e saída de pacotes. Cada interface de rede pertence a uma zona em particular (normalmente é o NetworkManager que informa ao firewalld qual zona deve ser usada), mas é possível alterar a zona com o firewall-cmd ou com a interface gráfica firewall-config.



As zonas são:

drop (descartar)
Todos os pacotes recebidos são descartados sem resposta. Apenas tráfego de saída é permitido.


block (bloquear)
Todas as conexões de entrada são rejeitadas. Apenas conexões que tem origem no servidor são permitiras.


public (pública)
Não confie em nenhum endereço da rede local. Apenas algumas conexões de entrada são aceitas, desde que sejam consideradas seguras.


external (externa)
Nível semelhante ao public, mas é normalmente usado em roteadores no modo masquerading.


dmz (Demilitarized Zone, ou zona desmilitarizada) 
Usada para garantir acesso a algumas (mas não a todas) as conexões (ou serviços). Apenas algumas conexões de entrada específicas são aceitas.


work (trabalho)
Confie (mas não completamente) nos hosts da rede. Apenas algumas conexões de entrada são aceitas.


home (casa)
Os hosts são confiáveis, mas ainda sim escolha quais conexões de entrada aceitar.


internal (interna)
Semelhante a zona work.


trusted (confiada)
Confie em todas as conexões de rede.



Na instalação do sistema, a maioria das distribuições Linux escolhe a zona public para todas as interfaces.


As diferenças entre as zonas mencionadas não são obvias, mas a regra geral é que não se deve usar uma zona mais permissiva que o necessário.



Ver a zona padrão:

$ sudo firewall-cmd --get-default-zone
public

Ver a lista das zonas em uso:

$ sudo firewall-cmd --get-active-zones

public
  interfaces: eno16777736


Mostrar todas as zonas disponíveis:

$ sudo firewall-cmd --get-zones

block dmz drop external home internal public trusted work

Mudar a zona padrão para trusted e desfazer a alteração!

$ sudo firewall-cmd --set-default-zone=trusted

success
$ sudo firewall-cmd --set-default-zone=public
success

Para configurar uma interface temporariamente para a zona internal:
$ sudo firewall-cmd --zone=internal --change-interface=eno1
success

Fazer o mesmo de forma persistente:

$ sudo firewall-cmd --permanent --zone=internal --change-interface=eno1

success

que cria o arquivo /etc/firewalld/zones/internal.xml.

Para ver a zona associada a uma interface
$ sudo firewall-cmd --get-zone-of-interface=eno1
public

e finalmente para ver os detalhes sobre uma zona em particular:

$ sudo firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eno16777736
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:




Qualquer zona pode ser limitada a uma interface de rede, mas também pode ser limitada a endereços de rede. Um pacote é associado a uma zona se:

    Se ele vem de um endereço de origem que já está associado a uma zona, ou se não:
    Se ele vem através de uma interface de rede que está associada a uma zona.

Os pacotes que não se encaixarem nas regras acima são associados a zona padrão (normalmente public).

Para associar um source, ou uma origem, a uma zona (de forma permanente):

$ sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24
success

Isso diz que qualquer servidor com um endereço IP na faixa 192.168.1.x vai ser anexado a zona trusted.

Você pode remover um source, ou uma origem, que foi adicionada anteriormente usando a opção --remove-source, ou alterar a zona com --change-source.

Você pode listar os sources, ou as origens, associados a uma zona com o comando:

$ sudo firewall-cmd --permanent --zone=trusted --list-sources

192.168.1.0/24

Nos dois comandos, se você remover a opção --permanent o resultado vai afetar apenas a execução atual e não o estado que será restaurado após reiniciar o sistema.


Até agora nós associamos endereços de origem, ou sources, e interfaces de rede a zonas, mas não determinamos quais serviços e portas devem ser acessíveis em uma zona.

Para ver os serviços disponíveis:

$ sudo firewall-cmd --get-services

RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp \
high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps \
libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi \
pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh \
telnet tftp tftp-client transmission-client vnc-server wbem-https

ou para ver quais estão disponíveis em uma zona:

$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client ssh

para adicionar um serviço a uma zona:

$ sudo firewall-cmd --permanent --zone=home --add-service=dhcp

success
$ sudo firewall-cmd --reload

O segundo comando com a opção --reload é necessário para aplicar a alteração imediatamente. Outra forma de adicionar um novo serviço é editar arquivos na pasta /etc/firewalld/services.

A gestão de portas é muito parecida com a de serviços:

$ sudo firewall-cmd --zone=home --add-port=21/tcp

success
$ sudo firewall-cmd --zone=home --list-ports
21/tcp

A relação entre portas e serviços pode ser vista no arquivo /etc/services que associa a porta 21 com o serviço ftp:

$ grep " 21/tcp" /etc/services

ftp  21/tcp






Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

DHCP - Guia Completo

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

OPNsense - Firewall Open Source

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?

Aula #38 - Endereços de Rede

Ophcrack: Descubra todas as senhas do Windows