Openconnect-Notfall-VPN-Server mit Zwei-Faktor-Berechtigung unter Centos 8

Vorwort


Am Sonntagabend Mitte März erhielt ich einen Anruf, bei dem im Wesentlichen mehr als 200 Personen am Montag nicht ins Büro kamen, sondern zu remote “weitergeleitet wurden. Der Satz: einer auf der "Fernbedienung" und die Admins auf der "erweiterten" drehten sich in meinem Kopf.


Dies bedeutet nicht, dass wir überhaupt keinen Remotezugriff auf interne Ressourcen hatten, aber wir haben IPSEC VPN auf einer Reihe von Shrew Soft VPN-Clients + Pfsense für den Notfallzugriff einiger IT-Spezialisten auf die ihnen zur Unterstützung zugerechneten Informationssysteme verwendet. Der Shrew-Soft-VPN-Client zeigte eine Besonderheit, die darin bestand, dass IPv4-Routen nach einer Reihe erfolgreicher Verbindungen nicht mehr funktionierten. Diese Situation wurde durch einen Neustart der Windows-Dienste oder einen Neustart des Endgeräts behoben. Die Aussicht, Kollegen diese Nuance auf unbestimmte Zeit am Tag zu erklären, verursachte gleichzeitig nervöses Tic und Zittern der Gliedmaßen.


Mehl der Wahl


Ich habe die folgenden Lösungsanforderungen für die Organisation eines VPN für Office-Systeme ermittelt:

  1. Einfache Einstellung. In der Hoffnung, dass einige alleine zurechtkommen;
  2. Verfügbarkeit eines Clients für gängige Betriebssysteme;
  3. Unterstützung für die Kennwortauthentifizierung Active Directory; Die dringende Ausgabe von Schlüsseln (Zertifikaten) war nicht in meinen Plänen
  4. Zwei-Faktor-Authentifizierung. Vorzugsweise frei;
  5. Mindestinvestition und besser kostenlos, da das Budget für IT-Ausrüstung 2020 nicht die Kosten für ein Remotezugriffs-Gateway implizierte.
  6. Und vorhersehbare Stabilität und Leistung;

WireGuard , openvpn-gui, , , SoftEther VPN, , Shrew soft . Openconnect VPN Server + OpenConnect SSL VPN Client — 1 , tcp, , LDAP, ! Cisco Anyconnect client :)



Centos 8. Centos 8 , glibc-langpack-en, >

dnf install glibc-langpack-en
setfont UniCyr_8x16
  /etc/vconsole.conf FONT="UniCyr_8x16"

:


#  trusted -    
#     nftables     Firewalld      Forward.     trusted 
firewall-cmd --set-default-zone=trusted
#    firewalld - ocserv (  443/tcp 443/udp)
firewall-cmd --permanent --new-service=ocserv
firewall-cmd --permanent --service=ocserv --set-description="OpenConnect SSL VPN Server"
firewall-cmd --permanent --service=ocserv --add-port=443/tcp
firewall-cmd --permanent --service=ocserv --add-port=443/udp
# (   ens192)   drop
firewall-cmd --zone=drop --change-interface=ens192 --permanent
firewall-cmd --reload
#  drop       ocserv
firewall-cmd --zone=drop --permanent --add-service=ocserv
firewall-cmd --reload

OpenConnect SSL VPN Server kann den Pam-Mechanismus zur Autorisierung verwenden. Fügen Sie für die "End-to-End" -Autorisierung von Active Directory-Clients unseren neuen Server zur Domäne hinzu:


#   
dnf install realmd sssd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation

Überprüfen der Verfügbarkeit der Active Directory-Infrastruktur
realm  discover mydomain.ru

mydomain.ru
type: kerberos
realm-name: MYDOMAIN.RU
domain-name: mydomain.ru
configured: no
server-software: active-directory
client-software: sssd
required-package: oddjob
required-package: oddjob-mkhomedir
required-package: sssd
required-package: adcli
required-package: samba-common-tools

 #    Active Directory
realm join mydomain.ru -U Username

Die Konfigurationsdatei SSSD (System Security Services Daemon) /etc/sssd/sssd.conf wird automatisch generiert. Sie müssen den VPN-Dienst ocserv server, der noch nicht installiert wurde, zu den Einstellungen hinzufügen. Der Parameter use_fully_qualified_names ist für das Benutzernamenformat verantwortlich.
Listing /etc/sssd/sssd.conf
[sssd]
domains = mydomain.ru
config_file_version = 2
services = nss, pam
default_domain_suffix = mydomain.ru

[domain/mydomain.ru]
ad_domain = mydomain.ru
ad_gpo_map_remote_interactive = +ocserv
krb5_realm = MYDOMAIN.RU
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = ad

Schalten Sie den SSSD-Dienst ein und starten Sie ihn

systemctl enable sssd
systemctl start sssd

Es ist möglich, die Anzahl der Benutzer mit Verbindungsrecht zu begrenzen. In diesem Fall habe ich allen Benutzern erlaubt, eine Verbindung zum Server herzustellen.

realm permit --all

Zu diesem Zeitpunkt sollte die SSH-Authentifizierung beim Server für Domänenbenutzer funktionieren.

Bei der Auswahl eines Moduls für die Implementierung der Zwei-Faktor- Zwei-Schritt-Authentifizierung habe ich mir die Kosten für die von der Box unterstützte Duo-Sicherheit angesehen und mich für TOTP (Time-based One-Time Password) entschieden, das von Google Authenticator dargestellt wird. Bei dieser Implementierung ist das Timing der Serverzeitsynchronisation durch die genauen Zeitdienste kritisch. Sie können den korrekten Betrieb des chronyd-Daemons mit dem folgenden Befehl überprüfen: chronyc sources

Schlussfolgerung chronischer Quellen
210 Number of sources = 2
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ntp1.vniiftri.ru 1 6 17 1 -171us[ -171us] ± 2166us
^* ntp2.vniiftri.ru 1 6 17 1 -237us[ -57us] ± 2494us

Installieren Sie Google Authenticator:

dnf install epel-release
dnf install google-authenticator qrencode-libs

Als Nächstes müssen Sie den Befehl google-authenticator vom Benutzerkonto auf dem Server (sudo su DomainUser) ausführen und alle Fragen positiv beantworten, um den Bezeichner / QR-Code für die Google Authenticator-Anwendung auf dem Smartphone des Benutzers ( IOS , Google Play ) zu erhalten.

Openconnect VPN Server:

dnf install ocserv
#    
systemctl enable ocserv

/etc/ocserv/ocserv.conf
auth = «pam»
#IPv4
listen-host = 1.1.111.1
tcp-port = 443
udp-port = 443
run-as-user = ocserv
run-as-group = ocserv
socket-file = ocserv.sock
chroot-dir = /var/lib/ocserv
isolate-workers = true
max-clients = 0

# -
max-same-clients = 1
keepalive = 32400
dpd = 90
mobile-dpd = 1800
switch-to-tcp-timeout = 25
try-mtu-discovery = true

#LetsenCrypt
server-cert = /etc/letsencrypt/live/vpn.mydomain.ru/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.mydomain.ru/privkey.pem

########################
cert-user-oid = 0.9.2342.19200300.100.1.1
compression = true
tls-priorities = "@SYSTEM"
auth-timeout = 240
idle-timeout = 1200
mobile-idle-timeout = 2400
min-reauth-time = 300
max-ban-score = 50
ban-reset-time = 300
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-occtl = true
pid-file = /var/run/ocserv.pid
device = vpns
predictable-ips = true
default-domain = vpn.mydomain.ru
# VPN
ipv4-network = 192.168.178.0/24

# DNS-
tunnel-all-dns = true
dns = 192.168.1.1
########################
ping-leases = false

# VPN
route = 192.168.1.0/255.255.255.0
route = 192.168.2.0/255.255.255.0
########################
cisco-client-compat = true
dtls-legacy = true
user-profile = profile.xml

LetsEncrypt VPN . . , , 3- COVID-19 .


firewall-cmd --zone=drop --add-service=http
curl -O  https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
certbot-auto certonly --standalone --preferred-challenges http -d vpn.mydomain.ru
firewall-cmd --zone=drop --remove-service=http

VPN

sed '/^#%PAM-1.0$/a auth       required     pam_google_authenticator\.so' /etc/pam.d/ocserv
systemctl start ocserv
systemctl start ocserv



echo "net.ipv4.ip_forward=1">/etc/sysctl.d/0-ocserv.conf
sysctl -w net.ipv4.ip_forward=1


openconnect-gui. vpn.mydomain.ru




Password OTP Google Authenticator. Password1 Active Directory.







...


All Articles