quinta-feira, 21 de maio de 2009

Artigo - OpenVPN + Web GUI

Pra quem procura um software livre para implantar uma VPN, fácil de configurar, com ótimo desempenho, e compatível com a criptografia TLS/SSL(ou seja, muito seguro), minha dica de hoje é o OpenVPN. Neste artigo vamos aprender a configurar esse poderoso software pra quem quer interligar redes de filiais com gateway VPN(servidor linux) e pra quem quer tambem estações autônomas espalhadas pelo mundo com um link de internet.E vamos instalar um software que permitirá o administrador da rede acompanhar as conexões da VPN em uma interface web amigável, o OpenVPN Web GUI.

Distribuição Usada:

Ubuntu Server 8.04 (mas deve funcionar em qualquer uma)

Pacotes necessários:

OpenVPN-2.09
lzo-2.03
openssl
libssl-dev
apache2


Considerações:

Matriz
Internet 201.58.xxx.xx
Rede - 192.168.0.0/24
Gateway VPN - eth1 - 192.168.0.254
Túnel - 10.0.0.1

Filial
Internet - (ip qualquer)
Rede - 192.168.1.0/24
Gateway VPN - eth1 - 192.168.1.254
Túnel - 10.0.0.2

Estação autônoma(um notebook em viagem por exemplo)
Rede - (faixa qualquer)
Gateway VPN - N/A (OpenVPN Cliente Windows)
Túnel - 10.0.0.3

Etapas comuns dos gateways vpn(servidores matriz e filiais)

Instale os pacotes

# apt-get update
# apt-get install openssl libssl-dev apache2

Antes do OpenVPN instalar o LZO

# cd /usr/src
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
# tar xzvf lzo-2.03.tar.gz
# cd lzo-2.03
# ./configure
# make
# make install

Agora o OpenVPN

# cd /usr/src
# wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
# tar zxvf openvpn-2.0.9.tar.gz
# cd openvpn-2.0.9
# ./configure
# make && make install

No Servidor

Vamos criar a pasta de configuração do OpenVPN

# mkdir /etc/openvpn

O OpenVPN vem com um conjunto de scripts que facilitam a criação dos certificados para aumentar a segurança da nossa VPN, vamos copiar esses scripts para a pasta de configuração do OpenVPN.

# cp -R /usr/src/openvpn-2.0.9/easy-rsa /etc/openvp

Vamos criar o arquivo principal de configuração de nosso servidor

# vim /etc/openvpn/matriz.conf

# Define o ip do servidor dentro do túnel seguro
ifconfig 10.0.0.1 255.255.255.0
# Arquivo onde ficará gravado os ips dos clientes
# para fazermos um dhcp com ip fixo, uma espécie de pool dhcp.
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Porta onde o servidor irá escutar
port 1194
# Protocolo usado
# dê preferencia ao UDP por ser muito mais rápido
proto udp
# Interface virtual a ser criada(túnel)
dev tap0
# Define que o servidor será autenticador de certificados.
tls-server
# Pasta onde os certificados e chaves estão com respectivos nomes
cd /etc/openvpn/easy-rsa/keys
ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem
# Arquivo que irá impedir conexões através de certificados revogados
crl-verify /etc/openvpn/easy-rsa/keys/crl.pem
# Proteção adicional com uma chave estática( além dos certificados)
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
user openvpn
group openvpn
mode server
max-clients 30
server 10.0.0.0 255.255.255.0
# Configurações do servidor dhcp
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option WINS 192.168.0.1"
push "default-gateway 192.168.0.254"
# Essa linha faz com que o gateway principal da estação windows(autônoma)
# conectada diretamente a vpn seja o ip do gateway da matriz
# possibilitando assim bloquear sites pelo squid da matriz por exemplo.
push "redirect-gateway def1"
# Mantem o túnel ativo mesmo em caso de inatividade
ping 10
ping-restart 120
push "ping 10"
push "ping-restart 40"
# Compactação usada
comp-lzo
status-version 2
# Configuração de Log
status /etc/openvpn/statusgwmatriz.log
verb 4
log /etc/openvpn/gwmatriz.log
log-append /etc/openvpn/appendgwmatriz.log
# Scripts que serão executados com a
# VPN subir(.up) e quando for derrubada(.down)
up /etc/openvpn/gwmatriz.up
down /etc/openvpn/gwmatriz.down
###### FIM DO ARQUIVO ##############

Crie o arquivo /etc/openvpn/gwmatriz.up com seguinte conteúdo:

#!/bin/sh
ip route add 192.168.1.0/24 via 10.0.0.2
exit 0
###### FIM DO ARQUIVO ##############

e o /etc/openvpn/gwmatriz.down com o seguinte conteúdo:

#!/bin/sh
ip route del 192.168.1.0/24 via 10.0.0.2
exit 0
###### FIM DO ARQUIVO ##############

Note que você devera adicionar uma linha dentro dos arquivos gwmatriz.up e gwmatriz.down para cada gateway vpn em filiais obedecendo a faixa em que a filial for usar e em qual IP o OpenVPN irá atribuir a ela dentro do túnel seguro, pois eles adicionaram as rotas no kernel para que os pacotes com destino a essas redes das filiais encontrem o caminho, no servidor da filial digite "ifconfig tap0" depois que a conexão estiver estabelecida para saber qual o ip que foi utilizado.

Coloque as duas linhas a seguir no arquivo "/etc/rc.local" ou qualquer outro script de inicialização:

/sbin/sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE

A primeira linha habilita o roteamento de pacotes e a segunda permite que todos os pacotes provenientes da rede 192.168.1.0/24(filial) alcancem a rede da matriz, adicione uma para cada rede de filial. eth1 é a interface ligada a rede interna.

Vamos gerar uma chave estática de autenticação que é uma proteção adicional a nossa VPN

# cd /etc/openvpn
# openvpn --genkey --secret ta.key
# mv ta.key easy-rsa/keys/

Agora vamos gerar os certificados. Edite o arquivo /etc/openvpn/easy-rsa/vars para definirmos as variáveis.

# vim /etc/openvpn/easy-rsa/vars

* KEY_COUNTRY: coloque BR para Brasil;
* KEY_PROVINCE: coloque a sigla do seu estado (MG, por exemplo);
* KEY_CITY: coloque o nome ou sigla da sua cidade;
* KEY_ORG: coloque o nome da sua empresa;
* KEY_EMAIL: coloque o email do administrador do servidor.

Agora vamos carregar as variáveis definidas para gerarmos os certificados

# cd /etc/openvpn/easy-rsa/
# source vars

O próximo comando é limpar a pasta de chaves, cuidado pois apaga todos os certificados gerados, inclusive do servidor.

# ./clean-all

Vamos gerar a autoridade certificadora

# ./build-ca

Nunca apague esses arquivos gerados senão terá que gerar todos os certificados novamente, pois são assinados digitalmente por essas chaves

Para gerar o certificado do servidor digite

# ./build-key-server servidor

Onde "servidor" é o nome do seu servidor de vpn( preencha o campo "Common Name" o nome do seu servidor. Para uma autenticação automática com os certificados não digite senha ao criar o certificado e responde "y" nas perguntas finais.

Agora vamos gerar os parametros DH para criptografia com o comando:

# ./build-dh

Os arquivos para uso do TLS no servidor estão prontos, agora vamos gerar certificados para os clientes.
Toda vez que for criar um novo certificado para os clientes digite:

# cd /etc/openvpn/easy-rsa/
# source vars
# ./buld-key filial

Onde "filial" é o nome do certificado de cliente. Preencha os dados corretamente e responda sim as duas últimas perguntas. É melhor que o certificado não tenha senha para que nossa VPN fique menos dependente de interação humana desnecessária.

Para revogar o certificado use

# cd /etc/openvpn/easy-rsa/
# source vars
# ./revoke-full filial

Onde "filial" é o nome do certificado a revogar

Antes de subir a VPN crie um certificado de cliente qualquer e revogue em seguida para que o script gere um arquivo crl.pem(que define os certificados revogados) válido para nossa vpn começar a funcionar.

Vamos criar um usuário para o OpenVPN

# adduser --system --disabled-password --disabled-login --group openvpn

e dar permissão para ele de acessar a pasta onde estão os certificados

# chown -R /etc/openvpn/easy-rsa/keys/

Agora vamos fazer "subir" nossa VPN no servidor

# openvpn --config /etc/openvpn/matriz.conf &

Para acompanhar o log e verificar possíveis erros digite

# tail -f /etc/openvpn/gwmatriz.log

Vamos verificar se a interface virtual do túnel está de pé

# ifconfig tap0

Servidores Filiais( gateways VPN)

Após concluir os passos da seção "Etapas comuns", vamos criar a pasta de configuração do OpenVPN

# mkdir /etc/openvpn

Vamos criar o arquivo de configuração de nossa filial

# vim /etc/openvpn/filial.conf

com o seguinte conteúdo:

# ip do servidor(ip real, pode se usar nome ex. vpnserver.no-ip.org)
remote 201.58.xxx.xx
proto udp
# especifica que o servidor irá verificar o certificado
ns-cert-type server
port 1194
# tenta infinitamente autenticar mesmo depois de nao conseguir
auth-retry nointeract
client
dev tap
comp-lzo
# mantem o túnel de pé por "echo request"
keepalive 10 120
# utilização da chave estática
tls-client
tls-auth ta.key 1
# certificado raiz e certificado da filial gerado no servidor
ca ca.crt
cert filial.crt
key filial.key
up /etc/openvpn/filial.up
down /etc/openvpn/filial.down
log /etc/openvpn/filial.log
###### FIM DO ARQUIVO ##############

Crie o arquivo /etc/openvpn/filial.up com seguinte conteúdo:

#!/bin/sh
ip route add 192.168.0.0/24 via 10.0.0.1
exit 0
###### FIM DO ARQUIVO ##############

e o /etc/openvpn/filial.down com o seguinte conteúdo:

#!/bin/sh
ip route del 192.168.0.0/24 via 10.0.0.1
exit 0
###### FIM DO ARQUIVO ##############

Coloque as duas linhas a seguir no arquivo "/etc/rc.local" ou qualquer outro script de inicialização:

/sbin/sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE

A primeira linha habilita o roteamento de pacotes e a segunda permite que todos os pacotes provenientes da rede 192.168.0.0/24(matriz) alcancem a rede da filial. eth1 é a interface ligada a rede interna.

Para se conectar a VPN precisamos copiar 4(quatro) arquivos que geramos para autenticação, para isso procure utilizar um método seguro, no exemplo utilizaremos o "scp".

scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/filial.key /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/filial.crt /etc/openvpn/
scp root@201.58.xxx.xx:/etc/openvpn/easy-rsa/keys/ta.key /etc/openvpn/

Agora vamos subir o lado da filial da VPN

# openvpn --config /etc/openvpn/filial.conf &

Para acompanhar o log e verificar possíveis erros digite

# tail -f /etc/openvpn/filial.log

Vamos verificar tentar pingar por dentro do túnel os ips da matriz.

# ping 10.0.0.1
# ping 192.168.0.254

Para você conseguir pingar os ips das estações na matriz elas devem ter como gateway o ip do gateway vpn(192.168.0.254) assim também acontece na filial, o gateway das estações na filial deve ser 192.168.1.254.



Estações Windows autônomas

Baixe e instale http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe

Dentro da pasta C:\Arquivos de programas\OpenVPN\config\ crie um arquivo qualquer com extenção .ovpn(Ex. cliwindows.ovpn) com o seguinte conteúdo:

remote 201.58.xxx.xx # ip do nosso servidor(pode se usar nome ex. vpnserver.no-ip.org)
proto udp
ns-cert-type server
port 1194
auth-retry nointeract
client
# a linha abaixo faz com que se aplique as
# configurações "push" no conf do servidor.
pull
dev tap
comp-lzo
keepalive 10 120
tls-client
tls-auth ta.key 1
# A linha abaixo adiciona a rota para a rede da matriz
route 192.168.0.0 255.255.255.0 10.0.0.1
ca ca.crt
cert cliwindows.crt
key cliwindows.key
###### FIM DO ARQUIVO ##############

No servidor da VPN gere e copie os certificados para o cliente windows, no exemplo utilizaremos o certificado "cliwindows" que geramos apartir do script ./build-key em nosso servidor. Coloque-o na mesma pasta (C:\Arquivos de programas\OpenVPN\config)
Agora basta dar dois cliques sobre o ícone do OpenVPN GUI na barra de tarefas para a conexão ser iniciada.

Instalação do OpenVPN Web GUI

Voltando ao servidor da matriz vamos instalar um pacote necessário

# apt-get install smarty

Crie a pasta para o OpenVPN Web GUI

# mkdir /var/www/owg
# cd /var/www/owg

Vamos baixar o pacote e descompactar

# wget http://hivelocity.dl.sourceforge.net/sourceforge/openvpn-web-gui/openvpn-web-gui-0.3.2b.tgz
# tar zxvf openvpn-web-gui-0.3.2b.tgz

De as permissões necessárias para o funcionamento

# chown -R www-data /var/www/owg
# chmod 755 /etc/openvpn/statusgwmatriz.log
# chmod -R 755 /etc/openvpn/easy-rsa/keys/

Para funcione no ubuntu é necessário que se modifique os scripts php nos seguintes arquivos:

/var/www/owg/action-buildcertificate.inc
/var/www/owg/action-downloadconfigfile.inc
/var/www/owg/action-certificates.inc
/var/www/owg/action-newcertificate.inc
/var/www/owg/action-config.inc
/var/www/owg/action-status.inc
/var/www/owg/action-downloadcertificate.inc
/var/www/owg/action-viewcertificate.inc
/var/www/owg/plugins/systemcheck/action.inc

Encontre dentro de cada um dos arquivos a expressão "Smarty.class.php" e mude pra "/usr/share/php/smarty/Smarty.class.php" de acordo com sua distribuição

Vamos substituir o arquivo config.inc por outro acertando os caminhos de acordo com sua distro.

# mv /var/www/owg/config.inc /var/www/owg/config.inc.original

# vim /var/www/owg/config.inc

Cole o conteúdo acertando os caminhos e arquivos em vermelho:

/var/www/owg/plugins/';

// If there are no plugins
// $config['Plugins'] = NULL;
// Otherwise, follow this example:
//$config['Plugins']['PLUGINMANE']['Folder'] = 'FOLDERNAME';

// The post-install helper plugin. Shows if PHP5 has the neccessary functions available
$config['Plugins']['systemcheck']['Folder'] = 'systemcheck';

// OPENVPN ________________________________

// Change: the configuration directory
$config['openvpn']['folder'] = '/etc/openvpn/';
// Change: configuration and status file names
$config['openvpn']['config'] = $config['openvpn']['folder'] .'matriz.conf';
$config['openvpn']['status'] = $config['openvpn']['folder'] .'statusgwmatriz.log';

// OPENSSL ________________________________

// Change: openssl keys directory
$config['openssl']['folder'] = '/etc/openvpn/easy-rsa/keys/';
// Change: different folders for Public Certificates, Certificate Requests and Private Keys.
// NOTE: openssl somehow respects only newpem folder (for Public Certificates).
$config['openssl']['pubfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
$config['openssl']['reqfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
$config['openssl']['prvfolder'] = '/usr/local/etc/openvpn/keys/newpem/';
// Change: openssl CA private and public keys
$config['openssl']['CA']['priv'] = 'file://'. $config['openssl']['folder'] .'ca.key';
$config['openssl']['CA']['pub'] = 'file://'. $config['openssl']['folder'] .'ca.crt';
// Change: openssl serial file
$config['openssl']['serial'] = $config['openssl']['folder'] .'serial';
// Change: openssl database
$config['openssl']['database'] = $config['openssl']['folder'] .'index.txt';
// Change: openssl configuration
$config['openssl']['config'] = array ('config' => $config['openvpn']['folder'] .'openssl.cnf',
'encrypt_key' => 0);
// NEW OPENSSL CERTIFICATE DEFAULTS _________

// Change all of them as it is done in your easy-rsa/vars
$config['openssl']['default']['expiration'] = 3560;
$config['openssl']['default']['countryName'] = 'CA';
$config['openssl']['default']['stateOrProvinceName'] = 'Ontario';
$config['openssl']['default']['localityName'] = 'Mississauga';
$config['openssl']['default']['organizationName'] = 'Home';
$config['openssl']['default']['organizationalUnitName'] = 'Enter Department Name';
$config['openssl']['default']['commonName'] = 'Enter First and Last names';
$config['openssl']['default']['emailAddress'] = 'Enter user@home.on.ca';

?>



Depois de feito acesse em seu navegador o endereço

http://192.168.0.254/owg


Pronto. Espero ter ajudado.

Nenhum comentário:

Postar um comentário