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:
- Fácil configuração. Na esperança de que alguns possam lidar sozinhos;
- Disponibilidade de um cliente para sistemas operacionais populares;
- Suporte para autenticação de senha do Active Directory; A emissão urgente de chaves (certificados) não estava nos meus planos
- Autenticação de dois fatores. De preferência livre;
- 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;
- 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"
:
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
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 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
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 SSSDsystemctl 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 cronyc210 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.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.


...