Olá amigos! Após um um bom tempo sem postar artigos na comunidade, estou de volta! Neste trabalho pretendo dar uma introdução das funcionalidades do Shorewall e como ele pode lhe auxiliar na configuração de um firewall, seja para uma rede corporativa, de pequeno porte, ou até mesmo para sua estação de trabalho.
Requisitos
Assume-se que o leitor já tenha conhecimentos mínimos de protocolos de comunicação, redes de computadores e do firewall Iptables/Netfilter.
Introdução
O Shorewall é uma ferramenta “front-end” de configuração do Iptables. Usando-o é possível implementar um firewall ou gateway através de entradas em um conjunto de arquivos de configuração. O Shorewall lê estes arquivos e informa ao Iptables as regras a serem implementadas.
A vantagem da utilização do Shorewall é uma estrutura mais legível dos arquivos e regras do firewall e um número reduzido de linhas para implementação do código desejado. O Shorewall não é nem de longe a ferramenta de configuração do Iptables mais amigável, mas oferece uma flexibilidade de configuração singular. Caso deseje uma ferramenta que não exija muitos conhecimentos técnicos , sugiro que utilize o Firestarter (www.fs-security.com).
Vamos utilizar um ambiente simples, composto de uma rede local ligada à internet por intermédio de um gateway/firewall para ilustrar nosso exemplo.
Instalação
No Debian, a instalação do Shorewall é realizada rapidamente com os comandos:
#aptitude updade
#aptitude install shorewall shorewall-doc
Geralmente, na instalação do Shorewall, ele cria uma pasta em /etc/shorewall contendo o arquivo de configuração do sistema “shorewall.conf” e os arquivos “masq”, “policy”, “interfaces”, “rules” e “zones”. Esses arquivos contêm as respectivas configurações default e explicações das diversas funcionalidades que podem ser atribuídas ao sistema. No Debian a pasta /etc/shorewall contém apenas o arquivo shorewall.conf, os demais arquivos estão contidos na pasta /usr/share/doc/shorewall/default-config. Caso queria utilizá-los na configuração do seu firewall/gateway, basta copíá-los para a pasta principal do sistema /etc/shorewall.
Configurando
O Shorewall faz uso do conjunto desses arquivos para gerar as regras no Iptables. Precisamos portanto conhecer o que cada um desses arquivos faz para podermos configurá-los da melhor maneira:
Zones
O Shorewall entende as redes ligadas a ele como zonas e estas são configuradas no arquivo /etc/shorewall/zones. Imagine que você tem um firewall que atua como gateway entre sua rede local e a internet, neste caso você teria seu arquivo zones com duas entradas, algo parecido com:
#ZONE TYPE OPTIONS
fw firewall
net ipv4
loc ipv4
Nas definições acima, temos uma zona para a internet (net) e outra zona para a rede local (loc) ambas do tipo ipv4 que é o padrão para os tipos de zonas no Shorewall, há também uma zona específica para o firewall (fw). Quando o arquivo zones é processado, o nome definido para a zona do firewall é armazenado numa variável shell de nome $FW, a qual é utilizada nas configurações do Shorewall para referenciar a zona do firewall. É possível definir o tipo das zonas como firewall, ipv4 e ipsec, este último dando suporte a criptografia. A coluna OPTIONS pode ser preenchida com parâmetros de criptografia para o tipo de zona ipsec. Para nosso exemplo a configuração exibida acima deve bastar.
Interfaces
O arquivo /etc/shorewall/interfaces relaciona as interfaces ou placas de rede às zonas ligadas a ela. Na nossa rede o arquivo interfaces teria a seguinte estrutura:
#ZONE INTERFACE BROADCAST OPTIONS
net eth0 detect dhcp
loc eth1 detect
A coluna zone contém a zona definida no arquivo /etc/shorewall/zones, a coluna interface deve ser preenchida com a respectiva placa de rede, na coluna broadcast pode-se colocar o endereço de broadcast de sua rede, caso prefira, complete com ‘detect’ para o Shorewall detectar automaticamente o endereço. No nosso caso, estou supondo uma ligação com a internet via modem ADSL, portanto na coluna options da zona net completei com dhcp, imaginando que o endereço IP será atribuído desta maneira a esta interface, caso possua um IP estático fornecido por um provedor de internet, deixe essa coluna em branco.
Policy
Este arquivo define as política padrões do Shorewall. Quando uma requisição de conexão é recebida pelo Shorewall, ele verifica se há regras no arquivo /etc/shorewall/rules que mencionam a conexão solicitada, caso não tenha, ele aplica a política configurada para a conexão no arquivo /etc/shorewall/policy.
#SOURCE DEST POLICY LOG
loc net ACCEPT
net all DROP info
all all REJECT info
Na configuração acima, as políticas definem que:
1) o tráfego da rede local com destino a internet é aceito;
2) o tráfego da internet para qualquer outra zona é ignorado e devidamente documentado em log;
3) qualquer tráfego que não se encaixe nas políticas acima é rejeitado e devidamente documentado em log;
Vale lembrar a diferença entre ignorar (DROP) e rejeitar (REJECT) o tráfego. Quando o tráfego é “dropado”, a requisição é ignorada e o firewall não retorna mensagem ao requisitante dizendo que sua solicitação foi negada, o que evita uma série de ataques conhecidos na internet, enquanto quando a requisição é rejeitada, o firewall responde a solicitação de conexão com uma mensagem de acesso não permitido. Para os clientes de sua rede interna, o ideal é que o tráfego não autorizado seja rejeitado, pois caso este seja dropado, alguns programas que tentam fazer conexões a internet ficarão a espera de uma mensagem de erro por muito tempo, gerando muitos chamados ao suporte técnico. Esta configuração que vimos é a sugerida no arquivo de configuração default do Shorewall, pessoalmente, eu prefiro adotar uma política mais severa, a qual proíbe qualquer tráfego não listado no arquivo de regras /etc/shorewall/rules, neste caso o arquivo de configuração ficaria da seguinte maneira:
#SOURCE DEST POLICY LOG
all all DROP info
Rules
O arquivo /etc/shorewall/rules é onde são definidas as regras que permitem ou proíbem acessos que passam pelo firewall. Basicamente, a sintaxe de uma regra é a segunte:
<ACTION> <SOURCE> <DEST> <PROTOCOL> <DEST PORT>
onde,
ACTION: Define a ação que se deseja aplicar para a conexão. As ações mais utilizadas são Accept, permitindo a conexão, Drop, ignorando-a, Reject, negando a permissão e retornando um pacote icmp- unreachable e Log, simplesmente gerando um log dos pacotes e permitindo a conexão.
SOURCE Origem do tráfego. Lembre-se que no Shorewall as regras são baseadas em zonas, por exemplo, caso tenha-se um tráfego oriundo da zona loc de um endereço IP 10.10.10.20 este deverá ser representado na coluna Source da seguinte forma: loc:10.10.10.20.
DEST Destino do tráfego (também representado como <zona>:<end. IP>.
PROTOCOL Protocolo da conexão esperada.
DEST PORT Porta de comunicação utilizada pelo serviço que será acessado.
Agora que entendemos a estrutura do arquivo rules, vamos ver alguns exemplos de regras:
#ACTION SOURCE DEST PROTOCOL DEST PORT
ACCEPT loc net tcp 53
ACCEPT loc net udp 53
ACCEPT net $FW tcp 22
Observando as regras acima, entendemos que:
1) Libera tráfego oriundo da rede interna com destino a internet na porta TCP 53 (DNS);
2) Libera tráfego oriundo da rede interna com destino a internet na porta UDP 53 (DNS);
3) Libera tráfego oriundo da internet com destino a rede interna na porta TCP 22 (SSH);
O Shorewall cria durante sua instalação um conjunto de macros na pasta /etc/share/shorewall que facilita muito a vida do administrador de rede. Com estas macros é possível simplificar a definição das regras mais comuns. Como exemplo vamos ver a definição de uma regra liberando o acesso a servidores DNS na internet para a rede interna. Esta regra que em vias normais necessitaríamos de 2 linhas para implementar (como mostrado no exemplo acima), quando utilizamos a macro, conseguimos o mesmo resultado com apenas uma linha.
#ACTION SOURCE DEST PROTOCOL DEST PORT
DNS/ACCEPT loc net
O Shorewall conta com um grande acervo de macros na pasta mencionada, mas caso ache necessário, é possível desenvolver suas próprias macros, bastando salvá-las com o nome macro.<Protocolo>.
Masq
Os endereços reservados pela RFC 1918 são destinados a utilização em redes internas e não são roteados pelos backbones da internet. Para que os hosts de uma rede privada acessem serviços na internet e disponibilizem outros serviços para outras redes, é necessário realizar uma tradução do endereço de origem em um endereço válido na internet. Imagine que um computador da rede local de sua empresa, vamos chamá-lo de PC1 precise conectar-se a um site na internet. Como isso seria possível, já que o endereço atribuído ao PC1 é um endereço reservado para uso em redes privadas? Primeiro o PC1 envia a solicitação de conexão ao firewall, que é quem faz a ligação de sua rede com o resto do mundo, o firewall por sua vez reescreve o endereço de origem da requisição com seu endereço externo (IP da internet) e o envia ao host solicitado. Ao receber a resposta da conexão, o firewall faz o caminho inverso, transmitindo ao PC1 a conexão estabelecida. Isso é conhecido como NAT – Network Address Translation, também conhecido como IP Masquerading ou SNAT – Source Network Address Translation. Estas configurações são feitas no arquivo /etc/shorewall/masq.
A princípio, nossa necessidade é traduzir os endereços da rede local para o endereço válido do firewall. A estrutura do arquivo ficaria assim:
eth0 eth1
Quando eth0 refere-se a interface externa do firewall e eth1 a interface da rede interna.
Conclusão
Com este exemplo de configuração do Shorewall vimos a implementação de um firewall para um ambiente extremamente simples. Certamente o ambiente de qualquer empresa será muito diferente deste, tão simplório. Como na maioria dos softwares, a melhor documentação é a do site oficial do produto, portanto, para quem deseja saber mais sobre o assunto: http://www.shorewall.net. Espero ter atingido meu objetivo de apresentar uma ferramenta que facilite a configuração de um firewall. Na empresa em que trabalho, a implementação do firewall usando o Shorewall nos custou cerca de 250 linhas, caso utilizássemos o Iptables, esta levaria cerca de 900 linhas de comandos.
Deixo um abraço a todos e até a próxima!