OpenVPN 2.0 i nowsze zawierają funkcję, która umożliwia serwerowi OpenVPN bezpieczne uzyskanie nazwy użytkownika i hasła od łączącego się klienta oraz wykorzystanie tych informacji jako podstawy do uwierzytelnienia klienta.
aby użyć tej metody uwierzytelniania, najpierw dodaj dyrektywę auth-user-pass do konfiguracji klienta. Spowoduje to skierowanie klienta OpenVPN do zapytania Użytkownika o nazwę użytkownika/hasło, przekazując je do serwera za pośrednictwem bezpiecznego kanału TLS.
następnie skonfiguruj serwer tak, aby używał wtyczki uwierzytelniania, którą może być skrypt, obiekt współdzielony lub DLL. Serwer OpenVPN wywoła wtyczkę za każdym razem, gdy klient VPN spróbuje się połączyć, przekazując mu nazwę użytkownika/hasło wprowadzone na kliencie. Wtyczka uwierzytelniania może kontrolować, czy serwer OpenVPN pozwala klientowi na połączenie, zwracając wartość failure (1) lub success (0).
używanie wtyczek skryptowych
wtyczki Skryptowe mogą być używane przez dodanie dyrektywy auth-user-pass-verify do pliku konfiguracyjnego po stronie serwera. Na przykład:
auth-user-pass-verify auth-pam.pl via-file
użyje auth-pam.pl skrypt Perla do uwierzytelniania nazwy użytkownika / hasła łączących się klientów. Więcej informacji można znaleźć w opisie auth-user-pass-verify na stronie podręcznika.
auth-pam.pl skrypt jest zawarty w dystrybucji pliku źródłowego OpenVPN w sample-scriptsubdirectory. Uwierzytelnia użytkowników na serwerze Linux za pomocą modułu uwierzytelniania PAM, który z kolei może zaimplementować uwierzytelnianie shadow password, RADIUS lub LDAP. auth-pam.pl przeznaczony jest przede wszystkim do celów demonstracyjnych. Do autentycznego uwierzytelniania PAM użyj wtyczki obiektu openvpn-auth-pamshared opisanej poniżej.
używanie współdzielonych obiektów lub wtyczek DLL
współdzielone obiekty lub wtyczki DLL są zwykle kompilowanymi modułami C, które są ładowane przez serwer OpenVPN podczas uruchamiania. Na przykład, jeśli używasz pakietu OpenVPN opartego na RPM na Linuksie, wtyczka openvpn-auth-Pam powinna być już zbudowana. Aby go użyć, dodaj go do pliku konfiguracyjnego po stronie serwera:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
powie to serwerowi OpenVPN, aby zweryfikował nazwę użytkownika / hasło wprowadzone przez klientów za pomocą modułu loginPAM.
do rzeczywistego użytku produkcyjnego lepiej jest użyć wtyczki openvpn-auth-Pam, ponieważ ma ona kilka zalet w stosunku do auth-pam.pl skrypt:
- obiekt współdzielony OpenVPN-auth-Pam plugin używa modelu wykonywania split-privilege dla lepszego bezpieczeństwa. Oznacza to, że serwer OpenVPN może działać ze zmniejszonymi uprawnieniami, używając dyrektyw user nobody, group nobody i chroot, i nadal będzie w stanie uwierzytelnić się w pliku shadow password, który jest czytelny tylko dla roota.
- OpenVPN może przekazać nazwę użytkownika/hasło do wtyczki za pośrednictwem pamięci wirtualnej, a nie za pośrednictwem pliku lub środowiska, co jest lepsze dla lokalnego bezpieczeństwa na serwerze.
- C-skompilowane Moduły wtyczek generalnie działają szybciej niż skrypty.
jeśli chcesz uzyskać więcej informacji na temat tworzenia własnych wtyczek do użytku z OpenVPN, Zobacz pliki README w podkatalogu wtyczki dystrybucji źródłowej OpenVPN.
aby zbudować wtyczkę openvpn-auth-Pam na Linuksie, CD do katalogu plugin/auth-PAM w dystrybucji źródłowej OpenVPN i uruchomić make.
używanie uwierzytelniania użytkownika/hasła jako jedynej formy uwierzytelniania klienta
domyślnie użycie AUTH-user-pass-verify lub wtyczki do sprawdzania nazwy użytkownika/hasła na serwerze umożliwi podwójne uwierzytelnianie, wymagając, aby uwierzytelnienie klienta przebiegało pomyślnie, zarówno certyfikat klienta, jak i uwierzytelnianie nazwy użytkownika/hasła.
chociaż jest to odradzane z punktu widzenia bezpieczeństwa, można również wyłączyć używanie certyfikatów klienta i wymusić tylko uwierzytelnianie nazwy użytkownika/hasła. Na serwerze:
client-cert-not-required
takie konfiguracje powinny zazwyczaj również ustawiać:
username-as-common-name
który powie serwerowi, aby używał nazwy użytkownika do celów indeksowania, ponieważ będzie używał wspólnej nazwy klienta, który był uwierzytelniany za pomocą certyfikatu klienta.
zauważ, że Client-cert-not-required nie usunie potrzeby posiadania certyfikatu serwera, więc klient łączący się z serwerem, który używa client-cert-not-required może usunąć dyrektywy cert i key z pliku konfiguracyjnego klienta, ale nie dyrektywę ca, ponieważ jest to konieczne, aby Klient zweryfikował certyfikat serwera.