Estoy ejecutando OpenVPN 2.3.2 (todavía soy un novato en esto) en una máquina con servidor Ubuntu 14.04. Quiero poder deshabilitar/reactivar clientes que se conectan a mi servidor OpenVPN.
Seguíesteguía para revocar el certificado de un cliente, pero parece que este movimiento es irreversible. Además, si revoco el certificado de un cliente y el cliente ya está conectado, la conexión no parece detenerse. Quiero que la conexión se detenga inmediatamente.
¿Existe alguna manera sencilla de deshabilitar y volver a habilitar clientes?
Mi archivo server.conf:
# OpenVPN server configuration file
dev tun
proto udp
port 1194
server 10.8.0.0 255.255.255.0
ca /usr/share/easy-rsa/keys/ca.crt
cert /usr/share/easy-rsa/keys/vpnserver.crt
key /usr/share/easy-rsa/keys/vpnserver.key
dh /usr/share/easy-rsa/keys/dh2048.pem
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1"
comp-lzo
keepalive 10 60
persist-tun
persist-key
user panos
group panos
log-append /var/log/openvpn.log
verb 3
# crl-verify keys/crl.pem
La última línea es para la guía anterior.
Gracias.
Respuesta1
Implementé una solución similar a la de Davidgo. Desafortunadamente me enfrenté a un error de openssl similar aeste error, y me tomó mucho tiempo encontrar una solución para esto.
Finalmente escribí dos scripts para revocar y anular la revocación de certificados de cliente:
revocar.sh:
#!/bin/bash
keys_index_file=/usr/share/easy-rsa/keys/index.txt
fileline="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $fileline | awk -F' ' '{print NF;}')"
if [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
source /usr/share/easy-rsa/vars
/usr/share/easy-rsa/revoke-full $1
{
sleep 3
echo kill $1
sleep 3
echo exit
} | telnet localhost 7505
echo "Client certificate revoked successfully."
exit 0;
elif [[ $columns_number -eq 6 ]] && [[ $fileline == R* ]]; then
echo "Client certificate is already revoked."
exit 0;
else
echo "Error; key index file may be corrupted."
exit 1;
fi
unrevoke.sh:
#!/bin/bash
keys_index_file=/usr/share/easy-rsa/keys/index.txt
linenumber="$(grep -n "/CN=$1/" $keys_index_file | cut -f1 -d:)"
fileline="$(grep -n "/CN=$1/" $keys_index_file)"
line="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /usr/share/easy-rsa; source ./vars; openssl ca -gencrl -out "keys/crl.pem" -config "$KEY_CONFIG"
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Tenga en cuenta que el revoke.sh
script también abre unconexión telnetcon openVPN y expulsa al cliente para ser revocado.
Respuesta2
La respuesta de Panos fue correcta hace 5 años. Así que merece un visto bueno. Sin embargo, desde entonces, lo que sucedió es que el directorio vars se movió/eliminó, el directorio /usr/share/easy-rsa ya no parece estar presente y $KEY_CONFIG parece no estar allí o estar acoplado a vars. directorio, que como digo parece que ya no está, al menos en Ubuntu 21.10 (abril de 2022).
Encontré este script enviado a github y me pareció bien, lo ejecuté y funcionó, anuló mi certificado revocado.
#!/bin/bash
set -e
keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /etc/openvpn/server/easy-rsa
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
rm -f /etc/openvpn/server/crl.pem
cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:nogroup /etc/openvpn/server/crl.pem
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Para ejecutar el script, le proporciona el nombre del certificado vpn que ha revocado. Esto será tal como aparece en el archivo index.txt en el directorio /etc/openvpn/server/easy-rsa/pki/ en la línea de comando. Así que copie y pegue esto en un archivo, diga unrevoke.sh y luego ejecute:
chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>
Ahora entiendo los argumentos de por qué no se deben anular los certificados. Pero esto fue una emergencia.
Déjame explicarte las circunstancias:
Soy un desarrollador que trabaja para una startup. No soy administrador de red ni administrador de sistemas, por lo que no soy la mejor persona para preguntar, pero no hay nadie más a quien preguntar, así que la responsabilidad recayó en mí.
Básicamente, lo que sucedió es que necesitábamos mover un equipo remoto y no supervisado de una VPN a otra. A pesar de todas nuestras pruebas en la nueva VPN, nosotros (con esto quiero decir "yo") pasamos por alto el hecho de que el sistema intentaría enviar todo de forma predeterminada a través de la VPN. Incluyendo la transmisión de decenas de gigabytes de datos a través de una conexión 4G.
Naturalmente, después de cambiar, el sistema dejó de responder por completo y no pudimos iniciar sesión a través de ninguna conexión VPN (ni a través de Teamviewer). Después de intentar averiguar por qué, llegué a la conclusión de que era porque estaba intentando transmitir datos a través de Internet hacia sí mismo y eso probablemente nos costaría miles de dólares en facturas.
Para mitigar la situación mientras pensaba en cómo resolver el problema, revoqué el certificado VPN, por lo que al menos el ancho de banda que intenta usar se limita a los intentos de conexión, no a grandes flujos de datos.
El comando que utilicé para revocar el certificado vpn fue:
openvpn-install.sh
Esto viene con la instalación de openvpn y proporciona una forma de revocar un certificado determinado.
En medio de la noche, descubrí que hay una manera de enviar información de enrutamiento más específica desde la configuración del servidor openvpn para detener la transmisión de todo. Así que lo hice y anulé el certificado openvpn revocado.
Efectivamente, después de unos 20 a 30 minutos, el equipo remoto detectó los cambios de VPN y comenzó a calmarse lo suficiente como para que pudiera iniciar sesión y revertir la VPN a la configuración anterior antes de que intentáramos cambiarla y el sistema se recuperara. .
No voy a perder mi trabajo por esto. Pero alguien más en otra empresa podría hacerlo. De todos modos, sólo quería compartir con usted mi experiencia y mi visión de por qué es posible que desee revocar un certificado VPN.
Respuesta3
Deseando encontrar una forma de poder activar/desactivar usuarios de openvpn sin tener que darles otro archivo de configuración *.ovpn, encontré esta página.
Probé la respuesta del Búho y está bien para la primera ronda de revocación/anulación. Pero si desea revocar a un usuario por segunda vez, easy-rsa arrojará un error porque no puede encontrar archivos *.crt, *.key y *.pem válidos para eliminar y mover a /etc/openvpn/easy-rsa/pki. /directorio revocado.
Entonces, la solución es agregar 3 líneas a la respuesta de Owl para copiar los archivos a sus directorios originales. Ellos son:
cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
El script no revocado será:
#!/bin/bash
set -e
keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"
columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number
if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then
column2="$(echo $fileline | awk '{print $2}')"
column4="$(echo $fileline | awk '{print $4}')"
column5="$(echo $fileline | awk '{print $5}')"
column6="$(echo $fileline | awk '{print $6}')"
echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
sed -i "${linenumber}d" $keys_index_file
cd /etc/openvpn/server/easy-rsa
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
rm -f /etc/openvpn/server/crl.pem
cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
# CRL is read with each client connection, when OpenVPN is dropped to nobody
chown nobody:nogroup /etc/openvpn/server/crl.pem
cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
echo "Certificate unrevoked successfully."
exit 0;
elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then
echo "Certificate is already unrevoked and active"
exit 0;
else
echo "Error; Key index file may be corrupted."
exit 1;
fi
Respuesta4
Ignorando la opción iptables (que creo que es técnicamente superior), puedes revocar y restablecer claves privadas modificando el archivo de revocación y recargando openvpn. (Si está utilizando easyRSA, puede editar easyRSA/index.txt. Busque la línea adecuada y cambie el indicador "R" por un indicador "V", elimine la tercera columna). Luego
source ./vars
openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"
Puede recargar el servidor de apertura para que la nueva configuración surta efecto. Esto expulsará a TODOS los clientes, pero deberían volver a conectarse automáticamente y negociar una nueva sesión.
Verhttp://sq4ind.eu/openvpn-revoke-unrevoke-certificates/para el artículo de referencia en el que se basa esta solución.