OpenVPN-Server deaktivieren und Clients wieder aktivieren

OpenVPN-Server deaktivieren und Clients wieder aktivieren

Ich verwende OpenVPN 2.3.2 (bin noch ein Neuling) auf einem Ubuntu 14.04 Server-Rechner. Ich möchte Clients, die eine Verbindung zu meinem OpenVPN-Server herstellen, deaktivieren/wieder aktivieren können.

ich folgteDasAnleitung zum Widerrufen eines Client-Zertifikats, aber es scheint, dass dieser Schritt irreversibel ist. Auch wenn ich das Zertifikat eines Clients widerrufe und der Client bereits verbunden ist, scheint die Verbindung nicht zu unterbrechen. Ich möchte, dass die Verbindung sofort unterbrochen wird.

Gibt es eine einfache Möglichkeit, Clients zu deaktivieren und wieder zu aktivieren?

Meine server.conf-Datei:

# 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

Die letzte Zeile ist für die Anleitung oben.

Danke schön.

Antwort1

Ich habe eine ähnliche Lösung wie davidgo implementiert. Leider trat ein OpenSSL-Fehler auf, der dem vondieser Fehler, und ich habe viel Zeit damit verbracht, eine Problemumgehung dafür zu finden.

Ich habe schließlich zwei Skripte zum Widerrufen und Aufheben der Widerrufung von Client-Zertifikaten geschrieben:

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

Beachten Sie, dass das revoke.shSkript auch eineTelnet-Verbindungmit OpenVPN und wirft den zu widerrufenden Client raus.

Antwort2

Panos Antwort war vor 5 Jahren richtig. Sie verdient also einen Daumen hoch. Seitdem ist jedoch Folgendes passiert: Das Verzeichnis vars wurde verschoben/entfernt, das Verzeichnis /usr/share/easy-rsa scheint nicht mehr vorhanden zu sein und $KEY_CONFIG scheint entweder nicht vorhanden oder mit dem Verzeichnis vars gekoppelt zu sein, das, wie ich schon sagte, nicht mehr vorhanden zu sein scheint, zumindest in Ubuntu 21.10 (April 2022).

Ich habe dieses Skript bei GitHub gefunden und es sah für mich gut aus. Ich habe es ausgeführt und es hat funktioniert. Es hat mein widerrufenes Zertifikat wiederhergestellt.

#!/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

Um das Skript auszuführen, geben Sie den Namen des VPN-Zertifikats an, das Sie widerrufen haben. Dieser wird in der Datei index.txt im Verzeichnis /etc/openvpn/server/easy-rsa/pki/ in der Befehlszeile angezeigt. Kopieren Sie ihn also, fügen Sie ihn in eine Datei ein, sagen wir unrevoke.sh, und führen Sie dann Folgendes aus:

chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>

Ich verstehe zwar die Argumente, warum man Zertifikate nicht widerrufen sollte. Aber das war ein Notfall.

Lassen Sie mich die Umstände erklären:

Ich bin Entwickler und arbeite für ein Startup. Ich bin kein Netzwerkadministrator oder Systemadministrator und daher nicht die beste Person, die man fragen sollte. Aber es gibt sonst niemanden, den man fragen könnte, also fiel die Verantwortung auf mich.

Im Wesentlichen mussten wir ein entferntes und unbeaufsichtigtes Gerät von einem VPN zu einem anderen verschieben. Trotz all unserer Tests mit dem neuen VPN haben wir (damit meine ich „ich“) die Tatsache übersehen, dass das System standardmäßig versucht, alles über das VPN zu senden. Einschließlich des Streamings von Dutzenden Gigabyte an Daten über eine 4G-Verbindung.

Natürlich reagierte das System nach dem Wechsel überhaupt nicht mehr und wir konnten uns weder über eine VPN-Verbindung noch über Teamviewer anmelden. Nachdem ich versucht hatte, den Grund dafür herauszufinden, kam ich zu dem Schluss, dass es daran lag, dass es versuchte, Daten über das Internet an sich selbst zurückzustreamen, und das würde uns wahrscheinlich Tausende an Rechnungen kosten.

Um die Situation zu entschärfen, während ich über eine Lösung des Problems nachdachte, habe ich das VPN-Zertifikat widerrufen. Dadurch ist die Bandbreite, die es zu nutzen versucht, zumindest nur auf Verbindungsversuche und nicht auf riesige Datenströme beschränkt.

Der Befehl, den ich zum Widerrufen des VPN-Zertifikats verwendet habe, war:

openvpn-install.sh

Dies ist in der OpenVPN-Installation enthalten und bietet eine Möglichkeit, ein bestimmtes Zertifikat zu widerrufen.

Mitten in der Nacht habe ich herausgefunden, dass es eine Möglichkeit gibt, aus der OpenVPN-Serverkonfiguration spezifischere Routing-Informationen zu pushen, um das Streaming zu stoppen. Also habe ich das gemacht und das widerrufene OpenVPN-Zertifikat wieder freigegeben.

Und tatsächlich, nach etwa 20 bis 30 Minuten erkannte die Remote-Ausrüstung die VPN-Änderungen und beruhigte sich wieder so weit, dass ich mich anmelden und das VPN auf die alten Einstellungen zurücksetzen konnte, bevor wir versuchten, es umzustellen und das System wiederhergestellt wurde.

Ich werde deswegen nicht meinen Job verlieren. Aber jemand anderes in einem anderen Unternehmen könnte das. Wie dem auch sei, ich wollte Ihnen nur meine Erfahrungen und Erkenntnisse darüber mitteilen, warum Sie die Sperrung eines VPN-Zertifikats aufheben sollten.

Antwort3

Auf der Suche nach einer Möglichkeit, OpenVPN-Benutzer aktivieren/deaktivieren zu können, ohne ihnen eine weitere *.ovpn-Konfigurationsdatei geben zu müssen, bin ich auf diese Seite gestoßen.

Ich habe die Antwort von Owl ausprobiert und für die erste Runde des Widerrufens/Aufhebens ist sie in Ordnung. Wenn Sie jedoch einen Benutzer ein zweites Mal widerrufen möchten, gibt easy-rsa einen Fehler aus, da keine gültigen *.crt-, *.key- und *.pem-Dateien zum Löschen und Verschieben in das Verzeichnis /etc/openvpn/easy-rsa/pki/revoked gefunden werden können.

Die Lösung besteht also darin, Owls Antwort drei Zeilen hinzuzufügen, um die Dateien wieder in ihre ursprünglichen Verzeichnisse zu kopieren. Diese lauten:

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

Das Widerrufsskript sieht folgendermaßen aus:

#!/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

Antwort4

Wenn Sie die Option iptables ignorieren (die meiner Meinung nach technisch besser ist), können Sie private Schlüssel widerrufen und wiederherstellen, indem Sie die Widerrufsdatei ändern und openvpn neu laden. (Wenn Sie easyRSA verwenden, können Sie easyRSA/index.txt bearbeiten. Suchen Sie die entsprechende Zeile und ändern Sie das Flag „R“ in ein Flag „V“, entfernen Sie die dritte Spalte.) Dann

  source ./vars
  openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"

Sie können den Startserver neu laden, damit die neue Konfiguration wirksam wird. Dadurch werden ALLE Clients beendet, sie sollten sich jedoch automatisch erneut verbinden und eine neue Sitzung aushandeln.

Sehenhttp://sq4ind.eu/openvpn-revoke-unrevoke-certificates/für den Referenzartikel, auf dem diese Lösung basiert.

verwandte Informationen