sábado, 11 de julho de 2015

VPN: Criar chave para cliente android e configuração

0. Introdução

As vantagens na utilização de um servidor VPN têm duas vertentes essenciais:
  • Aumentar a segurança na utilização de redes inseguras (redes wireless avulsas ou sem encriptação)
  • Ligar a uma rede local remota
O primeiro aspeto é essencial nos dias que correm pois grande parte dos equipamentos de lazer (centros comerciais, cafés, restaurantes, parques, etc) possuem redes sem fios gratuitas e/ou de fácil ligação e com muitos utilizadores em simultâneo.
A utilização de uma ligação VPN nestes cenários aumenta muito o nível de segurança da nossa navegação.

O segundo aspeto permite que o nosso dispositivo esteja "fisicamente" ligado à rede remota. Muito útil no caso de aplicações de ISP que apenas funcionam dentro da rede local de cada cliente (por exemplo, aplicações para visualização da emissão de TV e afins).
Desta forma, com acesso à Internet e ativando a ligação VPN é possível navegar a partir de qualquer lugar como se estivéssemos na rede local do servidor VPN e, assim, utilizar as referidas aplicações como se estivéssemos fisicamente na rede local.

1. Requisitos

1. Acesso a um servidor VPN.
2. Instalação da aplicação OpenVPN Connect no dispositivo cliente, designado de tabuleta

O teste foi feito com um sistema Android 4.x, mas existem diversas instruções para outros dispositivos ([1] ver Step 5 - Installing the Client Profile).
Para equipamentos Android de versões 2.x é necessário acesso root ao equipamento [2].

2. Criação de Certificados, Chaves e afins

Para cada dispositivo cliente é necessário criar um conjunto de ficheiros que permitem encriptar a ligação de forma muito segura.

Assim, acedendo ao servidor VPN, basta utilizar:
cd /etc/openvpn/easy-rsa/
./build-key tabuleta

Serão perguntadas diversas questões que para utilização normal podem ser confirmadas todas com ENTER e no final com dois 'y' para confirmação.

Este processo cria vários ficheiros na pasta /etc/openvpn/easy-rsa/keys, nomeadamente: tabuleta.crt e tabuleta.key.

3. Criação de um Perfil para o OpenVPN Connect

A criação de um perfil permite combinar num único ficheiro todos elementos necessários para a configuração de um cliente VPN.

1. Copiar o exemplo base de perfil:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/tabuleta.ovpn

2. Editar o perfil tablet.ovpn:
nano /etc/openvpn/easy-rsa/keys/tabuleta.ovpn

3. Alterar a linha remote my-server-1 1194 para ter o domínio do servidor, por exemplo qualquercoisa.no-ip.org:
remote qualquercoisa.no-ip.org 1194

4. Se o cliente não é Windows, devem descomentar-se as linhas:
user nobody
group nogroup

5. Deve comentar-se depois as linhas que fazem referência aos certificados e chaves:
#ca ca.crt
#cert client.crt
#key client.key

6. De seguida é possível acrescentar e copiar/colar de forma a que o ficheiro tabuleta.ovpn fique:
(conteúdo existente)
<ca>
(colar conteúdo do ca.crt)
</ca>
<cert>
(colar conteúdo do tabuleta.crt)
</cert>
<key>
(colar conteúdo do tabuleta.key)
</key>

Para auxiliar a este processo criei um bash script que está disponível aqui [3].

7. Copiar o perfil tabuleta.ovpn de forma segura para o cliente.

4. Configuração do OpenVPN Connect no cliente

Para que um dispositivo se possa ligar ao servidor VPN necessita ter um cliente instalado e configurado. Neste caso o dispositivo tabuleta é um equipamento Android 4.x.

1. Instalar a aplicação OpenPVN Connect [4]

2. Abrir o OpenVPN Connect e importar o perfil copiado anteriormente com a opção:
Import > Import Profile from SD card

3. Selecionar o ficheiro tabuleta.ovpn e posteriormente deverá aparecer o perfil na aplicação

4. Quando estiver com acesso à Internet é possível fazer Connect e todo o tráfego passará pelo servidor VPN.

Este processo está muito bem explicado com diversas capturas de exemplos aqui [1Step 5 - Installing the Client Profile.

Referências

[1] - Página com muita informação sobre criação e configuração do servidor e dos clientes
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04

[2] - Instruções para instalação no GingerBread 2.3
https://my.hostvpn.com/knowledgebase/15/OpenVPN-for-Android-rooted-Gingerbread-23x.html

[3] - Script para criação de um perfil para OpenVPN
http://librehacks.blogspot.pt/2015/07/vpn-script-para-criacao-de-perfis.html

[4] - Aplicação OpenVPN Connect
https://play.google.com/store/apps/details?id=net.openvpn.openvpn

VPN: Script para a criação de perfis OpenVPN

O script seguinte permite criar um perfil para um cliente OpenVPN após serem criados os seus certificados e chaves (./build-key tabuleta).

Deve ser guardado em /etc/openvpn/easy-rsa/keys/mergeKeys.sh

E deve ser invocado a partir dessa localização com o argumento do nome do cliente. Por exemplo:
./mergeKeys.sh tabuleta

Para criar tabuleta.ovpn, a partir de ca.crt, tabuleta.crt e tabuleta.key.

Deve copiar-se o perfil de exemplo OVPN para template.ovpn e configurá-lo de acordo com o servidor.


mergeKeys.sh

#!/bin/bash
# Check for client name
echo -e "Checking for client name... "
if [ $# -eq 0 ]; then
    echo -e "ERROR: No client name provided.\nAborting."
    echo -e "\nYou have to supply the client name for the certificate. eg:\n$0 client1\n"
    exit 1
else
    echo -e "Using $1 to find certificates..."
fi

# Check for client.ovpn
if [ -f "$1.ovpn" ]; then
  echo -e "WARNING: $1.ovpn already exist."
  echo -e "\nAborting."
  exit 1
fi

FILE=template.ovpn
echo -e "Checking for template profile $FILE... "
if [ ! -f $FILE ]; then
  echo -e "ERROR: $FILE not found."
  echo -e "\nAborting."
  exit 1
fi

FILE=ca.crt
echo -e "Checking for $FILE... "
if [ ! -f $FILE ]; then
  echo -e "ERROR: $FILE not found."
  echo -e "\nAborting."
  exit 1
fi

FILE="$1.crt"
echo -e "Checking for $FILE... "
if [ ! -f $FILE ]; then
  echo -e "ERROR: $FILE not found."
  echo -e "\nAborting."
  exit 1
fi

FILE="$1.key"
echo -e "Checking for $FILE... "
if [ ! -f $FILE ]; then
  echo -e "ERROR: $FILE not found."
  echo -e "\nAborting."
  exit 1
fi

# All files exist
echo -e "All files exist.\n"

FILE=client.ovpn
echo "Creating $1.ovpn base file with $FILE..."
cp "$FILE" "$1.ovpn"
if [ ! -f "$1.ovpn" ]; then
  echo -e "ERROR: $1.ovpn couldn't be created. Check permissions."
  echo -e "\nAborting."
  exit 1
fi

FILE=ca.crt
echo "Append $FILE to $1.ovpn..."
echo "<ca>" >> "$1.ovpn"
cat "$FILE" >> "$1.ovpn"
echo "</ca>" >> "$1.ovpn"

FILE="$1.crt"
echo "Append $FILE to $1.ovpn..."
echo "<cert>" >> "$1.ovpn"
cat "$FILE" >> "$1.ovpn"
echo "</cert>" >> "$1.ovpn"

FILE="$1.key"
echo "Append $FILE to $1.ovpn..."
echo "<key>" >> "$1.ovpn"
cat "$FILE" >> "$1.ovpn"
echo "</key>" >> "$1.ovpn"

echo -e "Done.\n"