Serveur VPN d'urgence Openconnect avec autorisation à deux facteurs sur Centos 8

Préface


Dans la soirée de dimanche à la mi-mars, j’ai reçu un appel téléphonique, dont l’essence était que plus de 200 personnes ne viendraient pas au bureau lundi, mais seraient transférées à remote ». La phrase: une sur la "télécommande" et les administrateurs sur la "rallonge", tournaient dans ma tête.


Cela ne veut pas dire que nous n'avions pas du tout accès à distance aux ressources internes, mais nous avons utilisé IPSEC VPN sur un tas de clients VPN soft Shrew + Pfsense pour l'accès d'urgence de certains informaticiens aux systèmes d'information qui leur sont imputés en support. Le client VPN soft Shrew a montré une particularité consistant en ce qu'après un certain nombre de connexions réussies, les routes ipv4 ont cessé de fonctionner. Cette situation a été traitée en redémarrant les services Windows ou en redémarrant l'appareil final. La perspective d'expliquer cette nuance à des collègues un nombre indéfini de fois par jour a provoqué en même temps des tics nerveux et des tremblements des membres.


Farine de choix


J'ai identifié les exigences de solution suivantes pour organiser un VPN vers des systèmes bureautiques:

  1. Installation facile. Dans l'espoir que certains s'en sortiront seuls;
  2. Disponibilité d'un client pour les systèmes d'exploitation populaires;
  3. Prise en charge de l'authentification par mot de passe Active Directory; La délivrance urgente de clés (certificats) n'était pas dans mes plans
  4. Authentification à deux facteurs. De préférence libre;
  5. Investissement minimum, et meilleur gratuitement, car le budget pour l'équipement informatique 2020 n'implique pas le coût d'une passerelle d'accès à distance;
  6. Et une stabilité et des performances prévisibles;

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

Le serveur VPN SSL OpenConnect peut utiliser le mécanisme pam pour l'autorisation. Pour une autorisation "de bout en bout" des clients Active Directory, ajoutez notre nouveau serveur au domaine:


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

Vérification de la disponibilité de l'infrastructure Active Directory
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

Le fichier de configuration du démon System Security Services SSSD /etc/sssd/sssd.conf sera généré automatiquement. Vous devez ajouter le service VPN du serveur ocserv qui n'a pas encore été installé aux paramètres. Le paramètre use_fully_qualified_names est responsable du format du nom d'utilisateur.
Liste /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

Allumez et démarrez le service SSSD

systemctl enable sssd
systemctl start sssd

Il est possible de limiter le nombre d'utilisateurs ayant le droit de se connecter. Dans ce cas, j'ai autorisé tous les utilisateurs à se connecter au serveur.

realm permit --all

À ce stade, l'authentification ssh auprès du serveur pour les utilisateurs du domaine devrait fonctionner.

En choisissant un module pour implémenter l' authentification à deux facteurs en deux étapes, j'ai examiné le coût de la sécurité Duo prise en charge dans la boîte et j'ai choisi TOTP (Time-based One-time Password) représenté par Google Authenticator. Dans cette implémentation, la synchronisation de la synchronisation de l'heure du serveur par les services d'heure exacte est critique. Vous pouvez vérifier le bon fonctionnement du démon chronyd avec la commande: chronyc sources

Conclusion des sources chronyc
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

Installez Google Authenticator:

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

Ensuite, vous devez exécuter la commande google-authentifier à partir du compte utilisateur sur le serveur (sudo su DomainUser) et répondre positivement à toutes les questions pour obtenir l'identifiant / code qr de l'application Google Authenticator sur le smartphone de l'utilisateur ( IOS , Google play )

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