sexta-feira, 6 de dezembro de 2013

Debian como Servidor Proxy e Firewall


Debian como Servidor Proxy e Firewall

Começaremos uma série de posts sobre o uso do Linux em servidores.
Nosso primeiro material é o uso do Linux Debian como Servidor Proxy e Firewall.

Os procedimentos aqui apresentados são um conjunto de práticas obtidas por meio de leitura de diversos livros sobre o assunto e materiais online de fóruns e sites especializados. Qualquer procedimento que tenha sido aproveitado de algum outro local será devidamente identificado. Os processos de instalação do Debian já constam em outros posts porém sempre relembrarei alguma coisa que entenda como necessária. 

Este material serve inicialmente de apoio aos meus alunos do Técnico em Informática, principalmente aqueles que demonstram uma dificuldade por não serem habituados com ambientes de configuração em linha de comando. Importante ressaltar que sem pesquisa e dedicação não chegamos a local algum, o conhecimento não surge por osmose e sim por difusão. Apoio qualquer iniciativa de difusão do conhecimento de forma aberta. O conhecimento nos liberta...

_________________________________________________________________________________
Neste material mostrarei passo a passo como configurar um Servidor Proxy e Firewall Linux. Usaremos a distribuição Debian 6.0.7 como nossa base e ativaremos o firewall iptables (nativo do Linux) e o proxy Squid. Para o correto funcionamento precisaremos de duas placas de rede neste servidor, uma que estará ligada ao link externo (modem adsl, roteador, etc) e a outra ligada à rede local, geralmente direto no switch principal.
Os procedimentos aqui trabalhados são em ambiente de linha de comando, a instalação do debian será sem ambiente gráfico, por isso serão poucas imagens.
Antes, um breve esclarecimento do que seja cada um dos serviços.


Firewall: Se traduzirmos o nome ao pé da letra teremos algo como “parede de fogo”. “Você deve se perguntar, nossa que nome estranho para um serviço voltado para segurança, mas, pense: atravessar uma parede já é complicado, imagine se esta parede estiver pegando fogo”;). A função principal do firewall é não permitir que estranhos acessem a sua rede local para ter acesso a arquivos e também que dados internos confidenciais não saiam sem a devida autorização. Usamos firewalls diariamente sem sabermos, o próprio Windows, desde sua versão XP já vem com um firewall nativo funcionando.

Proxy: Tem como função servir de intermediário entre solicitações de máquinas. Usamos geralmente o proxy para filtrar o acesso à Internet, dizendo quem pode acessar e o que pode acessar. Os servidores proxy possuem diversas formas de existência sendo o transparente o método onde qualquer usuário da rede local passe por ele para sair dela.

Passo 1: Instalando o Debian com duas interfaces de rede:
Ao colocar o DVD do Debian no seu drive óptico e iniciar a máquina terá esta tela inicial:

Selecione a opção que melhor se enquadra com seu hardware (32 bits ou 64 bits). Neste caso eu escolhi a opção de instalação 64 bits. O processo inicial é basicamente a seleção de idioma, layout de teclado, cópia dos arquivos essenciais do DVD para a memória da máquina e logo em seguida o reconhecimento do hardware instalado. Nesse caso, como temos duas placas de rede, ele perguntará qual delas que será ligada à rede externa.

Como estou usando máquina virtual para a elaboração deste material, as interfaces são iguais. Não há problema em usar duas placas de rede iguais já que o MAC Address de cada uma nunca será o mesmo. Identifique para ele qual das placas está ligada na rede externa, sendo no meu caso a eth0.
O processo de instalação seguirá em frente configurando a interface de rede automaticamente caso tenha um DHCP funcionando. Os roteadores ADSL possuem essa configuração onde podem funcionar como servidores DHCP além de permitirem a comunicação entre sua rede e a do provedor. Caso seu roteador ADSL não esteja com essa função habilitada, por protocolo PPPoE e esteja funcionando em modo BRIDGE, mude esta configuração. Para mais informações sobre configurações de equipamentos de acesso dos provedores visite a Associação Brasileira dos Usuários de Acesso Rápido . 
O próximo passo é criar uma senha para o ROOT e confirmá-la, criar um usuário, uma senha para ele e confirmá-la e dar um nome para  a máquina. Corporativamente, existem documentos que informam os nomes das máquinas ou como devem ser designados. Não tem problema você não colocar o nome correto na instalação pois posteriormente poderá mudar o nome da máquina. Após isso entraremos no menu de particionamento. Farei o processo mais simples onde particionarei a unidade de modo assistido, uma única partição para todo o sistema (recomendado para os iniciantes). Em breve lançarei um material falando sobre o particionamento do sistema Linux e seus diversos layouts.

1. Escolhendo o método de particionamento:

 2. Selecionando o disco a ser particionado.

 3. Selecionando o esquema de particionamento.


 4. Confirmando o layout:


Criadas as partições e formatadas, o processo agora é da instalação do sistema.

Você será questionado sobre o uso de um espelho de rede para o gerenciador de pacotes. É importante que aqui você confirme e que a máquina esteja conectada à Internet pois neste momento os repositórios serão configurados para que instalemos os programa e serviços depois.


Quase no fim da instalação você será questionado sobre a seleção de software. No caso desta máquina selecione apenas os Utilitários Standard de Sistema. Para remover alguma seleção basta mover o cursos sobre a opção e apertar a tecla espaço.

A instalação terminará e teremos a seguinte tela:




A partir de agora o procedimento é 100% em linha de comando. Colocarei os comandos em ordem e algumas imagens para ajudá-lo a se localizar. Para entender, todos os comandos em modo ROOT serão iniciados por um #. Avisarei quando o texto é localizado em um script ou não.

Faça o login com o usuário ROOT, nesse caso você poderá fazer isso para que possamos iniciar o processo de instalação e configuração dos serviços. 
O primeiro passo é a configuração das interfaces de rede. O arquivo de script onde estas configurações são armazenadas fica dentro de /etc/network e o arquivo recebe o nome de interfaces. Vamos editá-lo através do VI.
Chame-o para edição com o comando abaixo:

# vi /etc/network/interfaces

Encontrará um arquivo da seguinte forma:

Esta é a configuração inicial do sistema, quando configuramos a primeira interface (eth0) na instalação. A outra que aparece é a interface virtual de loopback na qual a máquina envia pacotes para ela mesma.
Precisamos aqui, inserir algumas linhas novas para configurarmos a segunda interface de rede (eth1).
Além disso adicionaremos uma linha na interface eth0 para que, ao reiniciarmos o serviço, ela renove a concessão de endereço IP com o roteador ou modem. Esta linha é "auto eth0".

Para a configuração da eth1, você precisa já ter um esquema de endereçamento IP definido. No meu caso, criei um layout de endereçamento com subrede para reduzir o número de hosts dentro da minha lan.
Meu layout ficou assim:
REDE: 172.16.214.64/27 (Uma máscara de 27 bits - 255.255.255.224 - que permite apenas 30 hosts)
BROADCAST: 172.16.214.95
Intervalo de endereços válidos vão de 172.16.214.65 até 172.16.214.94.

Dentro do arquivo interfaces adicionaremos as linhas:

auto eth1
allow-hotplug eth1
iface eth1 inet static
address 172.16.214.94
netmask 255.255.255.224
network 172.16.214.64
broadcast 172.16.214.95

Além da linha adicionada no eth0:

auto eth0


Ficaremos com o arquivo da seguinte forma:

Veja as alterações. Salve o arquivo e saia dele. Pressione <ESC>, :wq <ENTER>.
Agora precisamos reiniciar as interfaces através do comando:

# service networking restart

Agora vamos iniciar o processo de configuração básica do firewall através do IPtables, um serviço nativo do linux. Para isso vamos criar um script que acione o serviço e o configure corretamente. Encontramos na Internet uma série de modelos de script para usar, procure sempre adequar à sua realidade. O que usarei aqui é cortesia do Carlos Eduardo Morimoto  em seu Livro Servidores Linux - Guia Prático  da qual recomendo a aquisição. Uso o script gerado por ele por ser um script simples e funcional que permite que futuramente novas linhas possam ser integradas a ele. Apenas adicionei uma linha que permite que o IPTABLES redirecione as solicitações provenientes da porta 80 para a porta do SQUID padrão 3128.
Vamos criar um arquivo vazio via editor VI para começarmos a configurar nosso firewall. O nome do arquivo é de sua escolha, usarei o nome firewall para meu arquivo. Digitaremos o comando:

# vi /etc/init.d/firewall

O arquivo firewall ficará dentro de /etc/init.d onde todos os script de inicialização de serviços se encontram.

O script será preenchido assim:

#! /bin/bash
#interface de internet:
ifinternet=”eth0”
#interface de rede local:
iflocal=”eth1”
iniciar(){
     modprobe iptable_nat
     echo 1 > /proc/sys/net/ipv4/ip_forward
     iptables –t nat –A POSTROUTING –o $ifinternet –j MASQUERADE
#Só adicione a linha abaixo se usar o SQUID
iptables –t nat –A PREROUTING –i eth1 –p tcp -–dport 80 –j \REDIRECT -–to-port 3128
#Só adicione a linha acima se usar o SQUID
     iptables –A INPUT –p icmp -–icmp-type echo-request –j DROP
     echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
     iptables –A INPUT –m state -–state INVALID –j DROP
     iptables –A INPUT –i lo –j ACCEPT
     iptables –A INPUT –i $iflocal –j ACCEPT
     iptables –A INPUT –p tcp –-dport 22 –j ACCEPT
     iptables -A INPUT –p tcp -–syn –j DROP
}
parar(){  
     iptables –F
     iptables –F –t nat
}
case “$1” in
     “start”) iniciar ;;
     “stop”) parar ;;
     “restart”) parar; iniciar ;;
     *) echo “Use os parametros start, stop ou restart”
esac

Este script básico permitirá que as requisições que chegam em eth1, se aprovadas, passem para eth0 e sigam seu caminho além de proteger o servidor contra pings, acessos anônimos entre outras coisas. Como dito, este é um script básico inicial. Você pode se aprofundar no IPTABLES e continuá-lo! Salve e saia do arquivo. 
Este script precisa ser executado e para isso precisamos dar a permissão de execução para ele através do comando:

# chmod 700 /etc/init.d/firewall

Esse comando dará permissão somente ao proprietário do arquivo para execução, ou seja, o ROOT. Se quiser que qualquer usuário possa executá-lo mas não editá-lo mude o 700 para 755. Esta questão de permissões de arquivos e pastas será trabalhada em breve quando conversarmos sobre servidores de arquivos (SAMBA) num post que virá em breve.
Para executá-lo digite o comando:

# service firewall start
ou
# /etc/init.d/firewall start
Se alguma coisa foi digitada de forma errada no script, essa é a hora onde o sistema apontará os erros, caso contrário, ele simplesmente retornará aguardando novo comando sem avisar nada. Preste atenção nos avisos (se houverem) pois o sistema indica o que falta ou está errado e em que linha isso ocorre. Basta reabrir o script através do editor VI e fazer as alterações.

Com o primeiro passo terminado, agora precisamos instalar o SQUID, servidor proxy Linux. O procedimento de instalação é simples, bastando digitar o comando abaixo:

# apt-get install squid

O serviço será instalado e ativado. Nesse caso a ativação falhará pois o script ainda não foi montado de acordo com a necessidade. O primeiro passo aqui é guardar o script de configuração original e criar um novo. Para isso mova o arquivo mudando seu nome através do comando:

# mv /etc/squid/squid.conf /etc/squid/squid.conf.old

Agora, crie um novo arquivo:

# vi /etc/squid/squid.conf

Existem muitas opções de configurações para o Squid, nesse caso você precisa saber antecipadamente quais são as normas de segurança da informação da instituição para que o serviço se adeque a elas. Mostrarei basicamente um proxy que bloqueia por blacklist de URLs e nomes.

O script ficará assim:

http_port 3128 transparent
visible_hostname [nome do servidor]
cache_mem 64 MB 
maximum_object_size_in_memory 64 KB 
maximum_object_size 512 MB 
minimum_object_size 0 KB 
cache_swap_low 90 
cache_swap_high 95 
cache_dir ufs /var/spool/squid 2048 16 256 
cache_access_log /var/log/squid/access.log 
refresh_pattern ^ftp: 15 20% 2280 
refresh_pattern ^gopher: 15 0% 2280 
refresh_pattern . 15 20% 2280
acl all src 0.0.0.0/0.0.0.0 
acl manager proto cache_object 
acl localhost src 127.0.0.1/255.255.255.255 
acl SSL_ports port 443 563
acl Safe_ports port 21 80 443 563 70 210 280 488 59 777 901 1025-65535
acl purge method PURGE 
acl CONNECT method CONNECT
http_access allow manager localhost 
http_access deny manager 
http_access allow purge localhost 
http_access deny purge 
http_access allow !Safe_ports 
http_access deny CONNECT !SSL_ports
acl [nomedaregra] url_regex –i “[caminho do arquivo]” 
http_access deny [nomedaregra] 
acl [nomedaregra] dstdom_regex “[caminho do arquivo]” 
http_access deny [nomedaregra]

acl redelocal src [endereço da sua rede/máscara da sua rede] 
http_access allow redelocal 
http_access allow localhost 
http_access deny all

Vou explicar algumas partes do script para que saiba do que estamos falando aqui.
A primeira linha (
http_port 3128 transparent) indica a porta pela qual o serviço "ouvirá" as solicitações, lembrando que no firewall registramos uma linha onde todo o tráfego da porta 80 seria redirecionado para a porta 3128. Se quiser adicionar novas portas basta repetir a linha, mudando o valor 80 para o número da porta que deseje que o proxy atenda também. Lembrando que se não redirecionarmos as portas elas passarão direto sem serem analisadas pelo proxy. No caso deste material, o redirecionamento é apenas de tráfego http. Além disso indicamos que funcionará de modo transparente ou seja, o cliente tem seu tráfego passando pelo proxy porém não aparente.
A segunda linha (
visible_hostname) é o nome que aparecerá quando a página de bloqueio for apresentada no navegador do cliente.
A próxima linha (
cache_mem) indica a quantidade de memória RAM será alocada para o cache do proxy, recomenda-se que nunca ultrapasse 1/3 do total da memória do sistema.
Depois definimos o tamanho máximo dos arquivos que serão guardados no cache da memória RAM através  da linha (
maximum_object_size_in_memory). As linhas abaixo indicam a configuração do cache em disco (maximum_object_size) e (minimum_object_size).
Definimos como o servidor fará a limpeza do cache, indicando a porcentagem máxima e mínima (
cache_swap_low) e (cache_swap_high).
Também indicamos onde o squid armazena o cache em disco (
cache_dir ufs /var/spool/squid 2048 16 256), onde o número 2048 significa o espaço em disco destinado ao armazenamento em megabytes, 16 o número de pastas internas e 256 suas subpastas. Poderão ser criadas 16 pastas com 256 subpastas nesse caso específico.
Indicamos o arquivo do LOG (
cache_access_log). As três linhas seguintes indicam de quanto em quanto tempo (minutos) o servidor atualizará os caches.
A próxima linha cria uma access list onde será depositado um objeto para regra. Neste caso é (
acl all src 0.0.0.0/0.0.0.0). Esta entrada significa que criamos uma lista de acesso chamada "all" que compreende qualquer endereço IP em qualquer máscara.
Após isso adicionamos duas listas chamadas "
SSL_Ports" e "Safe_ports" que limitarão as portas que podem ser usadas pelo proxy. Estas portas constam do arquivo original que renomeamos.
Toda lista de acesso criada precisa ser autorizada ou não por isso a linha "
http_access" aparece tantas vezes chamando o nome de uma lista e completando com "allow" para permitir e "deny" para bloqueio.
As linhas abaixo são as regras de bloqueio para URL e nomes:

acl [nomedaregra] url_regex –i “[caminho do arquivo]” 
http_access deny [nomedaregra] 
acl [nomedaregra] dstdom_regex “[caminho do arquivo]” 
http_access deny [nomedaregra]

Como disse anteriormente, faríamos uma blacklist, por isso o deny em cada uma delas. Para as listas, precisaremos criar dois arquivos em alguma pasta (pode ser a do próprio squid), preenchê-las de acordo com o que quer bloquear e colocar o caminho completo na ACL, exemplo:

acl URLBLOCK url_regex –i “/etc/squid/urlblock” 
http_access deny URLBLOCK  
acl NOMEBLOCK dstdom_regex “/etc/squid/nomeblock” 
http_access deny NOMEBLOCK 

Perceba que dei o mesmo nome para a regra e para o arquivo afim de facilitar o trabalho. Depois basta abrir os arquivos e, no caso das URLs colocar linha por linha cada uma e no caso dos nomes a mesma coisa.
No final indicamos qual o endereço da rede local e da máscara e liberamos a rede local, o host local e negamos todos os demais.
Após este procedimento, precisamos reiniciar o serviço do Squid com o comando:

# service squid restart

Teste suas configurações tentando acessar a internet a partir de uma outra máquina.

Nenhum comentário:

Postar um comentário