- Ambiente de instalação
- OpenVPN 2.3.11 x86_64
- Easy-RSA 3.0.0
- Distribuição Slackware 14.2 64
Download Easy-rsa
PKI Infraestrutura de chave pública (Public Key Infracstruture)
A PKI pode ser criada em qualquer computador com a VPN instalada. Uma maneira fácil de criá-la é utilizando os scripts easy-rsa. Faça o download:
# Shell
cd /etc/openvpn/ git clone git://github.com/OpenVPN/easy-rsa
Variáveis
Antes de começar, é importante alterar algumas variáveis padrões utilizadas pelos scripts para manter os dados consistentes durante a execução dos próximos comandos. Para alterar as variáveis faça uma cópia do arquivo de exemplo vars.exemple dentro do diretório /etc/openvpn/easy-rsa/easyrsa3/ para somente vars.
# Shell
cd /etc/openvpn/easy-rsa/easyrsa3/ cp vars.example vars vi vars
/etc/openvpn/easy-rsa/easyrsa3/vars
# Expiração dos certificados em dias. O valor padrão são 10 anos (3650), para aumentar para 100 anos por exemplo, altere o valor para 36500 set_var EASYRSA_CA_EXPIRE 36500 set_var EASYRSA_CERT_EXPIRE 36500 # Exemplo das outras variáveis alteradas set_var EASYRSA_REQ_COUNTRY "BR" # Pais set_var EASYRSA_REQ_PROVINCE "Sao Paulo" # Estado set_var EASYRSA_REQ_CITY "Sao Paulo" # Cidade set_var EASYRSA_REQ_ORG "Minha empresa LTDA" # Empresa set_var EASYRSA_REQ_EMAIL "emaildesuporte@minhaempresa.com.br" # E-mail set_var EASYRSA_REQ_OU "Matriz" # Unidade
As outras variáveis só devem ser alteradas com conhecimento prévio de suas funções.
Iniciando uma nova PKI
Inicie uma nova configuração com o comando easyrsa init-pki.
Cuidado! Este comando remove todos os certificados criados anteriormente. Só utilize quando estiver começando uma nova configuração ou se quiser reconfigurar todo o sistema.
# Shell
cd /etc/openvpn/easy-rsa/easyrsa3/
./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/easyrsa3/pki
Criando certificado CA
CA Autoridade de Certificação (Certificate Authority).
Será solicitada uma palavra-chave PEM, digite, confirme e depois digite um nome para o servidor. Neste artigo está sendo usado o nome server1, mas você pode escolher qualquer nome.
# Shell
./easyrsa build-ca Note: using Easy-RSA configuration from: ./vars Generating a 2048 bit RSA private key ........+++ .................................................................+++ writing new private key to '/etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key.XXXXthIDrO' Enter PEM pass phrase: # digite uma palavra-chave e memorize à Verifying - Enter PEM pass phrase: # repita a palavra-chave ----- 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. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: server1 # nome do servidor CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
Gerando a keypair e a request
No servidor estes arquivos normalmente são criados sem criptografia utilizando o parâmetro nopass o que remove a necessidade de digitar uma senha para inicializar o serviço. Digitar a senha pode ser inconveniente em um servidor que precise ser reiniciado remotamente ou que não tenha um teclado de fácil acesso. Como a chave não será criptografada proteja cuidadosamente o acesso e as permissões.
Será necessário confirmar o nome do servidor durante o processo.
# Shell
./easyrsa gen-req server1 nopass Note: using Easy-RSA configuration from: ./vars Generating a 2048 bit RSA private key .................................+++ ................................+++ writing new private key to '/etc/openvpn/easy-rsa/easyrsa3/pki/private/fattony.key.XXXXDSn1mu' ----- 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. ----- Common Name (eg: your user, host, or server name) [server1]: # confirme o nome do servidor Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/easyrsa3/pki/reqs/server1.req # request key: /etc/openvpn/easy-rsa/easyrsa3/pki/private/server1.key # keypair
Caso utilize a palavra-chave para criptografar o certificado será necessário digitá-la para iniciar o serviço. Mas a frente será demonstrado como ler esta chave a partir de um arquivo texto.
# Shell
# Para utilizar a palavra-chave execute o comando sem o "nopass"
./easyrsa gen-req server1
Assinando a request
# Shell
./easyrsa sign-req server server1 Note: using Easy-RSA configuration from: ./vars You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 36500 days: subject= commonName = server1 Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes # Digite yes Using configuration from /etc/openvpn/easy-rsa/easyrsa3/openssl-1.0.cnf Enter pass phrase for /etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key: # digite a palavra-chave criada anteriormente no comando ./easyrsa build-ca Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'fattony' Certificate is to be certified until Sep 18 20:06:10 2116 GMT (36500 days) Write out database with 1 new entries Data Base Updated Certificate created at: /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server1.crt
Gerando parâmetros Diffie-Hellman (DH)
DH Diffie-Hellman.
Gera o arquivo de parâmetros .pem necessário para o servidor.
# Shell
cd /etc/openvpn/certs/
openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.............................+..................................
..+..................................+................+.........
................................................................
.............................................................+..
................................................................
................................................................
...........................................+........+...........
Gerando secret HMAC
HMAC Hash-based Message Authentication Code
# Shell
cd /etc/openvpn/keys/ /usr/sbin/openvpn --genkey --secret ta.key
Configurando o servidor
Copie os seguintes arquivos gerados pelos scripts easy-rsa para os respectivos diretórios dentro de /etc/openvpn/:
# Shell
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server1.crt /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server1.key /etc/openvpn/keys/
Copie o arquivo de exemplo server.conf a partir do diretório de configuração do source do openvpn. O source do openvpn pode ser encontrado no DVD de instalação do Slackware ou em seu mirror favorito do Slackware ou ainda a partir de http://openvpn.net. No exemplo a seguir o download do source é efetuado a partir do ftp.slackware.com:
# Shell
cd /usr/local/src/ wget -c ftp://ftp.slackware.com/pub/slackware/slackware/source/n/openvpn/openvpn-*.tar.?z tar xvf openvpn-*.tar.?z # Copie o arquivo server.conf para o diretório dos arquivos configuração do openvpn cp openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/ # Crie o diretório ccd em /etc/openvpn/ para armazenar as configurações específicas de cada cliente: mkdir /etc/openvpn/ccd
Abaixo um exemplo comentado das configurações do servidor server.conf, as opções devem ser alteradas conforme a necessidade:
/etc/openvpn/server.conf
####################################### # Exemplo de configuração OpenVPN 2.0 # # para um servidor multi-client. # ####################################### local x.x.x.x # IP do servidor port 1194 # Porta proto tcp # Protocolo dev tun # tun(routed tunnet) ou tap (ethernet tunnel) ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/server1.crt key /etc/openvpn/keys/server1.key # Este arquivo é secreto dh /etc/openvpn/certs/dh2048.pem tls-auth /etc/openvpn/keys/ta.key 0 # Este arquivo é secreto # Subrede da VPN server 10.8.0.0 255.255.255.0 # Sobe rotas no cliente para permitir que ele acesse outras redes atrás do servidor push "route 10.128.248.0 255.255.255.0" # Indica o diretório de configuração dos clientes, supondo que o certificado do cliente foi nomeado cliente1, criando um arquivo com este nome dentro do diretório ccd é possível definir configurações específicas como um ip fixo através da linha: ifconfig-push 10.8.0.10 10.128.255.1 client-config-dir /etc/openvpn/ccd # Pinga a cada 10 segundos e define que o cliente esta offline depois de 120 segundos keepalive 10 120 # Define a criptografia e a autenticação. Estas configurações também devem estar presentes no cliente cipher AES-256-CBC auth sha1 # Reduz os privilégios do daemon do openvpn depois da inicialização user nobody group nobody # localização dos arquivos de log status /var/log/openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log # As opções persists tentam evitar acessar certos recursos no restart que podem não estar acessíveis devido a redução de privilégios persist-key persist-tun comp-lzo # Habilita compressão, obrigatório configurar no cliente verb 3 # Nível de informação do log mute 20 # Interrompe exibição após a mesma mensagem repetir 20 vezes max-clients 1000 # número máximo de clientes daemon # Executa o openvpn como daemon
Crie o arquivo rc.openvpn dentro do diretório /etc/rc.d/ com o conteúdo abaixo.
/etc/rc.d/rc.openvpn
#!/bin/sh
#
# /etc/rc.d/rc.openvpn
#
# Start/stop/restart the openvpn server.
#
ovpn_start() {
if [ -x /usr/sbin/openvpn -a -r /etc/openvpn/server.conf ]; then
echo "Starting OpenVPN: /usr/sbin/openvpn server.conf"
/usr/sbin/openvpn /etc/openvpn/server.conf
fi
}
ovpn_stop() {
killall openvpn
}
ovpn_restart() {
ovpn_stop
sleep 2
ovpn_start
}
case "$1" in
'start')
ovpn_start
;;
'stop')
ovpn_stop
;;
'restart')
ovpn_restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
De permissão de execução ao script:
# Shell
chmod 755 /etc/rc.d/rc.openvpn
Inicie o serviço e verifique o log para saber se houve algum problema com a configuração
# Shell
/etc/rc.d/rc.openvpn start cat /var/log/openvpn.log
Para iniciar o OpenVPN durante o boot é necessário adicionar uma entrada no arquivo /etc/rc.d/rc.local como a abaixo:
/etc/rc.d/rc.local
# Inicia o serviço OpenVPN
if [ -x /etc/rc.d/rc.openvpn ]; then
/etc/rc.d/rc.openvpn start
fi
Caso você tenha gerado a requisição utilizando a palavra-chave PEM(comando: ./easyrsa gen-req server1), toda vez que você iniciar o serviço terá que digitar esta palavra-chave, o que não é desejável em um servidor que na maioria das vezes não irá possuir nem um teclado ou um monitor conectado a ele. A alternativa é armazená-la em um arquivo seguro e indicar no arquivo de configuração do servidor para ler este arquivo ao em vez de solicitar a palavra-chave. Vamos armazenar a palavra-chave em /root/password.ovpn, basta digitá-la dentro deste arquivo.
Depois restrinja o acesso ao arquivo:
# Shell
chmod 600 /root/password.ovpn
Edite o arquivo server.conf e adicione as seguintes linhas:
/etc/openvpn/server.conf
askpass /root/password.ovpn auth-nocache
Esta configuração também pode ser feita no cliente.
Se tudo correu bem o serviço deve ter ficado ativo após o comando /etc/rc.d/rc.openvpn start. Caso o serviço não inicialize por algum motivo você poderá descobri-lo explorando o arquivo de log: /var/log/openvpn.log.
Para este artigo não ficar muito longo, a configuração do cliente foi descrita em outro artigo: Configuração do OpenVPN Cliente e Easy-RSA 3 no Slackware.