Cenário e opções

Recentemente minha empresa requisitou que o departamento de TI liberasse o acesso via VPN à todos os vendedores externos como uma medida para tentar aumentar a quantidade de vendas e a qualidade do atendimento aos clientes.

A primeira coisa que passou pela mente de todos no time foi segurança. Todos sabem que este tipo de software, se não implementado corretamente, é uma grande brecha de segurança. Uma das primeiras alternativas que analisamos foi o PPTP.

As opções

Como você já deve saber, nem os próprios desenvolvedores da implementação do PPTP o recomendam por causa da grande quantidade de falhas de segurança do software. Além disso, todas as senhas dos usuários com permissão para se conectar ao servidor ficam em um arquivo texto sem a mínima criptografia, o que aumenta muito os riscos de segurança.

A nossa segunda opção foi o OpenVPN. O que me chamou a atenção foi uma das premissas que guiaram os desenvolvedores no desenvolvimento deste software: complexidade é inimiga da segurança. Nada mais correto!

Porém, a implementação do OpenVPN para Windows não é muito amigável para usuários leigos como os vendedores da empresa. Neste aspecto o PPTP é uma boa opção, pois apenas abrindo a conexão e clicando no botão “Conectar” tudo já funcionava corretamente.

Procurando por soluções no próprio site do OpenVPN, acabei encontrando o OpenVPN GUI. Esta é uma implementação de interface gráfica para que o usuário consiga utilizar o OpenVPN mais facilmente. Com ele, basta clicar com o botão direito no ícone do OpenVPN GUI (que fica perto do relógio do Windows) e depois em “Connect” que tudo funcionaria sem problemas. Pronto! Encontrei minha solução, basta agora configurar tudo corretamente.

Instalando o OpenVPN no CentOS 5.2 Linux

O servidor que escolhi para configurar o OpenVPN foi o CentOS 5.2 Linux, simplesmente por gostar da distribuição. Praticamente todo este texto se aplica a qualquer distribuição.

Se você entende bem inglês, recomendo que leia o FAQ no site do OpenVPN para tirar dúvidas. Muita informação clara e preciosa se encontra lá. Lendo o FAQ você consegue implantar uma VPN do zero sem muita dor de cabeça. Mais ou menos o objetivo deste texto!

Começando pela instalação do OpenVPN. Nos repositórios do CentOS o OpenVPN ainda não está disponível, por isso vamos precisar compilá-lo na mão. Mas antes, precisamos das ferramentas de desenvolvimento para podermos compilar os softwares necessários sem muita dor de cabeça.

Para instalá-las:

# yum groupinstall ‘Development Tools’

Isso vai levar um tempo, mas quando terminar você já vai conseguir compilar qualquer software que precise. Antes de instalar o OpenVPN é recomendado que você instale o OpenSSL e o OpenSSL-devel (que estão nos repositórios do CentOS):

# yum install openssl
# yum install openssl-devel

A biblioteca LZO, utilizada para fazer compressão dos dados em tempo real (o que melhora muito o desempenho do software), também é recomendada. Para fazer o download do LZO, vá até o site http://www.oberhumer.com/opensource/lzo/download/ e pegue a versão mais recente (cuidado para não fazer o download da minilzo, que não servirá neste caso). Para compilar e instalar o LZO:

# tar xzvf lzo-2.03.tar.gz
# cd lzo-2.03
# ./configure
# make
# make install

A instalação do OpenVPN também é bem simples. Faça o download dos arquivos do site oficial (http://www.openvpn.net) e compile:

# tar xzvf openvpn-2.0.9.tar.gz
# cd openvpn-2.0.9
# ./configure
# make
# make install

Configuração do servidor

Como você deve se lembrar do início do artigo, o OpenVPN foi feito para ser simples: coisas muito complicadas tendem a ser configuradas de maneira errônea, o que acaba causando falhas na segurança do sistema.

Sendo assim, não é errado imaginar que a configuração do sistema seja simples. Com algumas opções você já consegue deixar o servidor inteiro funcionando perfeitamente. No meu ambiente preferi fazer com que o OpenVPN funcionasse por uma bridge por alguns motivos:

  • Algumas aplicações que são muito utilizadas pelos vendedores e diretores da minha empresa (como o ERP e o CRM) utilizam broadcasts de rede (que são barrados por roteadores);
  • Precisava permitir acesso a compartilhamentos de arquivos do Windows. Isto não funciona quando se faz uma rede roteada.
  • Também escolhi utilizar autenticação através de certificados para evitar senhas passando por redes inseguras e também para evitar problemas com usuários esquecendo as senhas. Com os certificados, nenhuma senha é necessária e para evitar que um determinado certificado se conecte ao servidor, basta revogá-lo. Veremos todos os detalhes de certificados mais adiante.

Primeiro, vou explicar como configurar o OpenVPN e depois explicarei como fazer a bridge no Linux.

Configurando o OpenVPN

O OpenVPN é um pouco diferente: ele não cria nenhum diretório padrão, nem arquivos de configuração na instalação. Quando você vai criar uma nova VPN você começa um novo arquivo de configuração do zero.

Crie o diretório /etc/openvpn:

# mkdir /etc/openvpn

Para dentro deste diretório você deve copiar o diretório easy-rsa, que está dentro do diretório criado quando você descompactou o OpenVPN na sua máquina.

# cp -R openvpn-2.0.9/easy-rsa /etc/openvpn

O easy-rsa é um conjunto de scripts que facilitam o processo de criação de certificados digitais. Estes serão utilizados para autenticar os usuários e permitir que eles estabeleçam a conexão com o nosso servidor.

Depois, crie um diretório que irá guardar os arquivos de configuração da VPN que iremos criar. Você pode dar qualquer nome a este diretório. Aqui, vou chamá-lo de vol-vpn:

# mkdir /etc/openvpn/vol-vpn

Dentro dele, crie um arquivo texto com qualquer nome. Ele irá conter todos os parâmetros da configuração da VPN que estamos fazendo. Ele vai ficar mais ou menos assim:

# cat /etc/openvpn/vol-vpn.conf

# Define em qual endereço o servidor aceitará conexões
# Coloque um endereço válido no seu arquivo
local 10.0.0.1

# Porta na qual o servidor aceitará conexões
port 1194

# Protocolo utilizado no túnel
proto udp

# Dispositivo utilizado pelo OpenVPN
dev tap0

# Indica que o servidor atuará como o
# controlador no canal de comunicação
# durante a conexão TLS
tls-server

# Permite que os clientes conectados ao
# servidor troquem pacotes entre si
client-to-client

# Para não precisar especificar o caminho
# completo nas opções ca, cert, key, dh e tls-auth
# utilizamos esta opção
cd /etc/openvpn/keys
ca ca.crt
cert vpnsrv.crt
key vpnsrv.key
dh dh1024.pem

# Chave estática que atua como uma segunda
# camada de proteção. Servidor só aceita conexões caso
# este arquivo também exista no cliente.
# gere com openvpn –genkey –secret ta.key
tls-auth /etc/openvpn/keys/ta.key 0

# Define que atuaremos como servidor
mode server

# Número máximo de clientes simultâneos conectados
# ao servidor. Neste caso, em um dado momento apenas
# 10 clientes conseguirão ficar conectados ao mesmo tempo.
# Mude para o número que você desejar e seus recursos
# permitirem
max-clients 10

# Permite que 2 clientes com o mesmo nome se conectem ao
# servidor ao mesmo tempo. Sem esta opção, o cliente que tentar
# se conectar derruba o cliente já conectado.
duplicate-cn

# Define o IP interno do servidor e a faixa de IP’s que serão
# atribuídos aos clientes quando se conectarem. Neste caso, o
# OpenVPN pode atribuir qualquer um dos 20 IP’s no range configurado.
server-bridge 192.168.0.1 255.255.255.0 192.168.0.10 192.168.0.30

# Configura o DNS no cliente
push “dhcp-option DNS 192.168.0.254″

# Configura o servidor WINS no cliente. Geralmente
# este é o controlador de domínio da sua rede.
push “dhcp-option WINS 192.168.0.3″

# Define qual será o gateway utilizado pelos clientes
# quando conectarem na VPN. É bom que este gateway seja
# a interface interna do seu servidor OpenVPN.
push “default-gateway 192.168.0.1″

# Define quando a outra ponta está morta. A cada 10 segundos
# um ping é enviado e se não for recebido em 120 segundos uma resposta,
# definimos que a outra ponta está morta.
ping 10
ping-restart 120

# Configura as mesmas opções no cliente.
push “ping 10″
push “ping-restart 60″

# Define que os dados serão comprimidos antes
# de serem enviados pelo canal de comunicação.
comp-lzo

# No arquivo status são gravados os dados dos clientes
# que se conectam ao servidor. Bom para controle do servidor.
status /etc/openvpn/vol-vpn/openvpn-status.log 2

# Quantidade de informações que serão escritas nos logs
# do OpenVPN. Quanto maior o número, mais informações.
verb 4

# Define quais serão os logs do sistema.
log /var/log/openvpn-vol-vpn.log
log-append /var/log/openvpn-vol-vpn.log

Bem simples, não? Obviamente este é um arquivo básico que tem como objetivo apenas fechar uma VPN que “faz o serviço”, nada de avançado. Se você quiser uma explicação detalhada sobre estas e mais outras opções que podem te ajudar bastante, leia o FAQ do OpenVPN.

Gerando os certificados

Agora que já temos tudo configurado, precisamos gerar os certificados do servidor para que ele consiga emitir e validar os certificados dos clientes.

Entre no diretório /etc/openvpn/easy-rsa. Aqui dentro você verá vários shell-scripts diferentes, todos relacionados com a criação de certificados SSL. Primeiro, edite o arquivo vars. Ele contém algumas variáveis que devem ser modificadas:

  • KEY_COUNTRY: coloque BR para Brasil;
  • KEY_PROVINCE: coloque a sigla do seu estado (SP, 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.

Estas variáveis são utilizadas durante a criação de todos os certificados do sistema e devem sempre ser informadas corretamente. Salve o arquivo e faça o seguinte:

# . ./source vars

Ele irá executar o arquivo vars, definindo todas as variáveis de ambiente necessárias para os outros scripts que serão executados. Depois:

# ./clean-all

Este arquivo irá limpar o diretório /etc/openvpn/easy-rsa/keys (se você não tiver modificado o padrão do arquivo vars). Depois:

# ./build-ca

Este script demora um pouco para executar, geralmente você pode aceitar todos os padrões que ele oferece (que são lidos das variáveis definidas no vars). Ele cria uma autoridade certificadora que valida certificados e emite certificados com permissão de conectar no servidor. NUNCA apague o arquivo gerado pelo script. Se o fizer, todos os certificados já emitidos não terão permissão para conectar no servidor novamente e você vai precisar emitir todos novamente.

Agora já temos uma autoridade certificadora. Vamos gerar o certificado do servidor e dos clientes.

Para gerar o certificado do servidor:

# ./build-key-server servidor

Lembre-se de substituir “servidor” pelo nome do seu servidor. Aceite todos os padrões, mas em “Common name” coloque o nome do seu servidor. Logo após, ele oferece incluir uma senha no certificado. Pode deixar isso em branco. Dessa parte em diante, quando o script te fizer perguntas, sempre responda afirmativamente com “y”.

Para gerar os certificados para os clientes execute o script build-key:

# ./build-key cliente01

Serão feitas todas as perguntas que foram feitas quando você executou o build-key-server. Responda todas adequadamente e lembre-se de responder com “y” as últimas duas perguntas ou o certificado não será adicionado ao BD de certificados válidos. Lembre-se de trocar “cliente01″ pelo nome que você quer que o arquivo do certificado tenha.

Para revogar um certificado e fazer com que ele não consiga mais se conectar ao servidor faça o seguinte:

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

Para completar a operação, é necessário reiniciar o OpenVPN. Lembrando que isso só é necessário quando você quiser evitar que um determinado certificado consiga se conectar ao servidor.

Depois, gere a chave DH que permite que o cliente e servidor envolvidos na conexão troquem certificados de forma segura e cifrada, confirmando suas identidades:

# ./build-dh

Este script também demora um pouco, dependendo do equipamento onde você está executando. Todos os certificados são criados em /etc/openvpn/keys, se você não tiver modificado o padrão do script vars, editado anteriormente. Dentro deste diretório, pode ser que você encontre arquivos com a extensão .csr. Todos eles podem ser removidos pois são apenas requisições de certificados.

Criando a bridge no servidor

Antes de mais nada, é preciso instalar o pacote bridge-utils para que você consiga trabalhar com bridges no Linux. Para isso:

# yum install bridge-utils

No site do OpenVPN você encontra dois scripts muito úteis para configurar a bridge facilmente, um para inicializar a bridge e outro para pará-la. Seguem os scripts, basta copiar e colar em arquivos executáveis no seu servidor:

#!/bin/bash

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define qual o dispositivo da bridge
br=”br0″

# Qual o dispositivo TAP será incluído na bridge
# Para incluir vários:
# tap=”tap0 tap1 tap2″
tap=”tap0″

# Define qual a interface ethernet que entrará na bridge.
# A interface deve ser a que se conecta à rede interna.
eth=”eth0″
eth_ip=”192.168.8.4″
eth_netmask=”255.255.255.0″
eth_broadcast=”192.168.8.255″

# Não precisa editar mais nada!

for t in $tap; do
openvpn –mktun –dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
brctl addif $br $t
done

for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done

ifconfig $eth 0.0.0.0 promisc up

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

Para parar a bridge:

#!/bin/bash

####################################
# Tear Down Ethernet bridge on Linux
####################################

# Interface da bridge
br=”br0″

# Interface TAP utilizada pelo OpenVPN
tap=”tap0″

ifconfig $br down
brctl delbr $br

for t in $tap; do
openvpn –rmtun –dev $t
done

Para inicializar a bridge, entre no diretório onde você criou o script que inicializa a bridge e:

# chmod +x bridge-start.sh
# ./bridge-start.sh

Para pará-la:

# ./bridge-stop.sh

Para automatizar este processo e inicializar a bridge sempre que o OpenVPN for inicializado, adicione as duas linhas no final do arquivo de configuração da sua VPN:

up /etc/openvpn/vol-vpn/bridge-start.sh
down /etc/openvpn/vol-vpn/bridge-stop.sh

A primeira linha inicializa a bridge junto com o OpenVPN, a segunda para. Lembre-se que quando o seu sistema é configurado como bridge, ele perde o IP e fica inacessível pela rede. Para conseguir administrar seu servidor remotamente, pare a VPN ou coloque mais uma placa de rede que não participe da VPN apenas para conectar no servidor pelo SSH.

Configuração dos clientes

Agora o servidor está pronto para receber conexões e autenticar certificados. Vamos passar à configuração do OpenVPN no cliente.

Primeiro, faça o download e instalação do OpenVPN GUI (openvpn-2.0.9-gui-1.0.3-install.exe). Este arquivo já instala o OpenVPN e a interface gráfica do sistema. O diretório padrão de instalação é o C:\Arquivos de programas\OpenVPN. Vou sempre me referir a este diretório no tutorial. Se você modificar o padrão, faça as devidas substituições.

Primeiramente, vamos passar todos os arquivos de certificados para o cliente. Lembre-se de fazer isso sempre da forma mais segura possível pois se alguém for capaz de interceptar a transmissão e conseguir fazer uma cópia destes arquivos, ele poderá se conectar ao servidor e ter acesso a toda a sua rede interna.

Os arquivos devem ser colocados em C:\Arquivos de Programas\OpenVPN\config. Este diretório deve conter os arquivos ca.crt, dh1024.pem e o certificado do cliente (arquivos com as extensões .crt e .key). Além disso, também é necessário o arquivo de configuração do OpenVPN cliente. O nome não importa, mas é bom deixar a extensão dele como .ovpn. Para criar este arquivo, abra o Bloco de notas e insira o seguinte conteúdo:

Arquivo vol-vpn-client.ovpn:

# endereço do servidor. também pode ser um nome como
# srvopenvpn.empresa.com.br
remote 10.0.0.1

# define qual o protocolo a ser utilizado
proto udp

# porta na qual a conexão será realizada
# no servidor
prot 1194

# define que o OpenVPN neste computador
# deve atuar como um cliente
client

# fala para o OpenVPN aceitar as configurações
# que o servidor enviar
pull

# define o dispositivo que será utilizado
# aqui também: tap para bridge e tun para vpn’s
# roteadas.
dev tap

# compressão de dados para otimizar a conexão
comp-lzo

# verifica se a outra ponta está ativa
keepalive 10 120

# define que seremos o cliente no
# handshake tls
tls-client

# onde estão os certificados. lembre-se sempre
# de que você deve colocar o caminho entre aspas
# duplas e com \\ separando os diretórios.
dh “C:\\Arquivos de Programas\\OpenVPN\\config\\dh1024.pem”
ca “C:\\Arquivos de Programas\\OpenVPN\\config\\ca.crt”
cert “C:\\Arquivos de Programas\\OpenVPN\\config\\cliente01.crt”
key “C:\\Arquivos de Programas\\OpenVPN\\config\\cliente01.key”

Pronto. O cliente também já está configurado e pronto para fazer a conexão com o servidor.

Testando a conexão

Primeiro temos que ativar o OpenVPN no servidor. Para isso:

# openvpn –config /etc/openvpn/vol-vpn/vol-vpn.conf &

Se o arquivo de configuração estiver OK, o servidor estará ativo e esperando conexões na porta 1194.

Para fazer o cliente se conectar ao servidor, localize o ícone do OpenVPN GUI que fica perto do relógio do Windows e dê dois cliques nele. Se todo o processo for OK, uma mensagem dizendo que a conexão foi estabelecida sem problemas será mostrada. Como estamos utilizando certificados para a autenticação, nenhuma senha será pedida para o usuário. Quando ele terminar, basta clicar com o botão direito no ícone do OpenVPN GUI e selecionar “Disconnect”. À prova de gerentes que não sabem nem abrir o Bloco de notas direito! E melhor ainda: bem seguro! :)

Liberando a exceção no firewall

Para liberar a conexão no seu firewall você deve liberar o tráfego de INPUT/OUTPUT para as interfaces tap do seu sistema. Uma regra parecida com essa deve resolver:

# iptables -A INPUT -i tap+ -j ACCEPT
# iptables -A FORWARD -i tap+ -j ACCEPT

Como você não saberá o IP do cliente de antemão, não dá pra fazer uma regra mais específica. Por isso é sempre bom garantir a segurança do cliente e, caso ele seja roubado, revogar os certificados imediatamente para que ninguém não autorizado não consiga fazer conexões ao seu servidor.

Considerações finais

Por mais seguro que o OpenVPN seja, ele abre uma brecha muito grande na sua rede: ele permite que pessoas possam se conectar remotamente à sua rede e ter acesso à tudo o que está dentro dela. Isso inclui servidores, clientes e claro, dados secretos. Dados que se caírem nas mãos de pessoas erradas, podem gerar sérios prejuízos à sua empresa. Por isso sempre tome cuidado:

  • Atualize sua distribuição antes de começar todo o processo descrito neste artigo
  • Tenha certeza de sempre utilizar os softwares mais novos
  • Cuide muito bem da configuração do seu firewall
  • Cuide melhor ainda dos computadores clientes. Lembre-se que são operados por pessoas que não conhecem tecnologia muito bem. Por isso, periodicamente verifique os computadores por vírus, trojans, configurações inadequadas de firewall etc.
  • Revogue imediatamente certificados que não são utilizados ou que “vazaram”. Assim, pessoas não autorizadas não conseguirão se conectar.
  • Execute o OpenVPN com um usuário de poucos privilégios, NUNCA, EM NENHUMA CIRCUNSTÂNCIA, COMO ROOT. Se possível, utilize chroot na configuração. Embora isso não seja abordado aqui, a configuração não é muito complicada e com certeza vale a pena.

Para mais informações, tutoriais e mini-howtos completos visite o www.openvpn.net. Lá você vai encontrar tudo o que precisa para resolver as suas dúvidas. Se quiser também pode deixar seu comentário! :)

Compartilhe o post! These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Webnews
  • Digg
  • del.icio.us
  • StumbleUpon
  • Reddit
  • Ask
  • Bloglines
  • email
  • Facebook
  • Furl
  • Google Bookmarks
  • LinkedIn
  • Live-MSN
  • Pownce
  • Print
  • Rec6
  • Slashdot
  • Technorati
  • TwitThis

Posts relacionados:

  • Configurando bridges no CentOS Uma bridge nada mais é que um dispositivo que interliga...
  • Como instalar o Easy Peasy no seu netbook Há alguns anos atrás eu comprei um EEE PC 701....
  • Como utilizar o RPMForge no CentOS Há alguns meses, venho utilizando a distribuição CentOS. Gosto muito...