Wie kann verhindert werden, dass Benutzer Zertifikate in OpenVPN freigeben?

8

Ich habe einen OpenVPN-Server, der Zertifikate und LDAP-Authentifizierung verwendet.

Das Problem ist, dass ein Benutzer sein Zertifikat freigeben kann und andere gültige LDAP-Benutzer dieses Zertifikat verwenden können.

Frage

Wie stelle ich sicher, dass das Bob-Zertifikat nur mit dem LDAP-Benutzer "bob" verwendet werden kann?

Sandra
quelle

Antworten:

9

Nach diesem Beitrag , common_namekann vom Benutzer nicht gefälscht werden.

Fügen Sie dies zu openvpn server.conf hinzu

script-security 2

# untrusted state
auth-user-pass-verify /etc/openvpn/scripts/check_cn_on_connect.sh via-env

/etc/openvpn/scripts/check_cn_on_connect.sh enthält

#!/bin/bash

# username and common_name must be the same to allow access.
# users are not allowed to share their cert
if [ $username != $common_name ]; then
   echo "$(date +%Y%m%d-%H%M%S) DENIED  username=$username cert=$common_name" >> /var/log/openvpn-access.log
   exit 1
fi

echo "$(date +%Y%m%d-%H%M%S) GRANTED username=$username cert=$common_name" >> /var/log/openvpn-access.log

exit 0

Aktualisieren

Dies ist für OpenVPN 2.1.4. In 2.2.0 haben sie viele neue Variablen hinzugefügt, die Sie sehen können env >> /tmp/env, wobei eine dieser neuen Variablen der Fingerabdruck / die Seriennummer des Zertifikats ist.

Sandra
quelle
4

Es gibt viele Optionen, da OpenVPN ein Open-Source-Projekt ist und die Möglichkeit hat, einen eigenen Authentifizierungs-Hook zu schreiben. Es gibt viele Leute, die viele verschiedene Dinge getan haben, um verschiedene Authentifizierungsebenen bereitzustellen.

Ich habe die meisten davon nicht ausprobiert und sie gerade in den Dokumenten / Blogs / Maillisten erwähnt gesehen. Einige davon erfordern möglicherweise Patches oder die nicht kostenlose Version.

Eine Hauptmethode besteht darin, das Extrahieren / Kopieren des privaten Teils Ihres Schlüsselpaars unerschwinglich zu machen.

Wenn der Schutz des Schlüssels unerschwinglich ist, auf Ihren Client-Plattformen nicht unterstützt wird oder aus einem anderen Grund nicht möglich ist, stehen Ihnen einige Optionen zur Verfügung.

  • Erfordern häufige Erneuerungen des Zertifikats, sodass ein kopiertes Zertifikat nicht lange verwendet werden kann.
  • Stellen Sie viel Protokollierung auf Ihrem Server ein, um auf Anomalien zu achten. Wenn sich Bob normalerweise nur von seinem Haus aus anmeldet und sich dann eines Tages von Acme Inc. aus anmeldet, müssen Sie möglicherweise Nachforschungen anstellen.

  • Richten Sie die Multi-Faktor-Authentifizierung ein. Ihr Zertifikat zählt als "etwas, das Sie haben". Sie sollten also nach Alternativen für "etwas, das Sie sind" oder "etwas, das Sie wissen" suchen. Dies umfasst Bio-Metriken oder Passwörter / Passphrasen.

  • Wie bereits erwähnt, bietet OpenVPN eine sehr flexible Authentifizierung. Dies nutzt die auth-user-pass-verifyOption. Diese Option übergibt den angegebenen Benutzernamen und das Kennwort an ein externes Skript / Programm, das die Authentifizierungsentscheidung basierend auf Ihren Wünschen trifft.
Zoredache
quelle
Ich kann das verwenden auth-user-pass-verify /etc/openvpn/scripts/connect.sh via-env, um den Benutzernamen des Benutzers zu erhalten. Wissen Sie, ob ich die ID auch aus dem Zertifikat erhalten kann, das der Benutzer verwendet? Wenn ja, kann ich ein Perl-Skript schreiben, das eine Yaml-Datei mit bekannten Zertifikats-IDs überprüft.
Sandra
1
Leider kenne ich keine Methode, um die ID / den Betreff / die Details aus dem verwendeten Zertifikat abzurufen, aber das bedeutet nicht, dass dies nicht möglich ist.
Zoredache
Die Lösung gefunden und veröffentlicht.
Sandra
1

Ich bin kein Sicherheitsprofi. Ich bin streng in Bezug auf Sicherheit. Ihre Frage erreicht genau den Kern der IT-Sicherheit: Vertrauen. Aus meiner Sicht sollte man niemals davon ausgehen, dass man Bob vertrauen kann. Sicher, Bob könnte ein wirklich netter und vertrauenswürdiger Typ sein. Er hat über 20 Jahre in Ihrem Unternehmen gearbeitet. Die Person "Bob" ist jedoch in Ihrer IT-Infrastruktur völlig irrelevant.

Bob verwendet beliebige "Relais", die den Zugriff ermöglichen. Relais können alles sein: Passwort, Zertifikat, Hardware-Token, Iris-Scan, DNA. Dies sind Schlüssel, die den Zugriff auf Ihr System ermöglichen. Wenn es bei Ihrer Frage darum geht, die Identität der Person zu überprüfen, die einen Schlüssel verwendet, ist die einzig ehrliche Antwort wahrscheinlich, dass Sie sich im selben Raum befinden müssen. In allen anderen Fällen denke ich, dass Sie sich nicht versichern dürfen, dass Bob wirklich Bob ist und derzeit nicht mit vorgehaltener Waffe festgehalten wird, während Sie seinen Zugang erhalten. In Ihrem Entwurfsplan für die IT-Infrastruktur ist es daher logisch, sich nicht auf "Bob" zu beziehen: Eine Entität hat Zugriff auf Ihre Site erhalten.

Da Sie nur wirklich wissen können, dass „eine Entität“ mit einem Schlüssel, den Sie in der Vergangenheit ohnmächtig gemacht haben, Zugriff erhalten hat, besteht die richtige Perspektive wahrscheinlich darin, die Anzahl der Türen zu begrenzen, die der Schlüssel öffnen kann. Je mehr Schlüssel Sie verteilen, desto weniger Türen öffnen sie.

OpenVPN bietet auch die Option, nur eine gleichzeitige Verbindung pro Schlüssel zuzulassen. Wenn sich Alice dann mit Bobs Schlüssel anmeldet, während Bob bereits drinnen ist, wird Alice der Zugriff verweigert. Leider bedeutet dies auch, dass Bob sich nicht anmelden kann, wenn Alice mit Bobs Schlüssel angemeldet ist. Sie sollten Ihr System daher so konfigurieren, dass Sie über gleichzeitige Anmeldeversuche von mehreren Quell-IPs informiert werden. Und starten Sie beide, wenn ein Verstoß auftritt, sodass Bob um Hilfe bitten muss.

Der Punkt ist: Überzeugen Sie sich nicht von Dingen, bei denen Sie sich nicht sicher sind, und berücksichtigen Sie dies bei der Gestaltung Ihres Sicherheitsplans. Angenommen, es gibt immer eine klügere Person da draußen, weit vor Ihnen, die es kaum erwarten kann, Ihnen das Gegenteil zu beweisen ... nur "für den Lulz". :-)

Trommelfeuer
quelle