Vous êtes sur la page 1sur 11

Construindo um Firewall / Proxy com o Fedora Core 4

Autor: Sandro Venezuela <svenezuela at terra.com.br> Data: 10/02/2006 Instalao do Fedora Core 4 Como este servidor ser um firewall/proxy, no necessitamos de interface grfica e, tambm, nenhuma aplicao X. Nenhum servio alm do necessrio deve ser instalado, como por exemplo, telnet, sendmail, etc. Lembre-se sempre que cada servio habilitado desnecessariamente um caminho para a intruso do seu sistema. Assim, iremos realizar a instalao mnima do Fedora. Outro questo importante sobre o particionamento do disco, onde utilizaremos a seguinte configurao:
Partio /dev/hda1 /dev/hda2 /dev/hda3 /dev/hda5 /dev/hda6 /dev/hda7 /dev/hda8 Ponto de Montagem /boot /usr /var/log / /home /tmp swap Tamanho (MB) 95 4400 4400 1500 1000 256 256

O objetivo da criao destas parties comear a aplicar segurana a partir do sistema de arquivos, como por exemplo, se o disco for dividido em somente trs parties: /boot, / e swap, um invasor que consiga acesso, mesmo sem ser root, pode "derrubar" o seu servidor simplesmente copiando arquivos para o diretrio /tmp, onde como todos sabemos tem permisso de escrita para qualquer um, at que o mesmo fique completamente utilizado, fazendo com que o sistema fique sem espao disponvel para nenhuma outra atividade importante. Outra questo importante sobre o tamanho da rea de swap, onde nem sempre o clculo de multiplicar duas vezes o tamanho da memria RAM o mais correto, por isto sempre recomendado um estudo antecipado, de acordo com os servios que estaro disponveis. Lembrando ainda que um sistema com freqente utilizao da rea de swap, evidente que temos um problema de falta de memria RAM o que proporciona problemas de performance. Aps estas observaes, podemos continuar com o processo de instalao do Fedora, onde o prximo passo seria a colocao de uma senha no gerenciador de boot GRUB. Mais uma vez, vale lembrar que recomendado o uso de senhas entre 10 e 12 caracteres, onde podemos forar este tamanho, alterando o campo PASS_MIN_LEN do arquivo /etc/login.defs e misturando todos os tipos de caracteres permitidos. A mesma recomendao deve ser utilizada na definio da senha do administrador: root. A configurao da senha do GRUB pode ser realizada tanto no momento da instalao, onde eu recomendo, ou aps o trmino. Para adicionar a senha depois que o sistema j estiver instalado, temos os

seguintes passos: # grub-md5-crypt Aps digitar a senha, a mesma ser impressa na tela, s que criptografada, de acordo com o exemplo abaixo: $L1g#NMd345P. O ltimo passo consiste em copiar a senha e adicionar a seguinte linha no arquivo /boot/grub/grub.conf: password --md5 $L1g#NMd345P. Pronto! Para testar basta reiniciar o servidor e tentar acessar como mono-usurio.

Procedimento de Segurana Ps-Instalao Com o fim da instalao do servidor, vamos armazenar uma lista de todos os pacotes que foram instalados. Para isto usaremos o seguinte comando: # rpm -qa >> pacotes_instalados.txt Em seguida, iremos armazenar uma lista de todos os arquivos com SUID e SGID configurados, com o propsito de realizarmos varreduras futuras, verificando a existncia de novos arquivos, que podem ser possveis backdoors. Para isto, usaremos os comandos abaixo: # find / -type f -perm -4000 >> arquivos_suid.txt # find / -type f -perm -2000 >> arquivos_sgid.txt O prximo passo, consiste em limitar o acesso ao servidor, onde primeiro vamos editar o arquivo /etc/inittab e diminuir a quantidade de terminais, deixando somente dois, de acordo com as linhas abaixo: # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 #3:2345:respawn:/sbin/mingetty tty3 #4:2345:respawn:/sbin/mingetty tty4 #5:2345:respawn:/sbin/mingetty tty5 #6:2345:respawn:/sbin/mingetty tty6 No mesmo arquivo, vamos impedir o uso das teclas CTRL+ALT+DEL, para isto basta comentar a linha: # Trap CTRL-ALT-DELETE #ca::ctrlaltdel:/sbin/shutdown -t3 -r now Para finalizar esta etapa, iremos criar um usurio, por exemplo, sysadmin, que ser utilizado para entrar no

Para finalizar esta etapa, iremos criar um usurio, por exemplo, sysadmin, que ser utilizado para entrar no sistema. O comando necessrio seria: # adduser -m sysadmin Por padro, ao criar o usurio acima, criado tambm um grupo com o mesmo nome, ou seja, sysadmin. Depois bloquearemos o acesso para o usurio root, comentando todas as linhas do arquivo /etc/securetty. Melhorando um pouco, vamos limitar a quantidade de usurios, pertencentes ao grupo sysadmin, logados no sistema, atravs do arquivo /etc/security/limits.conf, onde acrescentaremos a seguinte linha: @sysadmin hard maxlogins 1 A linha acima vai permitir somente um nico usurio do grupo sysadmin logado no sistema. Lembrando que depois de todos os passos descritos anteriormente, no ser mais permitido o acesso direto ao sistema pelo usurio root, ento vale testar se realmente o novo usurio sysadmin consegue acesso ao sistema antes de reiniciar o servidor. O prximo passo consiste em limitar algumas parties, como /home, /tmp e /var/log, fazendo que no seja possvel executar qualquer binrio ou shell-script que pertena estas parties. Para isto, edite o arquivo /etc/fstab e acrescente os parmetros nosuid, noexec e nodev em cada partio descrita acima, como mostrado abaixo:
LABEL=/home /home ext3 LABEL=/tmp /tmp ext3 LABEL=/var /var ext3 nosuid,noexec,nodev,defaults nosuid,noexec,nodev,defaults nosuid,noexec,nodev,defaults 1 2 1 2 1 2

Finalizando, vamos atualizar o sistema, com o uso do comando yum, claro que o mesmo j deve estar navegando pela internet. # yum update

Configurao do Firewall A seguir, vamos configurar o firewall, onde para isto utilizaremos o script abaixo, que bloqueia tudo que no seja necessariamente importante, como por exemplo, Instant Messaging, P2P, BitTorrent, etc:

#!/bin/bash FW=/sbin/iptables if [ -z $FW ]; then echo "iptables: Command not found" exit 1 fi SYSCTL=/sbin/sysctl

if [ -z $SYSCTL ]; then echo "sysctl: Command not found" exit 1 fi PROBE=/sbin/modprobe if [ -z $PROBE ]; then echo "modprobe: Command not found" exit 1 fi ETH0="192.168.0.0/24" NET="0/0" LO="127.0.0.1" PA="1024:65535" CONFIG_DIR="/etc/firewall" set_policy() { # POLICY is DROP or ACCEPT local POLICY=$1 $FW -P INPUT $POLICY $FW -P OUTPUT $POLICY $FW -P FORWARD $POLICY } flush() { $FW -F $FW -F -t nat $FW -X $FW -X -t nat } allow_loopback() { $FW -A INPUT -j ACCEPT -i lo -d $LO $FW -A OUTPUT -j ACCEPT -o lo -s $LO } allow_icmp() { local FILE=$(cat $CONFIG_DIR/icmp_types.conf | grep -v ^#) $FW -N ALLOW_ICMP for TYPE in $FILE do $FW -A ALLOW_ICMP -j ACCEPT -p icmp --icmp-type $TYPE -d $ETH0 done

$FW -A ALLOW_ICMP -j ACCEPT -m limit --limit 1/s $FW -A ALLOW_ICMP -j DROP $FW -A INPUT -j ALLOW_ICMP -p icmp $FW -A OUTPUT -j ALLOW_ICMP -p icmp $FW -A FORWARD -j ALLOW_ICMP -p icmp } service_ports() { local FILE=$(cat $CONFIG_DIR/service_ports.conf | grep -v ^#) for PORT in $FILE do # Allow LAN to acess the firewall and the internet $FW -A INPUT -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT $FW -A OUTPUT -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA $FW -A FORWARD -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT $FW -A FORWARD -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA # Allow the firewall to access the internet $FW -A INPUT -j ALLOW_TCP -p tcp -i ppp0 --sport $PORT --dport $PA $FW -A OUTPUT -j ALLOW_TCP -p tcp -o ppp0 --sport $PA --dport $PORT done } adm_ports() { local FILE=$(cat $CONFIG_DIR/admin_ports.conf | grep -v ^#) for PORT in $FILE do $FW -A INPUT -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT $FW -A OUTPUT -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA done } allow_tcp() { $FW -N ALLOW_TCP $FW -A ALLOW_TCP -j ACCEPT -p tcp --syn $FW -A ALLOW_TCP -j ACCEPT -p tcp -m state --state ESTABLISHED,RELATED # Drop undesirable packages TCP $FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: NEW without syn: " -p tcp ! --syn -m state -state NEW $FW -A ALLOW_TCP -j DROP -p tcp ! --syn -m state --state NEW # Drop packages TCP badly formed #$FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: Badly formed: " -m unclean #$FW -A ALLOW_TCP -j DROP -m unclean

#$FW -A ALLOW_TCP -j DROP -m unclean # Port Scanner local FILE=$(cat $CONFIG_DIR/tcp_flags.conf | grep -v ^#) for FLAGS in $FILE do $FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: ($FLAGS): " -p tcp --tcp-flags ALL $FLAGS $FW -A ALLOW_TCP -j DROP -p tcp --tcp-flags ALL $FLAGS done $FW -A ALLOW_TCP -j DROP adm_ports service_ports } accept_dns_conn() { # To resolv internal network $FW -A INPUT -j ACCEPT -p udp -s $ETH0 --sport $PA -d $NET --dport 53 $FW -A OUTPUT -j ACCEPT -p udp -s $NET --sport 53 -d $ETH0 --dport $PA $FW -A FORWARD -j ACCEPT -p udp -s $ETH0 --sport $PA -d $NET --dport 53 $FW -A FORWARD -j ACCEPT -p udp -s $NET --sport 53 -d $ETH0 --dport $PA } accept_proxy() { $FW -t nat -A PREROUTING -j REDIRECT -p tcp -s $ETH0 --dport 80 -i eth0 --to-port 3128 } accept_internet() { $FW -t nat -A POSTROUTING -j MASQUERADE -s $ETH0 -o ppp0 } setup_kernel() { # Load Modules $PROBE ip_nat_ftp $PROBE ip_conntrack_ftp # Disable IP Spoofing attack $SYSCTL -w net.ipv4.conf.all.rp_filter=2 > /dev/null 2>&1 # Enable IP Forward $SYSCTL -w net.ipv4.ip_forward=1 > /dev/null 2>&1 # Kill Timestamps $SYSCTL -w net.ipv4.tcp_timestamps=0 > /dev/null 2>&1 # Enable protection Cookie TCP syn $SYSCTL -w net.ipv4.tcp_syncookies=1 > /dev/null 2>&1

$SYSCTL -w net.ipv4.tcp_syncookies=1 > /dev/null 2>&1 # Disable ICMP broadcast $SYSCTL -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null 2>&1 # Enable protection to bad error message $SYSCTL -w net.ipv4.icmp_ignore_bogus_error_responses=1 > /dev/null 2>&1 # It certifys that packages routed in the origin had been discarded $SYSCTL -w net.ipv4.conf.all.accept_source_route=0 > /dev/null 2>&1 # Change TTL value $SYSCTL -w net.ipv4.ip_default_ttl=255 > /dev/null 2>&1 # Ratemask to ICMPs: 0 3 4 5 8 11 12 $SYSCTL -w net.ipv4.icmp_ratemask=6457 > /dev/null 2>&1 # Recommended values of datagram TCP thinking about DOS and DRDOS attack $SYSCTL -w net.ipv4.tcp_fin_timeout=30 > /dev/null 2>&1 $SYSCTL -w net.ipv4.tcp_keepalive_time=1800 > /dev/null 2>&1 $SYSCTL -w net.ipv4.tcp_window_scaling=0 > /dev/null 2>&1 $SYSCTL -w net.ipv4.tcp_sack=0 > /dev/null 2>&1 } start() { echo "Starting Firewall: " set_policy DROP allow_loopback allow_icmp allow_tcp accept_dns_conn accept_proxy accept_internet setup_kernel } stop() { echo "Stopping Firewall: " set_policy ACCEPT flush } status() { echo ">> Showing table default: " $FW -L echo "" echo ">> Showing table nat: " $FW -L -t nat }

restart() { stop start } # Start of the firewall script case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) status ;; internet) accept_internet ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0 Para finalizar ainda temos os seguintes arquivos de configuraes, que devem ficar no diretrio /etc/firewall, utilizados pelo script acima: Arquivo icmp_types.conf: 0 3/0 3/1 3/2 3/3 3/4

4 5 8 11 12 Arquivo service_ports.conf: 20 21 22 25 80 110 143 443 3128 Arquivo admin_ports.conf: # Only administration ports, but only for INPUT and OUTPUT 22 Arquivo tcp_flags.conf: # Flags TCP that they cannot happen in a normal # communication, thus indicating possible sweepings FIN,SYN FIN,RST FIN,URG,PSH NONE RST,URG RST,PSH SYN,RST SYN,URG SYN,PSH SYN,URG,PSH Agora, para que o script do firewall seja iniciado juntamente com o servidor, estaremos copiando o mesmo no diretrio /etc/init.d, com o nome de firewall, e depois criaremos um link simblico no diretrio /etc/rc3.d apontando para ele, com o nome de S99firewall.

Configurao do Proxy Como soluo de Proxy, utilizei o famoso Squid, que na instalao mnima do Fedora Core 4 no est

presente, e assim necessrio instalar com a ajuda do comando yum. # yum install squid O arquivo de configurao /etc/squid/squid.conf e algumas configuraes bsicas esto apresentadas abaixo: http_port 3128 cache_dir ufs /var/spool/squid 100 64 64 acl all src 192.168.0.0/24 acl rede_interna src 192.168.0.0/24 http_access allow rede_interna httpd_accel_port 80 httpd_accel_host virtual httpd_accel_with_proxy on httpd_accel_uses_host_header on No estarei entrando em detalhes na configurao do Proxy, porm recomendo um estudo mais detalhado do mesmo, que pode ser encontrado no site do projeto: http://www.squid-cache.org

Outras configuraes Para finalizar, necessrio configurar talvez um IDS. No estarei mostrando estas configuraes, pois depende muito do ambiente que ser utilizado. Outra configurao importante diz respeito aos arquivos /etc/hosts.allow e /etc/hosts.deny, que so utilizados para controlar o acesso ao servidor, como por exemplo, atravs de SSH. Assim recomendado que somente a rede interna ou talvez um nico servidor remoto tenha direito de acesso ao servidor. O servio SSH tambm merece uma ateno especial e bons tutoriais podem ser encontrados aqui no site do Viva o Linux.

Consideraes finais
evidente que existem muitas outras configuraes que poderiam ser realizadas no servidor para torn-lo mais seguro ainda, porm acredito que somente com o que foi apresentado neste documento j trar uma boa segurana, no somente para o servidor mas tambm para toda a rede interna. Espero que tenha contribudo para o conhecimento de todos e qualquer sugesto ser muito bem vinda, pois este o esprito do cdigo-aberto, ou seja, compartilhar conhecimento. Autor: Sandro Venezuela

Autor: Sandro Venezuela Jabber: sandrovenezuela@jabber.3gnt.org

Consideraes Finais evidente que existem muitas outras configuraes que poderiam ser realizadas no servidor para torn-lo mais seguro ainda, porm acredito que somente com o que foi apresentado neste documento j trar uma boa segurana, no somente para o servidor mas tambm para toda a rede interna. Espero que tenha contribudo para o conhecimento de todos e qualquer sugesto ser muito bem vinda, pois este o esprito do cdigo-aberto, ou seja, compartilhar conhecimento. Autor: Sandro Venezuela Jabber: sandrovenezuela@jabber.3gnt.org

http://www.vivaolinux.com.br/artigo/Construindo-um-Firewall-Proxy-com-o-Fedora-Core-4 Voltar para o site