ÍNDICE

Firewall para uma Rede interna
Firewall com DMZ
Explicações sobre Firewall
Entendimento do Firewal
Firewall Simples para uma rede interna
Repasses da rede interna
Backups

quinta-feira, 18 de novembro de 2010

Servidor FTP

Dando continuidade ao tópico Servidores Web com pasta compartilhada vamos instalar o servidor FTP.

Com esta etapa iremos prover acesso via FTP ao servidor web para que os desenvolvedores web possam postar as páginas.
A ideia é que tenhamos um diretório (/web) onde todos os usuários desenvolvedores possam gravar nele.

Vamos fazer as etapas a seguir somente no servidor web1.

Inicilamente vamos criar um grupo para os usuários que conectarão via ftp, que será dono do diretório compartilhado.

[root@web1 ]# groupadd gweb

Criaremos dois usuários tendo como grupo primário o grupo gweb criado anteriormente. O diretório do usuário será o diretório comum dos serviores web que é /web. A opção -M é para não criar o diretório, pois ele já existe.

[root@web1 ]# useradd -g gweb -d /web -M user1
[root@web1 ]# useradd -g gweb -d /web -M user2

Coloque a senha para os usuários

[root@web1 ]# passwd user1
[root@web1 ]# passwd user2

Troque as permissões do diretório /web.

[root@web1 ]# chmod 770 /web

Isto dará permissão para o usuário e grupo ler, gravar e entrar no diretório, mas outros não terão nenhum acesso.

[root@web1 ]# chown :gweb /web

Isto irá alterar o grupo proprietário do diretório como sendo do grupo gweb.

Também não podemos esquecer de colocar o apache tendo como grupo adicional o grupo gweb.

[root@web1 ]# usermod -G gweb apache

Instalação do Servidor FTP

Instale o pacote vsftpd.

[root@web1 ]# yum install vsftpd

Após instalar o pacote vamos fazer alguns ajustes. Para isto edite o arquivo de configiuração.

[root@web1 ]# vim /etc/vsftpd/vsftpd.conf

Altere a variável

local_umask=022

para

local_umask=002

Isto fará com que todos os arquivos e diretórios criados pelo servidor ftp deixem o grupo ler e gravar.

Adicione ao final do arquivo

chroot_local_user=yes

Isto irá bloquear os usuários em seus diretórios.

Testes

Para testar se está funcionando conecte ao servidor ftp com o usuário user1.

[root@web1 ]# ftp localhost

Entre com a senha que criou e veja certifique-se de que o usuário está bloqueado em seu diretório.

ftp> pwd
257 "/"
ftp>

Isto indica que o usuário está bloqueado, pois apareceu "/" e não o diretório dele "/web".

Agora o servidor está pronto para receber as páginas dos desenvolvedores.

Lembre de postar qualquer comentário caso apareça alguma dúvida.

domingo, 12 de setembro de 2010

Firewall - Repasses da rede interna

Até o asssunto anterior estavamos preocupados com os pacotes que entravam se saiam do firewall, agora vamos analisar os pacotes que irão passar pelo firewall.

Um primeiro método seria liberar o acesso a consultas dns e acesso web para toda a rede interna.

#!/bin/bash
# A criação de variáveis de ambiente irá facilitar a troca de alguns parâmetros no firewall.
INT_NET=192.168.0.0/24
INT_IF=eth1
EXT_IF=eth0

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp --dport 137:139 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Aceita todos os pacotes que estiverem sendo repassados, independente das interfaces, desde
# que sejam pacotes na qual as conexões já estejam estabelecidas ou relacionadas.
iptables -A FORWARD -m state --state ESTABLISH,RELATED -j ACCEPT

# Aceita repassar os pacotes que tenham como origem a rede interna, estejam entrando na
# interface interna e saindo na interface externa, protocolo sendo UDP com destino a porta
# 53(DNS) e o estado da conexão seja uma nova conexão.
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p udp --dport 53 -m state --state NEW -j ACCEPT

# Aceita repassar os pacotes que tenham como origem a rede interna, estejam entrando na
# interface interna e saindo na interface externa, protocolo sendo tcp com destino as portas
# 80(http) e 443(https) e o estado da conexão seja uma nova conexão.
# Note que foi usado o módulo multiport, pois colocamos como destino mais de uma porta.
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT

iptables -A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE

Para acesso ftp o controle da conexão deve ser alterado devido ao modo como o o ftp trabalha.

O FTP é um protocolo que dificulta muito a vida de quem implementa regras de filtragem no IPTABLES. O motivo é a forma que o FTP estabelece suas conexões, pois muitas vezes é impossível mapear quais portas serão feitas as conexões.

O Connection Tracking é um módulo do Linux utilizado para acompanhar estas conexões "ajudando" o IPTABLES a saber que um determinado pacote é relacionado a uma conexão já existente.

#!/bin/bash
INT_NET=192.168.0.0/24
INT_IF=eth1
EXT_IF=eth0

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp --dport 137:139 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Liberação de acesso ao cache de DNS para a rede interna.
iptables -A INPUT -p udp --dport 53 -s $INT_NET -i $INT_IF -m state --state NEW -j ACCEPT

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

#-------------------------------------------------
# Liberação de acessos via FTP para a rede interna
#
# Primeiramente carregue o módulo de Connection Tracking do FTP
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# Libere o acesso a porta 21
iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p tcp -m multiport --dports 21,80,443 -m state --state NEW -j ACCEPT

iptables -A FORWARD -s $INT_NET -i $INT_IF -o $EXT_IF -p udp --dport 53 -m state --state NEW -j ACCEPT

iptables -A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

iptables -t nat -A POSTROUTING -o $EXT_IF -j MASQUERADE

domingo, 5 de setembro de 2010

Firewall Simples para uma rede interna

Abaixo segue um firewall incial para entendimento do funcionamento do firewall no linux. Para testar o funcionamento do firewall podemos instalar uma máquina virtual com windows XP e colocá-la na rede interna deste firewall, e não esquecer de instalar o pacote iptraf, que é um monitor de tráfego em tempo real muito útil para verificação dos pacotes que estão passando pelo firewall, uma ferramenta útil na resolução de problemas.

A seguir temos um firewall que irá deixar todo o tráfego da rede interna sair para a Internet sem qualquer bloqueio, isto é apenas uma situação inicial.

[root@fw ~] vim /root/bin/fw2.sh

#!/bin/bash

# Limpa as regras e chains da tabela FILTER
iptables -F
iptables -X

# Limpa as regras e chains da tabela NAT
iptables -t nat -F
iptables -t nat -X

# Coloca a politica das chains INPUT e FORWARD como descarte dos pacotes
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Aceita todos os pacotes que estejam entrando na interface de lopback
iptables -A INPUT -i lo -j ACCEPT

# Registra todos os pacotes que estejam entrando no firewall, limitado a 1
# pacote por segundo colocando um prefixo no registro de acordo com a chain,
# isto serve para melhor identificar relativo a qual chain é o registro
# Para que este registro seja gravado em um arquivo separado do
# /var/log/messages altere no arquivo /etc/syslog.conf e inclua na última
# linha
# *.debug /var/log/debug.log
iptables -A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

# Irá mascarar todas as requisições como se fosse o IP da interface eth0 que estivesse pedindo
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Em uma segunda situação podemos bloquear os pacotes de broadcast do windows vindos da rede interna.

[root@fw ~] vim /root/bin/fw3.sh

#!/bin/bash

# Limpa as regras e chains das tabelas FILTER e NAT
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Coloca a politica das chains INPUT e FORWARD como descarte dos pacotes
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Aceita todos os pacotes que estejam entrando na interface de lopback
iptables -A INPUT -i lo -j ACCEPT

# Bloqueia todos os pacotes que sejam do protocolo UDP com destino a porta 137 que estejam
# entrando em qualquer interface.
iptables -A INPUT -p udp --dport 137 -j DROP

# Registra todos os pacotes que estejam entrando ou passando pelo firewall, limitado a 1 pacote por segundo.
iptables -A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

# Irá mascarar todas as requisições como se fosse o IP da interface eth0 que estivesse pedindo
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Uma outra situação seria bloquear todas os pacotes vindos da rede interna das máquinas windows e liberar acesso a administração remota via ssh.

[root@fw ~] vim /root/bin/fw4.sh

#!/bin/bash

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

iptables -P INPUT DROP
iptables -P FORWARD DROP

# Aceita a entrada de todos os pacotes que pertença a conexões estabelecidas ou relacionadas
# independente da interface de entrada
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i lo -j ACCEPT

# Bloqueia todos os pacotes que sejam do protocolo UDP com destino ao range de portas que vão
# de 137 a 139 que estejam entrando em qualquer interface.
iptables -A INPUT -p udp --dport 137:139 -j DROP

# Aceita a entrada de pacotes que sejam do protocolo TCP com destino a porta 22 e sejam início
# de conexão
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

iptables -A INPUT -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:INPUT] "
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-level debug --log-prefix "[FW:FORWARD] "

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Até o momento nos preocupamos com os pacotes que chegaram ao firewall, ou seja, trabalhamos somente com a chain INPUT, posteriormente mudaremos o firewall para trabalhar com os pacotes que irão atravessar o firewall, chain FORWARD. Iremos controlar o acesso da rede interna à rede externa.