Servidor VPN de emergência Openconnect com autorização de dois fatores no Centos 8

Prefácio


Na noite de domingo, em meados de março, recebi um telefonema, cuja essência era que mais de 200 pessoas não chegariam ao escritório na segunda-feira, mas seriam transferidas para o "controle remoto". A frase: um no "remoto", e os administradores no "estendido", giraram na minha cabeça.


Isso não quer dizer que não tínhamos acesso remoto a recursos internos, mas usamos a VPN IPSEC em vários clientes VPN Shrew soft + Pfsense para acesso emergencial de alguns especialistas em TI aos sistemas de informação que lhes são imputados no suporte. O cliente de VPN flexível da Shrew mostrou uma peculiaridade que consistia no fato de que, após várias conexões bem-sucedidas, as rotas do ipv4 deixaram de funcionar. Essa situação foi tratada ao reiniciar os serviços do Windows ou ao dispositivo final. A perspectiva de explicar essa nuance aos colegas um número indefinido de vezes por dia causava tique nervoso e tremor nos membros simultaneamente.


Farinha de escolha


Eu identifiquei os seguintes requisitos de solução para organizar uma VPN para sistemas de escritório:

  1. Fácil configuração. Na esperança de que alguns possam lidar sozinhos;
  2. Disponibilidade de um cliente para sistemas operacionais populares;
  3. Suporte para autenticação de senha do Active Directory; A emissão urgente de chaves (certificados) não estava nos meus planos
  4. Autenticação de dois fatores. De preferência livre;
  5. Investimento mínimo e melhor de graça, uma vez que o orçamento para equipamentos de TI 2020 não implicava o custo de um gateway de acesso remoto;
  6. E estabilidade e desempenho previsíveis;

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

O servidor VPN OpenConnect SSL pode usar o mecanismo pam para autorização. Para autorização "ponta a ponta" dos clientes do Active Directory, adicione nosso novo servidor ao domínio:


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

Verificando a disponibilidade da infraestrutura do 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

O arquivo de configuração do SSSD do Daemon de Serviços de Segurança do Sistema /etc/sssd/sssd.conf será gerado automaticamente. Você deve adicionar o serviço VPN do servidor ocserv que ainda não foi instalado às configurações. O parâmetro use_fully_qualified_names é responsável pelo formato do nome de usuário.
Listando /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

Ligue e inicie o serviço SSSD

systemctl enable sssd
systemctl start sssd

É possível limitar o número de usuários com o direito de se conectar. Nesse caso, permiti que todos os usuários se conectassem ao servidor.

realm permit --all

Nesse estágio, a autenticação ssh no servidor para usuários do domínio deve funcionar.

Escolhendo um módulo para implementar a autenticação de dois fatores e duas etapas, examinei o custo da segurança do Duo suportado na caixa e escolhi o TOTP (Senha de uso único baseada em tempo) representada pelo Google Authenticator. Nesta implementação, o tempo da sincronização da hora do servidor pelos serviços de hora exata é crítico. Você pode verificar a operação correta do daemon chronyd com o comando: chronyc sources

Conclusão de fontes de cronyc
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

Instale o Google Authenticator:

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

Em seguida, você precisa executar o comando google-authenticator a partir da conta de usuário no servidor (sudo su DomainUser) e responder a todas as perguntas positivamente para obter o código identificador / qr do aplicativo Google Authenticator no smartphone do usuário ( 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