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:
- Installation facile. Dans l'espoir que certains s'en sortiront seuls;
- Disponibilité d'un client pour les systèmes d'exploitation populaires;
- 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
- Authentification à deux facteurs. De préférence libre;
- 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;
- 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"
:
firewall-cmd --set-default-zone=trusted
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
firewall-cmd --zone=drop --change-interface=ens192 --permanent
firewall-cmd --reload
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 Directoryrealm 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
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 SSSDsystemctl 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 chronyc210 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.confauth = «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.


...