Probado sobre Debian 6.0, con soporte auth ldap. Por favor revisad bien cada paso, porque hace ya más de una semana que lo hice y seguro que me falta más de un detalle en el manual. Al grano:
[bash]
sudo apt-get install openvpn openvpn-auth-ldap
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
vi vars # cambiamos el valor de KEY_SIZE para añadir más seguridad: export KEY_SIZE=4096
. ./vars
./clean-all
./build-ca
./build-key-server server
./build-dh # will take a very loooooong time
openvpn –genkey –secret ta.key
mv ta.key keys
echo «net.ipv4.ip_forward=1» >> /etc/sysctl.conf
sysctl -p
[/bash]
Hasta aquí, hemos instalado el software y generado los certificados del server.
Ahora un poco de config del servicio:
[bash]
cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gunzip server.conf.gz
vi server.conf
[/bash]
Estamos editando el server.conf. Yo en mi caso cambié los siguientes settings. A gusto del consumidor:
[bash]
plugin /usr/lib/openvpn/openvpn-auth-ldap.so «/etc/openvpn/auth-ldap.conf»
crl-verify crl.pem
script-security 2
client-connect myScripts/client-connect.sh
client-disconnect myScripts/client-disconnect.sh
port 1194
proto udp
dev tun
ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/server.crt
dh easy-rsa/keys/dh4096.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push «route 10.XX.YY.ZZ 255.255.255.128»
push «route 10.SS.YY.ZZ 255.255.255.0»
push «dhcp-option DNS 10.XX.YY.ZZ»
push «dhcp-option DOMAIN mydomain.com»
keepalive 10 120
comp-lzo
max-clients 100
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
[/bash]
Para ahorrarme tiempo, me he creado un script para generar los certificados de usuario cuando me haga falta. Este script es /etc/openvpn/genCertificate.sh
[bash]
#!/bin/bash
[[ «X»$1 == «X» ]] && echo «Please provide only an username (ex: miguel)» && exit 1
cd /etc/openvpn/easy-rsa
. ./vars
echo -n «Do you want to protect your key private file with a password? [y/N] »
read protect
[[ «X»$protect == «Xy» || «X»$protect == «XY» ]] && ./build-key-pass client-$1 || ./build-key client-$1
echo
echo «*** Done. Please check for errors above ***»
echo
rm -rf /etc/openvpn/tmp >/dev/null 2>&1
mkdir /etc/openvpn/tmp
cp keys/client-$1.crt keys/client-$1.key keys/ta.key keys/ca.crt /etc/openvpn/tmp
cd –
echo «Files copied to /etc/openvpn/tmp»
[/bash]
El fichero /etc/openvpn/auth-ldap.conf lo tenemos que adaptar a nuestras necesidades, así como el client.conf que necesita el cliente (hay un ejemplo en /usr/share/doc/openvpn/examples/sample-config-files/client.conf)
Los scripts de conexión/desconexión para llevar un control de sesiones son:
[bash]
cat /etc/openvpn/myScripts/client-connect.sh
#!/bin/bash
LOGFILE=/var/log/openvpn/sessions.raw
LOGFILEPARSED=/var/log/openvpn/sessions.log
printf «%-15s%-30s%-30s%-13s%-13s\n» $username `date +%Y/%m/%d-%a-%H:%M:%S` — $ifconfig_pool_remote_ip $untrusted_ip >> $LOGFILE
printf «%-15s%-30s%-30s%-13s%-13s\n» $username `date +%Y/%m/%d-%a-%H:%M:%S` — $ifconfig_pool_remote_ip $untrusted_ip >> $LOGFILEPARSED
[/bash]
[bash]
cat /etc/openvpn/myScripts/client-disconnect.sh
#!/bin/bash
LOGFILE=/var/log/openvpn/sessions.raw
LOGFILEPARSED=/var/log/openvpn/sessions.log
printf «%-15s%-30s%-30s%-13s%-13s\n» $username — `date +%Y/%m/%d-%a-%H:%M:%S` $ifconfig_pool_remote_ip $untrusted_ip >> $LOGFILE
ev=»cat $LOGFILEPARSED | awk ‘{if (\$5 == \»$untrusted_ip\» && \$3 == \»–\» && \$1 == \»$username\» && \$4 == \»$ifconfig_pool_remote_ip\») {\$3=\»`date +%Y/%m/%d-%a-%H:%M:%S`\»}; printf \»%-15s%-30s%-30s%-13s%-13s\\n\»,\$1,\$2,\$3,\$4,\$5}'»
eval $ev > /tmp/gua
mv /tmp/gua $LOGFILEPARSED
[/bash]
También me he creado un script para revocar certificados:
[bash]
cat /etc/openvpn/revCertificate.sh
#!/bin/bash
[[ «X»$1 == «X» ]] && echo «Please provide only an username (ex: miguel)» && exit 1
cd /etc/openvpn/easy-rsa
. ./vars
./revoke-full client-$1
cp /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn
cd –
echo «Done. Please check for errors (error 23 is normal)»
echo
[/bash]
Y el logrotate correspondiente:
[bash]
cat /etc/logrotate.d/openvpn
notifempty
compress
create
missingok
/var/log/openvpn/openvpn.log {
weekly
rotate 10
copytruncate
}
/var/log/openvpn/sessions.log
/var/log/openvpn/sessions.raw
{
size 50k
rotate 5
}
[/bash]
A veces es posible que necesitéis un archivo .p12, según el software que usáis (aunque no es lo normal):
[bash]
openssl pkcs12 -export -in miguel.crt -inkey miguel.key -certfile mycert.crt -name OpenVPN-miguel -out client-miguel.p12
[/bash]
Si el cliente es IOS, el archivo de config debe llevar embebido todos los certificados y keys:
[bash]
FILENAME=client.ios.ovpn
USERNAME=miguel
cat client.conf | sed s/^ca/\;ca/g | sed s/^cert/\;cert/g | sed s/^key/\;key/g | sed s/^tls-auth/\;tls-auth/g > $FILENAME
echo «» >> $FILENAME
openssl x509 -in mycert.crt >> $FILENAME
echo «» >> $FILENAME
echo «key-direction 1» >> $FILENAME
echo «» >> $FILENAME
cat ta.key >> $FILENAME
echo «» >> $FILENAME
echo «» >> $FILENAME
openssl x509 -in client-$USERNAME.crt >> $FILENAME
echo «» >> $FILENAME
echo «» >> $FILENAME
cat client-$USERNAME.key >> $FILENAME
echo «» >> $FILENAME
[/bash]