You are on page 1of 11

Port Knocking: Protegendo servios com FWKnop Autor: Waldemar Dibiazi Junior Data: 27/11/2009 - Ambiente: - Distribuio: Slackware

Linux 13.0 (32 bits) - Categorias de pacotes instaladas: A, AP, D, L e N. - Softwares utilizados: - FWKnop (1.9.12); - Bibliotecas utilizadas: - LibPCap (0.9.8); <waldemar at proredetelecom.com.br> <waldemar_jr at hotmail.com>

- Introduo A utilizao de servios de rede criptografados como o OpenSSH de extrema importncia na administrao remota de servidores. Entretanto, a utilizao de boas prticas de segurana, como por exemplo, alterao de portas padro, bloqueio do acesso direto ao usurio root e uso de senhas fortes no eliminam a tentativa de explorao de falhas de segurana nesses servios, fato que se agrava quando um exploit foi implementado para uma falha recm descoberta e ainda no foi divulgada, situao essa conhecida como zero-day exploit. Este artigo apresenta como implantar um servio de Port Knocking atravs do software FWKnop (FireWall KNock Operator) permitindo autorizar conexes a servios atravs de autenticao passiva. A autorizao passiva utilizada neste artigo far uso da biblioteca Pcap para realizar a captura dos pacotes. Port Knocking Port Knocking consiste em uma tcnica onde enviada uma sequncia de pacotes com destino a determinadas portas (knock sequence), conhecida como sequencia de batidas. O envio de uma sequencia especfica permitir disparar a execuo de uma tarefa no servidor, tarefa essa que tipicamente realiza a permisso de acesso a uma determinada porta atravs da manipulao de regras no firewall. Deste modo, o administrador teria que enviar pacotes numa sequencia especfica de portas, para que o servidor ao detectar a sequencia correta, executasse um script que criaria uma regra

autorizando a conexo a um determinado servio. Como analogia, seria a idia de utilizar a sequncia correta para abrir uma das portas do cofre de um banco. Como exemplo, suponha que a sequncia esta caracterizada pelo envio de quatro pacotes UDP com destino as portas 1001, 2002 e 3003, deste modo, dependendo da implementao do software, e claro, da sua configurao, teramos por exemplo que enviar essa sequencia (na ordem correta) e tambm em um intervalo mximo de tempo. A idia por trs do Port Knocking no to nova, sendo utilizada a um bom tempo por rootkits, permitindo assim que apenas o individuo que instalou o rootkit e/ou conhea a sequencia de portas a serem batidas pudesse fazer uso do servio na mquina do rootkit instalado. O uso da tcnica de Port Knocking permite que o firewall seja configurado em modo altamente restritivo, ou seja, bloqueie conexes a qualquer servio. Outra utilidade para este tipo de tcnica proteger servios que ainda no tiveram seus patches de segurana aplicados. Vale salientar que independente dos servios vulnerveis no estarem expostos devido o uso da tcnica de Port Knocking, aplicar patches regularmente uma boa prtica de segurana e no deve ser deixada de lado. Como exemplo de implementaes da tcnica de Port Knocking, temos o software knockd e mdulo recent do Iptables. Entretanto, iremos utilizar o software FWKnop pois o mesmo permite a utilizao de mecanismos que aumentam a segurana, como por exemplo, criptografia simtrica e assimtrica, atravs do envio de um nico pacote SPA (Single Packet Authorization). A figura 1 mostra o uso da tcnica de Port Knocking para obter autorizao do firewall para realizar conexo a um servio especfico.

Figura 1 Funcionalidade de port knocking implementada no Firewall para proteger servios.

FWKnop (FireWall KNock Operator) Conforme exposto anteriormente, o FWKnop um software de port knocking, que alm de permitir o uso tradicional da tcnica de Port Knocking, implementa tambm o uso de uma tcnica chamada SPA (Single Packet Authorization). O uso desta tcnica diferentemente da tcnica tradicional (onde so enviados pacotes em uma sequencia especfica de portas), refere-se ao envio de apenas um nico pacote (criptografado) com destino a uma porta. O FWKnop pode ser utilizado nas plataformas Linux, BSD (Mac) e Windows atravs do uso do Cygwin. A ferramenta cliente para Windows no necessita do uso do CygWin, mas foi implementada utilizando o framework .Net Um dos problemas com implementaes tradicionais de Port Knocking, est na ocorrncia de pacotes que chegaram fora de ordem, situao essa que no ocorre com o FWKnop devido o uso da tcnica SPA. Uma dos principais vantagens do uso do FWKnop em relao as implementaes como Knockd, que o processo criptografado, ou seja, o contedo do pacote criptografado o fator que implicar na autorizao do uso do servio, e no apenas o envio de pacotes com qualquer contedo se baseando numa sequencia especfica de portas. Em implementaes como o Knockd uma pessoa que estivesse realizando o sniffing de pacotes na rede, poderia idenficar a sequncia (knock sequence). Deste modo, a camada de proteo adicional que ocultava o servio seria facilmente quebrada, voltando ao patamar anterior, o servio exposto. Instalando o FWKnop O software FWKnop realiza o uso de diversos mdulos implementados em Perl para o funcionamento de seus recursos. A compilao do mdulo Net::RawIP depende da instalao da biblioteca Pcap (utilizada por exemplo, no utilitrio tcpdump e claro, na famosa ferramenta Wireshark). Sendo assim, iremos obter e instalar a biblioteca PCap: # cd /root # wget -c ftp://fr.rpmfind.net/linux/fedora/releases/11/Everything/i386/os/Packages/libpcap0.9.8-4.fc11.i586.rpm # rpm2tgz libpcap-0.9.8-4.fc11.i586.rpm # installpkg libpcap-0.9.8-4.fc11.i586.tgz Em seguida criaremos um link simblico para o arquivo de objeto compartilhado da biblioteca: # ln -sf /usr/lib/libpcap.so.0.9.8 /usr/lib/libpcap.so Agora procederemos com a compilao e instalao do FWKnop:

# wget -c http://www.cipherdyne.org/fwknop/download/fwknop-1.9.12.tar.bz2 # cp fwknop-1.9.12.tar.bz2 /usr/local/src/. # cd /usr/local/src # tar -xvjf fwknop-1.9.12.tar.bz2 # cd fwknop-1.9.12 # ./install.pl Pressione ENTER para que o fwknop seja executado no sistema em modo servidor [server]. Em seguida pressione ENTER novamente para que o mtodo de aquisio de dados seja baseado no uso da biblioteca pcap [pcap]. Informe a interface de rede que ter os pacotes capturados. No caso de um firewall onde a funcionalidade de port knocking for implementada para autorizar conexes originadas da Internet, ser informada a interface correspondente a conexo de Internet, por exemplo, eth0. O script de instalao questionar se voc deseja utilizar um endereo de e-mail diferente para que alertas sejam enviados a ele, neste artigo estarei desconsiderando o enviando de alertas por e-mail, portanto voc poder responder com 'n'. Em seguida o script questionar se desejamos que o FWKnop seja inicializado durante o carregamento do sistema, pressione ENTER novamente. Realizando testes de funcionalidades O FWKnop possui um script em Perl que realiza uma srie de testes, neste caso, 317 testes onde so verificados o uso de algortmos de criptografia, protocolos diferentes para envio do SPA, utilizao de mtodo de autenticao atravs do GnuGPG, e claro, insero/remoo de regras nas chains do NetFilter/IPtables. A existncia de determinados erros no significar necessariamente que o FWKnop no funcione, mas a ocorrncia de xito em todos garantia de que todos os recursos estaro funcionais e disponiveis caso deseje utiliza-los. A falha durante o teste nmero 7 ser normal ocorrer, pois o script tentar executar o daemon do FWKnop, e o mesmo ir apenas gerar um alerta devido o arquivo de configurao /etc/fwknop/access.conf possuir a chave padro (KEY: __CHANGEME__) para criptografia simtrica. Abra o diretrio test contido no diretrio criado durante a descompactao do FWKnop e execute o script fwknop_test.pl. O conjunto de testes ir demorar um pouco. # cd /usr/local/src/fwknop-1.9.12/test # ./fwknop_test.pl

Configurando o FWKnop (Criptografia Simtrica) Antes de realizar-mos a instalao da ferramenta cliente na plataforma Linux e Windows, iremos configurar o servidor para aceitar a batida em uma porta diferente da padro, bem como, configurar a chave de criptografia que dever ser utilizada durante a batida. Abra o arquivo fwknop.conf em /etc/fwkop # vi /etc/fwknop/fwknop.conf

Para que durante a inicializao do FWKnop, ele no informe um erro sobre a no existncia do diretrio clientmqueue dentro do diretrio /var/spool, diretrio esse que seria utilizado para armazenar a fila de mensagens do FWKnop, altere o valor ALL na opo ALERTING_METHODS para noemail. Por padro utilizado o mtodo de autenticao passivo, atravs da biblioteca PCAP (opo padro e que escolhemos durante a instalao). A configurao padro informa que todos os pacotes que forem encaminhados com destino a porta 62201/UDP sero analisados. Como forma de aumentar o nvel de segurana, alm de utilizarmos a chave para criptografia simtrica, iremos alterar a porta padro para 64003/UDP. Deste modo altere no arquivo /etc/fwknop/fwknop.conf o valor existente na opo PCAP_FILTER. Outra opo importante, a opo MAX_SPA_PACKET_AGE que por padro tem o valor 120. Esta opo ir permitir que exista a diferena mxima de sincronia de 120 segundos em entre os relgios do servidor e do cliente. Utilizar um servio de NTP permitiria manter o servidor e clientes com horrios sincronizados e evitar problemas. Agora iremos alterar o arquivo access.conf, que o responsvel pelas diretivas de acesso e autenticao. Altere a opo KEY: para o valor xyzk1234 para que possamos realizar o teste autenticao com o nosso servidor. # vi /etc/fwknop/access.conf Instalando a ferramenta cliente do FWKnop (Linux) O processo quase identico ao realizado no servidor, entretanto, iremos realiza-lo utilizando um usurio comum, como boa prtica de segurana. Considerando a existncia de um usurio chamado fulano, e que estamos atualmente logado com ele, realize o procedimento a seguir: $ cd /home/fulano $ mkdir softwares $ cd softwares $ mkdir src $ wget -c http://www.cipherdyne.org/fwknop/download/fwknop-1.9.12.tar.bz2 $ cp fwknop-1.9.12.tar.bz2 src/. $ cd src $ tar -xvjf fwknop-1.9.12.tar.bz2 $ cd fwknop-1.9.12 $ ./install.pl -c Reparem que a execuo do script install.pl utilizou desta vez o parmetro -c. Este parmetro indica que o script instale o FWKnop apenas no modo cliente. Aps a instalao, os binrios foram copiados para o diretrio /home/fulano/bin, sendo assim, crie um alias no shell para facilitar a execuo da ferramenta cliente fwknop: $ vi /home/fulano/.bashrc

Insira na ltima linha o seguinte comando: alias fwknop=/home/$USER/bin/fwknop Realize o logoff do usurio fulano e logue novamente. A partir deste momento voc poder executar a ferramenta cliente informando o alias fwknop. Realizando teste de autenticao Consideraremos as seguintes informaes para realizao do teste: Endereo IP do servidor: 10.10.20.10; Endereo IP do cliente: 10.10.20.2; Porta para batida: 64003/UDP Chave: xyzk1234; Porta referente ao servio SSH: 22. No servidor execute o comando tail para acompanhar as alteraes no arquivo de log /var/log/messages. # tail -f /var/log/messages No cliente, execute o comando a seguir: $ fwknop -A 'tcp/22' -a 10.10.20.2 -D 10.10.20.10 --Server-port 64003 O opo -A permite informar qual servio queremos que o acesso seja garantido, nesse caso, o servio que est em listening na porta 22/TCP. A definio dos servios realizada atravs do arquivo /etc/fwknop/access.conf. Outrossim, a opo -a permite especificar qual endereo IP ter acesso garantido a porta 22/TCP, e a opo -D utilizada para informar-mos o endereo IP do servidor. Por fim, a opo Server-port permite especificar-mos qual a porta que iremos realizar a batida. No servidor interessante verificar as chais e regras atravs do comando: # iptables -L -n O FWKnop ir criar uma chain FWKNOP_INPUT e inserir nela uma regra que garantir acesso ao nosso cliente para porta 22/TCP. O tempo mximo padro que esta regra estar na chain de 30 segundos, sendo possvel altera-lo no arquivo /etc/fwknop/access.conf atravs da opo FW_ACCESS_TIMEOUT. Como forma de reforar ainda mais a segurana, recomendvel alterar a porta que o OpenSSH estar em listenning.

Script de Firewall O que garante que continuemos conectados ao servio SSH, por exemplo, mesmo aps o tempo mximo especificado na opo FW_ACCESS_TIMEOUT ter expirado, atravs do uso do

recurso de State Full Packet do NetFilter/Iptables. Este recurso implementado atravs do mdulo state, sendo assim, a existncia de uma regra na chain INPUT que permita a entrada de pacotes referentes a conexo j estabelecidas, bem como, pacotes relacionados a conexo de fundamental importncia. O script a seguir implementa uma poltica de regras no nosso servidor para impedir conexes em qualquer porta, e apenas permitir pacotes referentes a conexes j estabelecidas e pacotes relacionados a estas conexes. #!/bin/sh $ipt=/usr/sbin/iptables $ipt -F $ipt -P INPUT DROP $ipt -A INPUT -m state state ESTABLISHED,RELATED -j ACCEPT $ipt -A INPUT -i lo -j ACCEPT Inicializando e finalizando o FWKnop Aps a instalao do FWKnop o script de instalao copiou o arquivo fwknop para o diretrio /etc/init.d. Deste modo, o Slackware ir carregar todos os shell scripts existentes nesse diretrio, que tenham permisso de execuo. Para iniciar, parar e reiniciar os daemons do FWKnop, realize respectivamente as seguintes operaes: # /etc/init.d/fwknop start # /etc/init.d/fwknop stop # /etc/init.d/fwknop restart Instalando a ferramenta cliente do FWKnop (Windows) Antes de realizar a instalao da ferramenta ser necessrio instalar antes o framework .NET (caso no esteja). Portanto realize o download atravs do link: http://ff-puchenau.at/Software/Atem/dotnetfx.exe Realize a instalao do framework e a seguir efetue o download da ferramenta Morpheus Windows UI, atravs do site http://www.cipherdyne.org/fwknop/download. A instalao e utilizao dos software bem intuitiva.

Configurando o FWKnop (Criptografia Assimtrica)

A utilizao de criptografia simtrica permite que o nvel de segurana seja normalmente

maior do que ao utilizar-mos a forma tradicional de port knocking. Conforme exposto anteriormente, caso um individuo (atacante) esteja realizando o sniffing na rede, obter a knock sequence seria uma tarefa muito simples. Entretanto, o ponto vulnervel no uso de SPA refere-se ao uso da senha, que caso descoberta permitiria ao atacante ter que se preocupar em descobrir a porta de batida (se diferente da padro), e claro, descriptografar o pacote enviado pelo cliente para descobrir tambm a porta que desejamos abrir no servidor. Para reforar ainda mais o nvel de segurana, iremos realizar a implementao do uso de criptografia assimtrica atravs do GNU PGP. O uso de criptografia assimtrica permite que um par de chaves (pblica e privada) sejam utilizadas na criptografia/descriptografia do pacote SPA. A implementao que iremos realizar a seguir utilizar dois pares de chaves, sendo um par gerado no servidor e o outro no cliente. O servidor ir fornecer sua chave pblica ao cliente, e o cliente ir fornecer sua chave pblica ao servidor. Deste modo, quando o cliente enviar informaes ao servidor durante o processo de port knocking, o cliente ir criptografar os dados com a chave pblica do servidor, e o servidor, realizar o processo de descriptografia utilizando sua chave privada. Gerando as chaves pblica e privada no servidor Atravs do comando abaixo iremos gerar o par de chaves no servidor: # gpg gen-key Escolha a opo (1) e pressione ENTER. Em seguida pressione ENTER novamente para que o tamanho da chave seja de 2048 bits. Outrossim, pressione ENTER novamente para que a opo (0) seja escolhida, e a nossa chave no expire. Em seguida digite y e pressione ENTER para confirmar as opes escolhidas. A seguir ser solicitado o Real name, podemos preenche-lo com o valor server. Os prximos campos: Email address e Comment podemos deixar de preencher. A prxima etapa ser a confirmao das informaes preenchidas, deste modo, digite o e pressione ENTER. Outrossim, seremos questionados sobre a senha que ser utilizada como proteo a nossa chave privada, sendo extremamente recomendvel utiliza-la. Neste artigo, irei considerar que a senha ser skynet1234. Em seguida iremos listar informaes referente a chave gerada. Ser necessrio verificarmos o ID da chave (gerado com base na fingerprint da chave). # gpg list-keys Supondo que o comando anterior tenha gerado o seguinte resultado:
pub uid sub 1024D/XYZK9999 2009-11-27 server 2048g/XXXX7777 2009-11-27

A informao em negrito ( XYZK9999 ) o ID da chave, que ser utilizada para exporta-la em um arquivo com codificao ASCII.

# gpg -a export XYZK9999 > server.pub Copiando a chave pblica para o Cliente # scp server.pub fulano@10.10.20.2:~ Gerando as chaves pblica e privada no cliente $ gpg gen-key Assim como no servidor o processo identico, mas apenas iremos escolher um valor diferente para o Real name, e uma nova senha para a chave privada do cliente. Escolha a opo (1) e pressione ENTER. Em seguida pressione ENTER novamente para que o tamanho da chave seja de 2048 bits. Outrossim, pressione ENTER novamente para que a opo (0) seja escolhida, e a nossa chave no expire. Em seguida digite y e pressione ENTER para confirmar as opes escolhidas. A seguir ser solicitado o Real name, podemos preenche-lo com o valor client. Os prximos campos: Email address e Comment podemos deixar de preencher. A prxima etapa ser a confirmao das informaes preenchidas, deste modo, digite o e pressione ENTER. Em relao a senha que ser utilizada como proteo a nossa chave privada, irei considerar que a senha ser skynet5678. Verificaremos a seguir o ID da chave para exporta no chave pblica para ser utilizada pelo servidor. $ gpg list-keys pub 1024D/TXKM0000 2009-11-27
uid sub client 2048g/YYYY1111 2009-11-27

Utilize agora o ID da chave pblica ( TXKM0000 ) para exportar a chave. # gpg -a export TXKM0000 > client.pub Copiando a chave pblica para o Servidor # scp client.pub root@10.10.20.10:~ Importando e assinando a chave pblica Com os arquivos copiados no servidor e cliente, procederemos agora com a importao e assinatura da chave pblica.

No servidor realize o seguinte procedimento: # gpg import client.pub # gpg edit-key TXKM0000 Salientando que, o ID ( TXKM0000 ) refere-se a chave pblica do cliente. Em seguida ao exibir o prompt do GPG, informe o comando sign e seguida pressione y para confirmar a assinatura da chave. Como criamos nosso par de chaves (no servidor e no cliente) e a chave privada foi protegida por uma senha, neste momento, deveremos informar a senha da chave privada do servidor, no caso skynet1234. Para finalizar o uso do shell do GPG digite quit e informe y para salvar as alteraes realizadas. Da mesma forma que realizamos no servidor, no cliente: $ gpg import server.pub $ gpg edit-key XYZK9999 Realize a assinatura atravs do comando sign, informe a senha da chave privada do cliente (skynet5678), finalize o shell e confirme as alteraes. Com o processo de gerao, importao e assinatura realizado no servidor e cliente, iremos efetuar algumas alteraes no arquivo /etc/fwknop/access.conf para adequa-lo ao uso do PGP. # cp /etc/fknop/access.conf /etc/fwknop/access.conf.old # vi /etc/fknop/access.conf O arquivo dever possuir as seguintes informaes:
SOURCE: ANY; OPEN_PORTS: tcp/22; # ID da chave pblica do Cliente GPG_REMOTE_ID: TXKM0000; # ID da chave privada do Servidor GPG_DECRYPT_ID: XYZK9999; # Senha para uso da chave privada do Servidor GPG_DECRYPT_PW: skynet1234; GPG_HOME_DIR: /root/.gnupg;

importante lembrar que toda e qualquer alterao realizada nos arquivos de configurao do FWKnop implica no reinicio dos seus daemons, sendo este realizado atravs do chamada ao script fwknop com o parmetro restart. # /etc/init.d/fwkop restart Para o acompanhamento durante os testes, por exemplo, utilize a ferramenta tail. # tail -f /var/log/messages

No cliente iremos realizar o envio do SPA utilizando criptografia assimtrica. $ fwknop -A 'tcp/22' -a 10.10.20.2 -D 10.10.20.10 --Server-port 64003 --gpg-recip XYZK9999 --gpg-sign TXKM0000 O comando ter apenas alguns parmetros adicionais referentes ao PGP. Concluses Como todos sabem, segurana algo extremamente importante, e tenho visto a muito tempo que diversos administradores no levam segurana muito a srio, comeando pela praticidade em utilizar senhas de baixa complexidade. Normalmente praticidade leva a determinados pontos de insegurana. Muitos utilizam de receitas simples de configurao que levam a falsa sensao de que, seus servidores esto fazendo uso de mecanismos rgidos de segurana. Conforme exposto durante o artigo, aplicar boas prticas de segurana em relao a configurao de servios, por exemplo o SSH, permite reforar consideravelmente a segurana. Entrentanto, essas prticas combinadas com a utilizao de mecanismos de port knocking e criptografia assimtrica atravs do FWKkop permitem elevar o nvel de segurana, a um patamar mais rgido.

You might also like