Gestionar un servidor VPN para un volumen considerable de usuarios (por ejemplo, más de 70 personas) requiere un enfoque automatizado para la generación de claves y certificados. Realizar este proceso de forma manual no solo consume tiempo, sino que aumenta el riesgo de errores humanos. Para solucionar esto, podemos emplear una combinación de scripts en Bash y la herramienta expect para automatizar las interacciones en la terminal.
Preparación del entorno
El primer paso es asegurarse de tener instalada la utilidad expect, la cual permite programar diálogos interactivos en la shell. En sistemas basados en RHEL o CentOS, se instala con el siguiente comando:
yum install expect
Definición de credenciales
Para este flujo de trabajo, utilizaremos un archivo de texto llamado lista_usuarios.txt que contendrá el nombre de usuario y su respectiva contraseña aleatoria. Un ejemplo del formato sería:
usuario01 Pass_9123!
usuario02 Secret_4412$
usuario03 Key_8821#
Automatización del flujo de Easy-RSA
Dividiremos la lógica en tres scripts principales para mantener la modularidad y facilitar el mantenimiento.
1. Script de procesamiento de PKI (generar_pki.sh)
Este script ejecuta los comandos básicos de easy-rsa para inicializar la solicitud y firmar el certificado. No se debe ejecutar directamente de forma masiva, ya que requiere entradas de teclado que el script de Expect manejará.
#!/bin/bash
# Script: generar_pki.sh
ID_USUARIO=$1
DIR_TRABAJO="/etc/openvpn/clientes/${ID_USUARIO}"
RSA_PATH="/usr/share/easy-rsa/3"
echo "Procesando certificados para: ${ID_USUARIO}"
mkdir -p ${DIR_TRABAJO}
cd ${DIR_TRABAJO}
# Inicializar y generar solicitud
${RSA_PATH}/easyrsa init-pki
${RSA_PATH}/easyrsa gen-req ${ID_USUARIO}
# Importar y firmar la solicitud en el directorio principal de la CA
cd ${RSA_PATH}
./easyrsa import-req ${DIR_TRABAJO}/pki/reqs/${ID_USUARIO}.req ${ID_USUARIO}
./easyrsa sign-req client ${ID_USUARIO}
# Organizar archivos finales
DESTINO_FINAL="/opt/openvpn/certificados/${ID_USUARIO}"
mkdir -p ${DESTINO_FINAL}
cp ${RSA_PATH}/pki/ca.crt ${DESTINO_FINAL}/
cp ${RSA_PATH}/pki/issued/${ID_USUARIO}.crt ${DESTINO_FINAL}/
cp ${DIR_TRABAJO}/pki/private/${ID_USUARIO}.key ${DESTINO_FINAL}/
2. Script de interacción automática (automatizar_pki.exp)
Este componente utiliza expect para suministrar las contraseñas y confirmaciones que solicita Easy-RSA durante la ejecución del script anterior.
#!/usr/bin/expect
# Script: automatizar_pki.exp
set alias [lindex $argv 0]
set clave_usuario [lindex $argv 1]
set clave_ca "CONTRASEÑA_MAESTRA_CA"
spawn bash /root/scripts/generar_pki.sh $alias
set timeout 20
expect {
"PEM pass phrase" { send "$clave_usuario\r"; exp_continue }
"Verifying - Enter PEM pass" { send "$clave_usuario\r"; exp_continue }
"Common Name" { send "$alias\r"; exp_continue }
"Confirm request details" { send "yes\r"; exp_continue }
"Enter pass phrase for" { send "$clave_ca\r" }
}
expect eof
3. Script de ejecución por lotes (ejecutar_lote.sh)
Finalmente, este script lee el archivo lista_usuarios.txt y ejecuta el proceso de automatización para cada entrada.
#!/bin/bash
# Script: ejecutar_lote.sh
ARCHIVO_CRED="lista_usuarios.txt"
while read -r nombre pass; do
if [ -n "$nombre" ]; then
expect automatizar_pki.exp "$nombre" "$pass"
echo "Finalizado: $nombre"
fi
done < "$ARCHIVO_CRED"
Gestión de revocaciones
En caso de necesitar dar de baja un acceso, se recomienda realizar el proceso de revocación de forma manual para asegurar la integridad de la lista de revocación de certificados (CRL). Los comandos básicos dentro del directorio de Easy-RSA son:
cd /usr/share/easy-rsa/3
./easyrsa revoke nombre_usuario
# Confirmar con 'yes' y la contraseña de la CA
./easyrsa gen-crl
# Limpiar directorios asociados
rm -rf /etc/openvpn/clientes/nombre_usuario
rm -rf /opt/openvpn/certificados/nombre_usuario