Servidor VPN de emergencia Openconnect con autorización de dos factores en Centos 8

Prefacio


En la tarde del domingo a mediados de marzo, recibí una llamada telefónica, cuya esencia era que más de 200 personas no acudirían a la oficina el lunes, sino que serían transferidas a "control remoto". La frase: una en el "control remoto", y los administradores en el "extendido", giraron en mi cabeza.


Esto no quiere decir que no teníamos acceso remoto a los recursos internos en absoluto, pero usamos IPSEC VPN en un grupo de cliente VPN suave de Shrew + Pfsense para el acceso de emergencia de algunos especialistas de TI a los sistemas de información imputados a ellos en soporte. El cliente VPN Shrew Soft mostró una peculiaridad consistente en el hecho de que después de varias conexiones exitosas, las rutas ipv4 dejaron de funcionar. Esta situación se trató reiniciando los servicios de Windows o reiniciando el dispositivo final. La posibilidad de explicar este matiz a sus colegas un número indefinido de veces al día causó tic nervioso y temblor de las extremidades al mismo tiempo.


Harina de elección


He identificado los siguientes requisitos de solución para organizar una VPN a sistemas de oficina:

  1. Configuración fácil. Con la esperanza de que algunos se las arreglen solos;
  2. Disponibilidad de un cliente para sistemas operativos populares;
  3. Soporte para autenticación de contraseña Active Directory; La emisión urgente de claves (certificados) no estaba en mis planes
  4. Autenticación de dos factores. Preferiblemente libre;
  5. Inversión mínima, y ​​mejor gratis, ya que el presupuesto para el equipo de TI 2020 no implica el costo de una puerta de enlace de acceso remoto;
  6. Y estabilidad y rendimiento predecibles;

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 puede usar el mecanismo de pam para la autorización. Para la autorización "de extremo a extremo" de los clientes de Active Directory, agregue nuestro nuevo servidor al dominio:


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

Comprobación de disponibilidad de infraestructura de 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

El archivo de configuración SSSD (System Security Services Daemon) /etc/sssd/sssd.conf se generará automáticamente. Debe agregar el servicio VPN del servidor ocserv que aún no se ha instalado en la configuración. El parámetro use_fully_qualified_names es responsable del formato del nombre de usuario.
Listado /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

Encienda e inicie el servicio SSSD

systemctl enable sssd
systemctl start sssd

Es posible limitar el número de usuarios con derecho a conectarse. En este caso, permití que todos los usuarios se conectaran al servidor.

realm permit --all

En esta etapa, la autenticación ssh al servidor para usuarios de dominio debería funcionar.

Al elegir un módulo para implementar la autenticación de dos factores y dos pasos, analicé el costo de la seguridad de Duo admitida desde el cuadro y elegí TOTP (Contraseña de un solo uso basada en el tiempo) representada por Google Authenticator. En esta implementación, la sincronización de la hora del servidor por los servicios horarios exactos es crítica. Puede verificar el correcto funcionamiento del demonio chronyd con el comando: chronyc sources

Conclusión de fuentes cronicas
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

Instalar Google Authenticator:

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

A continuación, debe ejecutar el comando google-authenticator desde la cuenta de usuario en el servidor (sudo su DomainUser) y responder todas las preguntas positivamente para obtener el código identificador / qr de la aplicación Google Authenticator en el teléfono inteligente del usuario ( 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