Ver Feed RSS

Olhos que ardem...

Implementando Um Serviço VPN Com OpenVPN No Gentoo Linux amd64

Avalie este Post de Blog
Introdução

Escrevi este tutorial no intuito de ajudar os membros do Under-linux.org a criarem sua própria VPN, utilizando o aplicativo opensource chamado OpenVPN (desenvolvido por James Yonan).

Uma VPN ou Rede Virtual Privada é uma rede segura que trafega através de uma rede insegura (a rede pública) , ela é criptografada (com autenticação ou não, dependendo dos mecanismos usados) com ela é possível compartilhar os recursos computacionais de uma empresa e suas filias de forma fácil e sem dores de cabeça.

Com uma VPN você pode acessar seu computador pessoal estando em seu trabalho e vice-versa. Ou interligar as redes da sua empresa e filias não importando a distâncias, é possível imprimir documentos no seu trabalho a partir de casa, ou de qualquer lugar usando um computador móvel. A partir deste recurso os pesquisadores e funcionários (onde eu trabalho) acessam os servidores com apenas 1 clique, como se estivessem dentro do próprio laboratório acessando seus arquivos. Não é feitiçaria é tecnologia. \o/

A configuração apresentada aqui é básica, então antes de colocar sua rede em produção, leia a documentação do OpenVPN e estude sobre projeto de redes e segurança da informação. A configuração aqui utilizada pode ser usada em outras distribuições Linux, contudo este tutorial trata de algumas peculiaridades da distribuição Gentoo Linux.


O que é uma VPN?


A Virtual Private Network (VPN) ou Rede Privada Virtual são redes que possibilitam um acesso privado de comunicação, através da rede publica já existente
como a internet tem como principal função a segurança onde dados privados são trafegados pela rede assegurando a comunicação entre dois pontos por meio de “túnel” onde os dados ficam inacessíveis à escutas clandestinas e interferência para que não sejam interceptados. (Quaresma,2006) [2].

A VPN é uma das formas de se unir diferentes redes de uma empresa, utilizando para isso um meio público para o tráfego dos dados entre elas, que geralmente é a Internet. Sua principal característica é criar “túneis virtuais” de comunicação entre essas redes, de forma que os dados trafeguem criptografados por estes túneis, aumentando a segurança na transmissão e recepção dos dados (Cyclades,2000) [3].

Logo podemos ter acesso seguro aos recursos computacionais de uma empresa, utilizando a rede pública, sem nenhum ônus. Através de um computador pessoal (móvel ou não) podemos ter acesso a um servidor com apenas um clique ;-). É como se seu computador estivesse na mesma rede da empresa, apesar da distância.


Avaliação do OpenVPN

(Gendorf, 2006) [1] aponta 5 critérios:

Critério 1
Por ser uma ferramenta de código aberta e desenvolvida com uma linguagem bastante popular, esta ferramenta é de fácil portabilidade em qualquer sistema operacional. Além disso, o autor da ferramenta disponibiliza compilações em Linux e Windows, sendo que em Windows a ferramenta tem total integração com o ambiente, facilitando assim sua utilização pelos usuários. Pouca ou nenhuma referências de falhas de segurança.
Critério 2
Na versão 2.x não foi encontrada nenhuma referência de vulnerabilidade na ferramenta, a não ser no uso de uma ferramenta auxiliar para gerenciar conexões, que sua vulnerabilidade é aceitar conexões sem uso de autenticação, que pode ser contornada restringindo acesso a porta de comunicação por um determinado IP.
Critério 3
Esta solução é bastante simples de se utilizar existindo inclusive a possibilidade de customizar um pacote de instalação de acordo com as necessidades da empresa. Com o auxílio de um sistema para deployment dos certificados digitais e do arquivo de configuração para o usuário só precisa dar um duplo click e digitar seu usuário e sua senha.
Critério 4
Esta ferramenta possibilita todos os recursos do SSL (Secure Socket Layer), podendo oferecer criptografia dos dados com elevados níveis. Possibilita uso de certificados digitais para autenticação, uso de
senha e uma versão, que na época deste trabalho estava em testes, possibilitava em ambiente Windows o uso de SmartCard para autorização dos clientes.
Critério 5
Ferramenta completamente independente do sistema operacional em que esta instalada, não havendo necessidade de nenhum procedimento quando há atualização do kernel no Linux.
Equipamento teste

Para a implementação do servidor utilizei o Gentoo Linux amd64 Hardened :
Código :
[FONT=Courier New]# uname -a
Linux kraken 2.6.34-hardened #1 SMP Wed Jul 21 14:16:31 BRT 2010 x86_64 Intel(R) Xeon(R) CPU X3330 @ 2.66GHz GenuineIntel GNU/Linux[/FONT]
Para a implementação do cliente utilizei o Gentoo Linux amd64 Desktop (Gnome):
Código :
[FONT=Courier New]# uname -a
Linux fenrir 2.6.33-gentoo-r2 #1 SMP Wed May 5 14:18:55 BRT 2010 x86_64 Intel(R) Xeon(TM) CPU 3.00GHz GenuineIntel GNU/Linux[/FONT]


Preparando o "terreno"


Preparando o Kernel

Tenha certeza de que o suporte para o driver TUN/TAP esteja ativo:

Compilando manualmente:
Código :
[FONT=Courier New]cd /usr/src/linux
make menuconfig
[/FONT]

Usando o Genkernel:
Código :
[FONT=Courier New] genkernel --menuconfig --dmraid all[/FONT]
Ou
Para quem usa RAID:
Código :
[FONT=Courier New] genkernel --menuconfig --dmraid all[/FONT]
Ative o suporte ao driver TUN/TAP:
Código :
[FONT=Courier New]Device Drivers --->
Network device support --->[*]Network device support
<M> Universal TUN/TAP device driver support[/FONT]
Depois de compilar o kernel e reiniciar a máquina, levante o módulo:
Código :
[FONT=Courier New]# modprobe tun
# lsmod | grep tun
tun 13399 0[/FONT]
Para levantar o módulo durante o boot:
* BaseLayout1 (versão 1):
Código :
[FONT=Courier New]# nano /etc/modules.autoload.d/kernel-2.6
tun[/FONT]
* BaseLayout2 (versão 2):
Código :
[FONT=Courier New]# nano /etc/conf.d/modules
modules_2_6="${modules_2_6} tun"
module_tun_args_2_6=""[/FONT]
Instalando o OpenVPN

Altere o arquivo /etc/portage/package.keywords para que o emerge baixe e instale a versão mais recente (testing) do OpenVPN. Caso você esteja usando SELinux baixe o sec-policy/selinux-openvpn também:

Alterando /etc/portage/package.keywords
Código :
[FONT=Courier New]# nano /etc/portage/package.keywords
net-misc/openvpn ~amd64
sec-policy/selinux-openvpn ~amd64[/FONT]
Obtendo informações sobre o pacote:
Código :
[FONT=Courier New]# emerge -s openvpn
 
net-misc/openvpn[/FONT] [FONT=Courier New]
Latest version available: 2.1.0-r1
Latest version installed: 2.1.0-r1
Size of files: 882 kB
Homepage: http://openvpn.net/
Description: OpenVPN is a robust and highly flexible tunneling application compatible with many OSes.
License: GPL-2
 
sec-policy/selinux-openvpn[/FONT] [FONT=Courier New]
Latest version available: 2.20091215
Latest version installed: 2.20091215
Size of files: 491 kB
Homepage: http://www.gentoo.org/proj/en/hardened/selinux/
Description: SELinux policy for OpenVPN
License: GPL-2[/FONT]

Instalando os pacotes

Código :
[FONT=Courier New] # emerge openvpn[/FONT]
Com SELinux
Código :
[FONT=Courier New] # emerge openvpn selinux-openvpn[/FONT]

Criando as chaves e certificados


Você pode criar sua chaves manualmente, contudo a documentação do apcote OpenVPN já traz um conjunto de scripts para a criação de chaves. Estes scripts podem ser alterados para incluir novas funcionalidades. A bliblioteca do OpenSSL é usada para a criacão das chaves e certificados. Lembre-se de manter as chaves em um local seguro e ao enviar as chaves utilize-se de um canal seguro (como o ssh/scp). Lembre-se a confidencialidade das chaves é importantíssima (por favor, não enviem as chaves de seus clientes por e-mail ). Basta apenas um cliente ser comprometido para trazer grandes prejuízo a toda rede.

Nunca crie/guarde as chaves no mesma máquina onde irá rodar o servidor. Se o fizer na mesma máquina lembre-se de remover as chaves que assinam os certificados dos clientes e as guarde em um local seguro.


Modificando os scripts de criação de chaves

Os scripts encontram se na pasta /usr/share/openvpn/easy-rsa/. Esta pasta contém os scripts de criação da CA (Autoridade Certificadora), certificados dos clientes e servidor e protocolo Diffie-Hellman.

Nós temos que modificar os parâmetros básicos para os certificados. Edite o arquivos vars e acerte o KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, e KEY_EMAIL de acordo com suas necessidades. Não deixe estes parâmetros em branco.O parâmetro KEY_SIZE=2048 ditará o tamanho das chaves RSAs. Por padrão 1024 é o mais usado, mas você pode alterar para 2048 incrementando as segurança, contudo a performance do túnel decrescerá um pouco.
Código :
[FONT=Courier New] # nano vars[/FONT]
Depois carregue as variáveis no ambiente:
Código :
[FONT=Courier New]# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /opt/easy-rsa/keys[/FONT]
O scritp clean-all deve ser executado caso você queria apagar todas as chaves já criadas e recriá-las novamente.
Código :
[FONT=Courier New]# ./clean-all[/FONT]
Edite agora o arquivo openssl.cnf, neste arquivo ficam os parâmetros de criação dos certificados. Tenha atenção às diretivas default_days e default_md. A primeira diz por quanto tempo seu certificado terá validade (em dias) e a segunda qual Message Digest será usado, eu recomendo o sha1, contudo o md5 é o padrão (o md5 é usado para a criptografia das senhas (shadow) do linux.
Código :
[FONT=Courier New]# nano openssl.cnf
...
default_days = 3650
default_md = sha1
...[/FONT]
O script build-ca cria seu certificado de autoridade:
Código :
[FONT=Courier New]easy-rsa # ./build-ca
Generating a 2048 bit RSA private key
........+++
...............+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:BR
State or Province Name (full name) [BA]:BA
Locality Name (eg, city) [ILHEUS]:ILHEUS
Organization Name (eg, company) [AMEBA]:AMEBA
Organizational Unit Name (eg, section) []:AMEBA
Common Name (eg, your name or your server's hostname) [AMEBA CA]:AMEBA-MAIN-CA
Name []:
Email Address [eduardo@underlinux.com.br]:eduardo@underlinux.com.br[/FONT]

A diretiva Common Name deve ser única! Tanto para CA e certificados de servidores e clientes!


Gerando certicados e a chave do servidor

Agora, criaremos os certificados e a chave privada dos servidor.
Código :
[FONT=Courier New]./build-key-server server
 
 
easy-rsa # ./build-key-server ameba-server[/FONT]  [FONT=Courier New]
Generating a 2048 bit RSA private key
.....................................+++
..+++
writing new private key to 'ameba-server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:BR
State or Province Name (full name) [BA]:BA
Locality Name (eg, city) [ILHEUS]:ILHEUS
Organization Name (eg, company) [AMEBA]:AMEBA
Organizational Unit Name (eg, section) []:AMEBA
Common Name (eg, your name or your server's hostname) [ameba-server]:AMEBA-SERVER
Name []:
Email Address [eduardo@underlinux.com.br]:
 
Please enter the following 'extra' attributes[/FONT] [FONT=Courier New]
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/vpn/novo/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'BA'
localityName :PRINTABLE:'ILHEUS'
organizationName :PRINTABLE:'AMEBA
organizationalUnitName:PRINTABLE:'AMEBA'
commonName :PRINTABLE:'AMEBA-SERVER'
emailAddress :IA5STRING:'eduardo@underlinux.com.br'
Certificate is to be certified until Jul 19 16:58:45 2020 GMT (3650 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y[/FONT]  [FONT=Courier New]
Write out database with 1 new entries
Data Base Updated[/FONT]
Como visto logo acima, ao ser criada a chaves, alguns parâmetros são pedidos e é preciso que o autor ratifique a criação da chaves (yes).
Gerar os certificados dos clientes é bastante similar ao passo anterior:
Código :
[FONT=Courier New]./build-key client
 
Caso você queira proteção com senha para seus clientes, (o que não faz parte do escopo deste tutorial) use o scritpt build-key-pass.[/FONT] [FONT=Courier New]
easy-rsa # ./build-key ameba-cliente1
Generating a 2048 bit RSA private key
...........................................................+++
.................+++
writing new private key to 'ameba-cliente1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [BA]:
Locality Name (eg, city) [ILHEUS]:
Organization Name (eg, company) [AMEBA]:
Organizational Unit Name (eg, section) []:SD1
Common Name (eg, your name or your server's hostname) [ameba-cliente1]:AMEBA-CLIENTE1
Name []:
Email Address [eduardo@labbi.uesc.br]:
 
Please enter the following 'extra' attributes[/FONT] [FONT=Courier New]
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/vpn/novo/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'BR'
stateOrProvinceName :PRINTABLE:'BA'
localityName :PRINTABLE:'ILHEUS'
organizationName :PRINTABLE:'AMEBA'
organizationalUnitName:PRINTABLE:'SD1'
commonName :PRINTABLE:'AMEBA-CLIENTE1'
emailAddress :IA5STRING:'eduardo@underlinux.com.br'
Certificate is to be certified until Jul 19 17:08:15 2020 GMT (3650 days)
Sign the certificate? [y/n]:y
 
1 out of 1 certificate requests certified, commit? [y/n]y[/FONT] [FONT=Courier New]
Write out database with 1 new entries
Data Base Updated[/FONT]
Gerando parâmetros Diffie-Hellman

O protocolo Diffie Hellman é usado pelo servidor OpenVPN. Dependendo do tamanho da chave (e da potência de sua máquina) gerar os parâmetros pode levar alguns minutos.
Código :
[FONT=Courier New]easy-rsa # ./build-dh
 
Generating DH parameters, 2048 bit long safe prime, generator 2[/FONT] [FONT=Courier New]
This is going to take a long time
.....+........................................................................................................
.....................................................................................................................
........................................................................................................+...............................................+.......................+.........................
...............................................+...............................+.........................................................................................................................................+.........
[/FONT]
Configuração

Agora vamos a configuração dos arquivos do servidor e clientes.

Criando os diretórios necessários

Eu prefiro dividir os arquivos de logs e chaves em diretórios diferentes, assim fica mais fácil a organizacão inclusive para várias instâncias OpenVPN rodando na mesma máquina,isto é, vários serviços de VPN cada um rodando numa faixa de rede diferente. O diretório padrão é /etc/openvpn:
Código :
[FONT=Courier New]# mkdir /etc/openvpn/conf
# mkdir /etc/openvpn/keys
# mkdir /etc/openvpn/logs
# mkdir /etc/openvpn/ipps[/FONT]
No meu caso, para cada serviço OpenVPN rodando criarei uma pasta respectiva.
Código :
[FONT=Courier New]# mkdir /etc/openvpn/keys/ameba
# mkdir /etc/openvpn/logs/ameba
# mkdir /etc/openvpn/ipps/ameba[/FONT]

Permissões


Durante a instalacão do OpenVPN, o Portage cria um usuário e um grupo chamados openvpn, para que o serviço levante sem necessidade de ter privilégios de administrador (root).
Código :
[FONT=Courier New]# cat /etc/passwd
openvpn:x:101:409:added by portage for openvpn:/dev/null:/sbin/nologin
 
# cat /etc/group[/FONT] [FONT=Courier New]
openvpn:x:409:[/FONT]
Alterando dono e permissões:
Código :
[FONT=Courier New]# cd /etc
# chown -R openvpn openvpn/
# cd /etc/openvpn
# chmod 700 conf
# chmod 700 keys[/FONT]

Servidor


Copie as chaves necessárias ao servidor na pasta keys. Para esta configuração a pasta keys fica em:
Código :
[FONT=Courier New]# ls -lash /etc/openvpn/keys/ameba
total 28K
4.0K drwxr-xr-x. 2 openvpn root 4.0K Jul 22 15:13 .
4.0K drwx------. 3 openvpn root 4.0K Jul 21 14:40 ..
4.0K -rw-r--r--. 1 openvpn root 1.7K Jul 22 15:12 ca.crt
4.0K -rw-r--r--. 1 openvpn root 424 Jul 22 15:13 dh2048.pem
8.0K -rw-r--r--. 1 openvpn root 5.3K Jul 22 15:13 ameba-server.crt
4.0K -rw-------. 1 openvpn root 1.7K Jul 22 15:13 ameba-server.key[/FONT]

Configurando o servidor


Agora iremos criar/editar ameba-server.conf, o qual ficará localizado em /etc/openvpn/conf:
Logo abaixo você verá o arquivo completo de configuração, poucas diretivas serão alteradas para que tenhamos um funcionamento básico.
Código :
[FONT=Courier New]# nano /etc/openvpn/conf/ameba-server.conf
 
# Which local IP address should OpenVPN[/FONT] [FONT=Courier New]
# listen on? (optional)
local 172.17.2.100
 
# Which TCP/UDP port should OpenVPN listen on?[/FONT] [FONT=Courier New]
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one. You will need to
# open up this port on your firewall.
port 1194
 
# TCP or UDP server?[/FONT] [FONT=Courier New]
;proto tcp
proto tcp
 
# "dev tun" will create a routed IP tunnel,[/FONT] [FONT=Courier New]
# "dev tap" will create an ethernet tunnel.
# Use "dev tap0" if you are ethernet bridging
# and have precreated a tap0 virtual interface
# and bridged it with your ethernet interface.
# If you want to control access policies
# over the VPN, you must create firewall
# rules for the the TUN/TAP interface.
# On non-Windows systems, you can give
# an explicit unit number, such as tun0.
# On Windows, use "dev-node" for this.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun
 
# Windows needs the TAP-Win32 adapter name[/FONT] [FONT=Courier New]
# from the Network Connections panel if you
# have more than one. On XP SP2 or higher,
# you may need to selectively disable the
# Windows firewall for the TAP adapter.
# Non-Windows systems usually don't need this.
;dev-node MyTap
 
# SSL/TLS root certificate (ca), certificate[/FONT] [FONT=Courier New]
# (cert), and private key (key). Each client
# and the server must have their own cert and
# key file. The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys. Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
 
ca /etc/openvpn/keys/ameba/ca.crt[/FONT] [FONT=Courier New]
cert /etc/openvpn/keys/ameba/ameba-server.crt
key /etc/openvpn/keys/ameba/ameba-server.key # This file should be kept secret
 
# Diffie hellman parameters.[/FONT] [FONT=Courier New]
# Generate your own with:
# openssl dhparam -out dh1024.pem 1024
# Substitute 2048 for 1024 if you are using
# 2048 bit keys.
dh /etc/openvpn/keys/ameba/dh2048.pem
 
# Configure server mode and supply a VPN subnet[/FONT] [FONT=Courier New]
# for OpenVPN to draw client addresses from.
# The server will take 10.8.0.1 for itself,
# the rest will be made available to clients.
# Each client will be able to reach the server
# on 10.8.0.1. Comment this line out if you are
# ethernet bridging. See the man page for more info.
server 10.8.0.0 255.255.255.0
 
# Maintain a record of client <-> virtual IP address[/FONT] [FONT=Courier New]
# associations in this file. If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist /etc/openvpn/ipp/ameba/ipp-ameba.txt
 
# Configure server mode for ethernet bridging.[/FONT] [FONT=Courier New]
# You must first use your OS's bridging capability
# to bridge the TAP interface with the ethernet
# NIC interface. Then you must manually set the
# IP/netmask on the bridge interface, here we
# assume 10.8.0.4/255.255.255.0. Finally we
# must set aside an IP range in this subnet
# (start=10.8.0.50 end=10.8.0.100) to allocate
# to connecting clients. Leave this line commented
# out unless you are ethernet bridging.
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
 
# Push routes to the client to allow it[/FONT] [FONT=Courier New]
# to reach other private subnets behind
# the server. Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
 
# To assign specific IP addresses to specific[/FONT] [FONT=Courier New]
# clients or if a connecting client has a private
# subnet behind it that should also have VPN access,
# use the subdirectory "ccd" for client-specific
# configuration files (see man page for more info).
 
# EXAMPLE: Suppose the client[/FONT] [FONT=Courier New]
# having the certificate common name "Thelonious"
# also has a small subnet behind his connecting
# machine, such as 192.168.40.128/255.255.255.248.
# First, uncomment out these lines:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# Then create a file ccd/Thelonious with this line:
# iroute 192.168.40.128 255.255.255.248
# This will allow Thelonious' private subnet to
# access the VPN. This example will only work
# if you are routing, not bridging, i.e. you are
# using "dev tun" and "server" directives.
 
# EXAMPLE: Suppose you want to give[/FONT] [FONT=Courier New]
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# Then add this line to ccd/Thelonious:
# ifconfig-push 10.9.0.1 10.9.0.2
 
# Suppose that you want to enable different[/FONT] [FONT=Courier New]
# firewall access policies for different groups
# of clients. There are two methods:
# (1) Run multiple OpenVPN daemons, one for each
# group, and firewall the TUN/TAP interface
# for each group/daemon appropriately.
# (2) (Advanced) Create a script to dynamically
# modify the firewall in response to access
# from different clients. See man
# page for more info on learn-address script.
;learn-address ./script
 
# If enabled, this directive will configure[/FONT] [FONT=Courier New]
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# the TUN/TAP interface to the internet in
# order for this to work properly).
# CAVEAT: May break client's network config if
# client's local DHCP server packets get routed
# through the tunnel. Solution: make sure
# client's local DHCP server is reachable via
# a more specific route than the default route
# of 0.0.0.0/0.0.0.0.
;push "redirect-gateway"
 
# Certain Windows-specific network settings[/FONT] [FONT=Courier New]
# can be pushed to clients, such as DNS
# or WINS server addresses. CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
;push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option WINS 10.8.0.1"
 
# Uncomment this directive to allow different[/FONT] [FONT=Courier New]
# clients to be able to "see" each other.
# By default, clients will only see the server.
# To force clients to only see the server, you
# will also need to appropriately firewall the
# server's TUN/TAP interface.
;client-to-client
 
# Uncomment this directive if multiple clients[/FONT] [FONT=Courier New]
# might connect with the same certificate/key
# files or common names. This is recommended
# only for testing purposes. For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn
 
# The keepalive directive causes ping-like[/FONT] [FONT=Courier New]
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120
 
# For extra security beyond that provided[/FONT] [FONT=Courier New]
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
# openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
;tls-auth ta.key 0 # This file is secret
 
# Select a cryptographic cipher.[/FONT] [FONT=Courier New]
# This config item must be copied to
# the client config file as well.
;cipher BF-CBC # Blowfish (default)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
 
# Enable compression on the VPN link.[/FONT] [FONT=Courier New]
# If you enable it here, you must also
# enable it in the client config file.
comp-lzo
 
# The maximum number of concurrently connected[/FONT] [FONT=Courier New]
# clients we want to allow.
;max-clients 100
 
# It's a good idea to reduce the OpenVPN[/FONT] [FONT=Courier New]
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
user openvpn
group openvpn
 
# The persist options will try to avoid[/FONT] [FONT=Courier New]
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun
 
# Output a short status file showing[/FONT] [FONT=Courier New]
# current connections, truncated
# and rewritten every minute.
status /etc/openvpn/logs/ameba/openvpn-status.log
 
# By default, log messages will go to the syslog (or[/FONT] [FONT=Courier New]
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it. Use one
# or the other (but not both).
;log openvpn.log
log-append /etc/openvpn/logs/ameba/openvpn.log
 
# Set the appropriate level of log[/FONT] [FONT=Courier New]
# file verbosity.
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3
 
# Silence repeating messages. At most 20[/FONT] [FONT=Courier New]
# sequential messages of the same message
# category will be output to the log.
;mute 20[/FONT]

Explicando algumas diretivas


local 172.17.2.100
A diretiva local diz em que endereço/interface de rede o serviço OpenVPN irá escutar.

port 1194
A diretiva port diz em que porta o OpenVPN receberá as solicitações, para cada instância do OpenVPN rodando na máquina utilize uma porta diferente.

proto tcp
A diretiva proto informa qual protocolo será usado. pode ser UDP ou TCP

dev tun
A diretiva tun criará um túnel de IP roteado, diretiva TAP cria um túnel Ethernet.

ca /etc/openvpn/keys/ameba/ca.crt
A diretiva ca informa a localização do certificado de autoridade

cert /etc/openvpn/keys/ameba/ameba-server.crt
A diretiva cert informa a localização do certificado do servidor

key /etc/openvpn/keys/ameba/ameba-server.key
A diretiva key informa a localização da chave do servidor

dh /etc/openvpn/keys/ameba/dh2048.pem
A diretiva dh informa a localizacão do parâmetro Diffie-Hellman

server 10.8.0.0 255.255.255.0
A diretiva server indica em qual faixa de rede a VPN será trafegada. Cada cliente VPN, neste caso, irá receber um I.P. da faixa 10.8.0.0/24.

ifconfig-pool-persist /etc/openvpn/ipp/ameba/ipp-ameba.txt
A diretiva ifconfig-pool-persist indica a localização do arquivo ipp-ameba.txt. Neste arquivo ficam guardadas as informações de cada cliente, assim é possível atribuir o mesmo I.P. de VPN para cada cliente, assim que ele se requisita um I.P. ao servidor.

keepalive 10 120
A diretiva keepalive envia um pacote PING ao cliente , assim o cliente sabe quando um cliente está inacessível. Neste caso um PING é enviado a cada 10 segundos e se não houver resposta em 120 segundos o cliente é considerado "fora do ar".

comp-lzo
A diretiva comp-lzo diz ao servidor que a compressão será ativada no link VPN, no intuito de aumentar o desempenho do túnel.

user openvpn
A diretiva user informa com qual usuário o serviço OpenVPN será levantado, com isso reduzindo os privilégios.

group openvpn
A diretiva group informa com qual grupo o serviço OpenVPN será levantado, com isso reduzindo os privilégios.

persist-key
persist-tun

As diretivas persist-key e persist-tun dizem ao servidor para evitar certos recursos devido a redução dos privilégios.

status /etc/openvpn/logs/ameba/openvpn-status.log
A diretiva status mostra pequenas informações sobre os status do servico OpenVPN. Atualizada a cada minuto.

log-append /etc/openvpn/logs/ameba/openvpn.log
A diretiva log guarda as informacoes fornecidas durante o funcionamento do servico OpenVPN. O log-append adiciona as informacoes no arquivo /etc/openvpn/logs/ameba/openvpn.log. Se for usada a opcão log em vez de log-append, a cada reinicialização do serviço o arquivo openvpn.log será truncado e reescrito com novas informações.

Nunca utilize as opções log e log-append juntas.


verb 3
A diretiva verb informa o nível de saída de informações ao log, que vai de 0 (silêncio) a 9 (extremamente informativo). Estas informações serão gravadas no arquivo de log (ver diretiva log/log-append).

Testando o servidor

Dê o comando:
Código :
[FONT=Courier New]# openvpn --config /etc/openvpn/conf/ameba/ameba-server.conf[/FONT]
Logo em seguida as mensagens aparecerão na tela:
Código :
[FONT=Courier New]Thu Jul 22 15:59:52 2010 OpenVPN 2.1.0 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [MH] [PF_INET6] built on Jul 8 2010
Thu Jul 22 15:59:52 2010 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Thu Jul 22 15:59:52 2010 Diffie-Hellman initialized with 2048 bit key
Thu Jul 22 15:59:52 2010 TLS-Auth MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Thu Jul 22 15:59:52 2010 ROUTE default_gateway=172.17.2.1
Thu Jul 22 15:59:52 2010 TUN/TAP device tun0 opened
Thu Jul 22 15:59:52 2010 TUN/TAP TX queue length set to 100
Thu Jul 22 15:59:52 2010 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Thu Jul 22 15:59:52 2010 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Thu Jul 22 15:59:52 2010 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Thu Jul 22 15:59:52 2010 GID set to openvpn
Thu Jul 22 15:59:52 2010 UID set to openvpn
Thu Jul 22 15:59:52 2010 Listening for incoming TCP connection on [AF_INET]172.17.2.100:1194
Thu Jul 22 15:59:52 2010 Socket Buffers: R=[87380->131072] S=[16384->131072]
Thu Jul 22 15:59:52 2010 TCPv4_SERVER link local (bound): [AF_INET]172.17.2.100:1194
Thu Jul 22 15:59:52 2010 TCPv4_SERVER link remote: [undef]
Thu Jul 22 15:59:52 2010 MULTI: multi_init called, r=256 v=256
Thu Jul 22 15:59:52 2010 IFCONFIG POOL: base=10.8.0.4 size=62
Thu Jul 22 15:59:52 2010 IFCONFIG POOL LIST
Thu Jul 22 15:59:52 2010 MULTI: TCP INIT maxclients=1024 maxevents=1028
Thu Jul 22 15:59:52 2010 Initialization Sequence Completed[/FONT]
Note que:

1. O Servico OpenVPN levantou a interface tun0 e que seu I.P. é 10.8.0.1.
2. O UID e GID foram configurados para o usuário openvpn.
3. Que o tamanho da a chave Diffie-Hellman é de 2048 bits.

Este tipo de informação pode ser muito mais detalhada, basta apenas aumentar o nível de informação através do parâmetro verb.


Abra outro terminal para conferir se a interface de rede virtual está habilitada. E dê o comando:
Código :
[FONT=Courier New]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:15:17:9c:aa:60
inet addr:172.17.2.100 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::215:17ff:fe9c:aa60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:143111 errors:0 dropped:0 overruns:0 frame:0
TX packets:11988 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:21406246 (20.4 MiB) TX bytes:2257138 (2.1 MiB)
 
lo Link encap:Local Loopback[/FONT] [FONT=Courier New]
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
 
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00[/FONT] [FONT=Courier New]
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)[/FONT]

Acerte seu relógio, a sincronização entre o servidor e o cliente é importante. Caso um dos dois esteja com a hora errada, o cliente chega a conectar mas desconecta, logo em seguida.


Comente o parâmetro log-append. Assim você será capaz de acompanhar o levante do serviço na tela do terminal.



Configurando o serviço OpenVPN


Na maioria das distros basta colocar os arquivos de configuração no /etc/openvpn e ao levantar o servico os arquivos são lidos e para cada .conf lido uma instância do servidor será criada (lembre-se que a porta e a rede definida para cada instância deve ser diferente), contudo ao derrubar o servico OpenVPN todas as instâncias ficam inativas.
No Gentoo é possível iniciar, reiniciar e parar cada instancia separadamente (Eu já mencionei que amo essa distro, rs?).

Levantando o serviço OpenVPN durante a inicialização do sistema

Faremos isso em 2 passos:

Alterando o Arquivo /etc/init.d/openvpn

O arquivo de configuracão encontra-se em /etc/openvpn/conf/ameba-server.conf. Será preciso alterar o /etc/init.d/openvpn para que o script busque os arquivos de configuração no diretório /etc/openvpn/conf/, pois por padrão ele busca em /etc/openvpn/. Altere a variável VPNDIR.
Código :
[FONT=Courier New]# nano /etc/init.d/openvpn
VPNDIR=${VPNDIR:-/etc/openvpn/conf}[/FONT]

Criando um Serviço separado


Dentro do diretório /etc/init.d um link simbólico deve ser criado e este deve apontar para /etc/init.d/openvpn.
A estrutura do link deve ser openvpn.nomedoarquivo.

Entrando no diretório
Código :
[FONT=Courier New] # cd /etc/init.d[/FONT]
Criando link
Código :
[FONT=Courier New] # ln -s openvpn openvpn.ameba-server[/FONT]
Conferindo link
Código :
[FONT=Courier New]# ls -lash | grep openvpn
0 lrwxrwxrwx. 1 root root 7 Jul 22 15:55 openvpn.ameba-server -> openvpn[/FONT]

Colocando o servi
ço para inicar no boot

Como foi criado um serviço específico para a instância ameba-server, logo podemos iniciá-lo e pará-lo como um servico qualquer:
Código :
[FONT=Courier New]# /etc/init.d/openvpn.ameba-server
Usage: openvpn.ameba-server [options] stop | start | restart | describe | zap[/FONT]
Com isso podemos coloca-lo no boot usando o rc-update.
Código :
[FONT=Courier New]# rc-update add openvpn.ameba-server default
* service openvpn.ameba-server added to runlevel default[/FONT]
Conferindo:
Código :
[FONT=Courier New]# rc-update | grep openvpn
openvpn.ameba-server | default[/FONT]
Pronto! Servidor funcionando! Iremos agora configurar o cliente.

Configurando o cliente

Instale o OpenVPN no cliente e crie os diretórios necessários. Veja como instalar o OpenVPN no começo deste tutorial. =)

Criando os diretórios
Código :
[FONT=Courier New]# mkdir /etc/openvpn/conf/
# mkdir /etc/openvpn/keys/ameba-cliente1/
# mkdir /etc/openvpn/logs/ameba-cliente1/[/FONT]
Copie as chaves do cliente ameba-cliente1 para o diretório /etc/openvpn/keys/ameba-cliente1/. Depois disso iremos configurar o cliente.

Crie/edite o arquivo /etc/openvpn/conf/ameba-cliente1.conf:
Código :
[FONT=Courier New]# nano /etc/openvpn/conf/ameba-cliente1.conf
 
##############################[/FONT] [FONT=Courier New]
# Specify that we are a client and that we
# will be pulling certain config file directives
# from the server.
client
 
# Use the same setting as you are using on[/FONT] [FONT=Courier New]
# the server.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun
 
# Windows needs the TAP-Win32 adapter name[/FONT] [FONT=Courier New]
# from the Network Connections panel
# if you have more than one.  On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap
 
# Are we connecting to a TCP or[/FONT] [FONT=Courier New]
# UDP server?  Use the same setting as
# on the server.
;proto tcp
proto tcp
 
# The hostname/IP and port of the server.[/FONT] [FONT=Courier New]
# You can have multiple remote entries
# to load balance between the servers.
remote 172.17.2.100 1194
;remote my-server-2 1194
 
# Choose a random host from the remote[/FONT] [FONT=Courier New]
# list for load-balancing.  Otherwise
# try hosts in the order specified.
;remote-random
 
# Keep trying indefinitely to resolve the[/FONT] [FONT=Courier New]
# host name of the OpenVPN server.  Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite
 
# Most clients don't need to bind to[/FONT] [FONT=Courier New]
# a specific local port number.
nobind
 
# Downgrade privileges after initialization (non-Windows only)[/FONT] [FONT=Courier New]
user openvpn
group openvpn
 
# Try to preserve some state across restarts.[/FONT] [FONT=Courier New]
persist-key
persist-tun
 
# If you are connecting through an[/FONT] [FONT=Courier New]
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here.  See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
 
# Wireless networks often produce a lot[/FONT] [FONT=Courier New]
# of duplicate packets.  Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings
 
# SSL/TLS parms.[/FONT] [FONT=Courier New]
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
ca /etc/openvpn/keys/ameba-cliente1/ca.crt
cert /etc/openvpn/keys/ameba-cliente1/ameba-cliente1.crt
key /etc/openvpn/keys/ameba-cliente1/ameba-cliente1.key
 
# Verify server certificate by checking[/FONT] [FONT=Courier New]
# that the certicate has the nsCertType
# field set to "server".  This is an
# important precaution to protect against
# a potential attack discussed here:
#  http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server".  The build-key-server
# script in the easy-rsa folder will do this.
;ns-cert-type server
 
# If a tls-auth key is used on the server[/FONT] [FONT=Courier New]
# then every client must also have the key.
;tls-auth ta.key 1
 
# Select a cryptographic cipher.[/FONT] [FONT=Courier New]
# If the cipher option is used on the server
# then you must also specify it here.
;cipher x
 
# Enable compression on the VPN link.[/FONT] [FONT=Courier New]
# Don't enable this unless it is also
# enabled in the server config file.
comp-lzo
 
# By default, log messages will go to the syslog (or[/FONT] [FONT=Courier New]
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it. Use one
# or the other (but not both).
;log openvpn.log
log-append /etc/openvpn/logs/ameba-cliente1/openvpn.log
 
# Set log file verbosity.[/FONT] [FONT=Courier New]
verb 3
 
# Silence repeating messages[/FONT] [FONT=Courier New]
;mute 20[/FONT]
Explicando algumas diretivas específicas do cliente

client
A diretiva client indica que o serviço OpenVPN atuará como cliente

remote 172.17.2.100 1194
A diretiva remote diz o endereço do servidor OpenVPN, vários servidores podem ser indicados, para fins de balanceamento.

resolv-retry infinite
A diretiva resolv-retry infinite diz a servico para tentar resolver o nome do servidor OpenVPN, muito útil para dispositivos móveis, isto é, que não estão conectados permanentemente na mesma rede.

nobind
A diretiva nobind diz ao serviço que não vincule ao serviço uma porta para os pacotes retornados. A pilha de I.P. alocará dinamicamente as portas para receber os pacotes.

Testando o cliente

Código :
[FONT=Courier New]# openvpn --config /etc/openvpn/conf/ameba-cliente1.conf
 
Mon Jul 26 10:58:45 2010 OpenVPN 2.1.0 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [MH] [PF_INET6] built on Jul 22 2010[/FONT] [FONT=Courier New]
Mon Jul 26 10:58:45 2010 WARNING: No server certificate verification method has been enabled.  See http://openvpn.net/howto.html#mitm for more info.
Mon Jul 26 10:58:45 2010 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
Mon Jul 26 10:58:45 2010 LZO compression initialized
Mon Jul 26 10:58:45 2010 Control Channel MTU parms [ L:1544 D:140 EF:40 EB:0 ET:0 EL:0 ]
Mon Jul 26 10:58:45 2010 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Jul 26 10:58:45 2010 Local Options hash (VER=V4): '69109d17'
Mon Jul 26 10:58:45 2010 Expected Remote Options hash (VER=V4): 'c0103fa8'
Mon Jul 26 10:58:45 2010 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
Mon Jul 26 10:58:45 2010 Attempting to establish TCP connection with [AF_INET]172.17.1.193:1194 [nonblock]
Mon Jul 26 10:58:46 2010 TCP connection established with [AF_INET]172.17.1.193:1194
Mon Jul 26 10:58:46 2010 Socket Buffers: R=[87380->131072] S=[16384->131072]
Mon Jul 26 10:58:46 2010 TCPv4_CLIENT link local: [undef]
Mon Jul 26 10:58:46 2010 TCPv4_CLIENT link remote: [AF_INET]172.17.1.193:1194
Mon Jul 26 10:58:46 2010 TLS: Initial packet from [AF_INET]172.17.1.193:1194, sid=09db64e7 21b5e97c
Mon Jul 26 10:58:46 2010 VERIFY OK: depth=1, /C=BR/ST=BA/L=ILHEUS/O=AMEBA/OU=AMEBA/CN=AMEBA-MAIN-CA/emailAddress=eduardo@labbi.uesc.br
Mon Jul 26 10:58:46 2010 VERIFY OK: depth=0, /C=BR/ST=BA/L=ILHEUS/O=AMEBA/OU=AMEBA/CN=AMEBA-SERVER/emailAddress=eduardo@labbi.uesc.br
Mon Jul 26 10:58:46 2010 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Jul 26 10:58:46 2010 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Jul 26 10:58:46 2010 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Mon Jul 26 10:58:46 2010 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Jul 26 10:58:46 2010 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 2048 bit RSA
Mon Jul 26 10:58:46 2010 [AMEBA-SERVER] Peer Connection Initiated with [AF_INET]172.17.1.193:1194
Mon Jul 26 10:58:48 2010 SENT CONTROL [AMEBA-SERVER]: 'PUSH_REQUEST' (status=1)
Mon Jul 26 10:58:49 2010 PUSH: Received control message: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5'
Mon Jul 26 10:58:49 2010 OPTIONS IMPORT: timers and/or timeouts modified
Mon Jul 26 10:58:49 2010 OPTIONS IMPORT: --ifconfig/up options modified
Mon Jul 26 10:58:49 2010 OPTIONS IMPORT: route options modified
Mon Jul 26 10:58:49 2010 ROUTE default_gateway=172.17.0.1
Mon Jul 26 10:58:49 2010 TUN/TAP device tun0 opened
Mon Jul 26 10:58:49 2010 TUN/TAP TX queue length set to 100
Mon Jul 26 10:58:49 2010 /sbin/ifconfig tun0 10.8.0.6 pointopoint 10.8.0.5 mtu 1500
Mon Jul 26 10:58:49 2010 /etc/openvpn/up.sh tun0 1500 1544 10.8.0.6 10.8.0.5 init
Mon Jul 26 10:58:49 2010 /sbin/route add -net 10.8.0.1 netmask 255.255.255.255 gw 10.8.0.5
Mon Jul 26 10:58:49 2010 GID set to openvpn
Mon Jul 26 10:58:49 2010 UID set to openvpn
Mon Jul 26 10:58:49 2010 Initialization Sequence Completed[/FONT]
Conferindo as interfaces de rede:

Código :
[FONT=Courier New]# ifconfig
 
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  [/FONT] [FONT=Courier New]
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)[/FONT]
Testando conexão:
Código :
 [FONT=Courier New]# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.471 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.569 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.439 ms
64 bytes from 10.8.0.1: icmp_seq=4 ttl=64 time=0.497 ms
64 bytes from 10.8.0.1: icmp_seq=5 ttl=64 time=0.627 ms
 
--- 10.8.0.1 ping statistics ---[/FONT] [FONT=Courier New]
5 packets transmitted, 5 received, 0% packet loss, time 3997ms
rtt min/avg/max/mdev = 0.439/0.520/0.627/0.072 ms[/FONT]
Agora iremos colocar o serviço na inicialização do sistema.
Código :
[FONT=Courier New]# cd /etc/init.d/
# ln -s openvpn openvpn.ameba-cliente1
# ls -lash | grep openvpn
0 lrwxrwxrwx  1 root root    7 Jul 26 10:54 openvpn.ameba-client-> openvpn[/FONT]
Alterando o /etc/init.d/openvpn
Código :
[FONT=Courier New]# nano /etc/init.d/openvpn
VPNDIR=${VPNDIR:-/etc/openvpn/conf}[/FONT]
Inciando o serviço
Código :
[FONT=Courier New]#  /etc/init.d/openvpn.ameba-cliente1 start
 * Starting openvpn.ameba-cliente1 ...
 * WARNING: You are dropping root privileges!
 * As such openvpn may not be able to change ip, routing
 * or DNS configuration.[ ok ]
 * WARNING: openvpn.ameba-cliente1 has started, but is inactive[/FONT]
Apesar do aviso sobre a inatividade do OpenVPN o serviço está funcionando.
Pronto! Cliente funcionado.

Endurecendo a seguranca do OpenVPN

tls-auth

A diretiva tls-auth adiciona uma asssinatura HMAC para todas os pacotes de negociacões SSL/TLS para verificação de integridade. Qualquer pacote UDP que não tenha uma assinatura HMAC pode ser descartado sem processamento posterior. A assinatura tls-auth HMAC provê um nível de segurança adicional a ambos os lados. Isto pode proteger contra:

  • Ataques DoS ou port flooding na porta do OpenVPN;
  • Port scanning para determinar quais as portas UDP do servidor está "escutando";
  • Vulnerabilidades de Buffer overflow na implementação do SSL/TLS;
  • Negociações iniciais de SSL/TLS a partir de máquinas não autorizadas

Usar tls-auth requer que seja gerada uma chave secreta-compartilhada que é usada em adição ao certificado/chave RSA padrão:
Código :
[FONT=Courier New] # openvpn --genkey --secret ta.key[/FONT]
Este comando criará a chave estática OpenVPN e a escreverá em um arquivo chamado ta.key. Esta chave deve ser copiada sobre um canal previamente seguro entre os clientes e o servidor. Ela pode ser colocada no mesmo diretório onde estão guardados os certificados e chaves previamente criados.

No servidor:
Código :
[FONT=Courier New] tls-auth  /etc/openvpn/keys/ameba/ta.key 0[/FONT]
No Cliente:
Código :
[FONT=Courier New] tls-auth  /etc/openvpn/keys/ameba-cliente1/ta.key 1[/FONT]

proto UDP


Apesar do OpenVPN permitir TCP ou UDP para ser usado como o transportador da conexão VPN, o protocolo UDP proverá melhor protecão contra ataques DoS e port scanning do que o TCP.
Código :
[FONT=Courier New] proto udp[/FONT]

user/group (exceto Windows)


OpenVPN tem sido bastante cuidadoso sendo definido para descartar privilégios de root depois da inicialização do serviço, e esta característica sempre será usada em Linux/BSD/Solaris. Sem privilégios de root, um daemon OpenVPN em execução será um alvo muito menos sedutor ao atacante.
Código :
[FONT=Courier New]user nobody
group nobody[/FONT]

Modo não-privilegiado


Um serviço Linux OpenVPN pode ser rodado completamente sem privilégios. Esta configuração é um pouco mais complexa, mas provê melhor segurança.
Em ordem para trabalhar com esta configuração, OpenVPN deve ser configurado para usar a interface iproute, isto é feito especificando --enable-iproute2 ao script configure. O pacote sudo também deve estar disponível em seu sistema.
Esta configuração usa a habilidade do Linux de trocar a permissão de um dispositivo tun, então um usuário sem privilégios pode usá-lo. Isto também permite usar o sudo para executar o iproute, assim as propriedades daquela interface e a tabela de roteamento podem ser modificadas.

No Gentoo uma das formas de habilitar a compilação com iproute é usando a flag iproute2 ao OpenVPN no arquivo /etc/portage/package.use e reinstalar/recompilar o pacote:
Código :
[FONT=Courier New]# nano /etc/portage/package.use
net-misc/openvpn iproute2
 
#emerge openvpn[/FONT]
Outra maneira é utilizando o aplicativo ufed (Gentoo Linux USE flags editor), e marcar a opção iproute2
Código :
[FONT=Courier New] # ufed[/FONT]
Note que ao utilizar o ufed, a flag marcada será global , isto é, todos os pacotes que possuem esta flag serão compilados com suporte a esta. Tenha cuidado, o recomendável é utilizar-se do /etc/portage/package.use e ativar as flags para cada pacote, individualmente.

Dica: Para saber quais flags estão ativas em um pacote, use o comando: equery uses nomedopacote. O comando equery faz parte do pacote app-portage/gentoolkit


Escreva o seguinte script e o coloque em /usr/local/sbin/unpriv-ip:
Código :
[FONT=Courier New]#!/bin/sh
sudo /sbin/ip $*[/FONT]
Dando as devidas permissões (assumindo que somente o usuário user1 use esta interface)
Código :
[FONT=Courier New]# chmod 750 /usr/local/sbin/unpriv-ip
# chown user1:users /usr/local/sbin/unpriv-ip[/FONT]
Execute o visudo, e então adicione a seguinte diretiva para permitir o usuário user1 executar /sbin/ip:
Código :
[FONT=Courier New]user1 ALL=(ALL)  NOPASSWD: /sbin/ip[/FONT]
Você também pode permitir um grupo de usuários com o seguinte comando:
Código :
[FONT=Courier New]%users ALL=(ALL)  NOPASSWD: /sbin/ip[/FONT]
Adicione o seguinte na sua configuração do OpenVPN
Código :
[FONT=Courier New]dev tunX/tapX
iproute /usr/local/sbin/unpriv-ip
[/FONT]

Note, que você precisa selecionar a constante X (X deve ser um numero, tun0, tun1, tun2....) e especificar tun ou tap, não ambos.


Como root adicione uma interface persistente, e permita um usuário ou grupo gerenciá-la, o seguinte comando cria tunX (substitua pela usa interface tun) e permite o user1 e/ou grupo acessá-la.
Código :
[FONT=Courier New]# openvpn --mktun --dev tun0 --dev-type tun --user user1 --group users[/FONT]

Dica: Utilize o usuário e grupo o qual está configurado na opção user/group no arquivo de configuração.



Rode o OpenVPN no contexto de usuário não-privilegiado.
Código :
[FONT=Courier New]# /etc/init.d/openvpn restart[/FONT]

Limitações de segurança posteriores podem ser adicionadas examinando os parâmetros no script /usr/local/sbin/unpriv-ip



Tamanho das chaves RSA (chaves largas)

O tamanho da chave RSA é controlado pela variável KEY_SIZE no arquivo easy-rsa/vars, o qual precisa ser configurado antes das chaves serem criadas. Atualmente configurar para 1024 é o tamanho padrão, este valor pode crescer para 2048 sem impacto negativo no desempenho do túnel VPN, exceto será um pouco mais lento nas renegociações SSL/TLS que occorre uma vez por cliente por hora e um mais lento na geração da chave Diffie-Hellman usado no script easy-rsa/build-dh.

Chaves simétricas grandes.

Por padrão OpenVPN usa Blowfish, uma cifra simétrica de 128 bits.

OpenVPN suporta qualquer cifra que é suportada pela biblioteca OpenSSL, e assim pode suportar cifras que usam chaves grandes. Por exemplo, a versão 256 bits do AES (Advanced Encryption Standard) pode ser usada adicionando a seguinte diretiva nos arquivos de configuração ambos no servidor e cliente

Código :
[FONT=Courier New] cipher AES-256-CBC[/FONT]

O tamanho da cifra impacta diretamente no desempenho do túnel VPN



Possível ataque "Homem-no-meio"


Para evitar um possível ataque de "Homem-no-meio" onde um cliente autorizado tenta conectar-se a um outro cliente passando-se pelo servidor, tenha certeza de obrigar um tipo de verificação para os certificados dos servidor pelos clientes. Existem cinco maneiras diferentes de executar isso, listado em ordem de preferência:

RFC3280

[OpenVPN 2.1 e posteriores] Gere seus certificados de servidores com uma chave específica e uso de chave estendida. A RFC3280 determina que os seguintes atributos devem ser providenciados numa conexão TLS:


Você pode gerar seus certificados com o script build-key-server (veja na documentação do easy-rsa). Ele designará o certificado como um certificado de somente servidor (server-only) ajustando os atributos corretos. Adicione a seguinte diretiva na configuração do cliente:
Código :
[FONT=Courier New] remote-cert-tls server[/FONT]
Em termos práticos, será algo parecido com isso (veja nos logs):
Código :
[FONT=Courier New]Thu Jul 29 14:56:56 2010 VERIFY OK: depth=1, /C=BR/ST=BA/L=ILHEUS/O=AMEBA/OU=AMEBA/CN=AMEBA-MAIN-CA/emailAddress=eduardo@labbi.uesc.br
Thu Jul 29 14:56:56 2010 Validating certificate key usage
Thu Jul 29 14:56:56 2010 ++ Certificate has key usage  00a0, expects 00a0
Thu Jul 29 14:56:56 2010 VERIFY KU OK
Thu Jul 29 14:56:56 2010 Validating certificate extended key usage
Thu Jul 29 14:56:56 2010 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
Thu Jul 29 14:56:56 2010 VERIFY EKU OK
Thu Jul 29 14:56:56 2010 VERIFY OK: depth=0, /C=BR/ST=BA/L=ILHEUS/O=AMEBA/OU=AMEBA/CN=AMEBA-SERVER/emailAddress=eduardo@labbi.uesc.br[/FONT]
ns-cert-type

[OpenVPN 2.0 e anteriores] Gere seus certificados com o script build-key-server (veja na documentação do easy-rsa). Ele designará o certificado como um certificado de somente servidor (server-only) ajustada pela configuração nsCertType=server. Agora adicione a seguinte linha na configuração do cliente:
Código :
[FONT=Courier New] ns-cert-type server[/FONT]

tls-remote


Use a diretiva tls-remote no cliente para aceitar/rejeitar a conexão do servidor baseada pelo common name do certificado do servidor.
[alert]Lembre-se que o common name é único![alert]

tls-verify

Use o script tls-verify ou plugin para aceitar/rejeitar a conexão do servidor baseada em um teste comum de certificado embutido de X509 do servidor.

CA

Assine o certificado do servidor com uma CA e os clientes com uma CA diferente. A configuração do cliente deverá referenciar o arquivo-assinado de CA do servidor, enquanto a configuração do servidor deverá referenciar o arquivo-assinado do cliente.

Revogando Certificados

Uma maneira adicional de aumentar a seguranca é revogando certificados já concedidos.


Referências:

- What is Diffie-Hellman?
- OpenVPN How-to
- Gentoo Linux -- Gentoo Linux News
- Gentoo OpenVPN Wiki
- Gendorf (2006) [1]
- Quaresma (2006) [2]
- Cyclades (2000) [3]


Agradecimentos:

- Ao portal Under-Linux.org
- Ao Code pela ajuda no tutorial.
- Ao NBCGIB onde está localizado o parque computacional.


Autor
- Duca

Atualizado 10-08-2010 em 14:40 por Duca

Categorias
Pessoal , Under-Linux , Tutoriais

Comentários

  1. Avatar de MarcusMaciel
    Fantastico Duca meus parabens pelo tutorial fico muito bom mesmo
  2. Avatar de Duca
    Valeu!
    Tá saindo outro essa semana! uhuuulll \o/ !!

+ Enviar Comentário



Visite: BR-Linux ·  VivaOLinux ·  Dicas-L