El servidor OpenVPN deshabilita y vuelve a habilitar clientes

El servidor OpenVPN deshabilita y vuelve a habilitar clientes

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.shscript 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.

información relacionada