Buka server VPN darurat dengan otorisasi dua faktor pada Centos 8

Kata pengantar


Pada malam hari Minggu pertengahan Maret, saya menerima panggilan telepon, intinya adalah 200+ orang tidak akan datang ke kantor pada hari Senin, tetapi akan ditransfer ke "remote". Ungkapan: satu di "remote", dan admin di "diperpanjang", berputar di kepalaku.


Ini bukan untuk mengatakan bahwa kami sama sekali tidak memiliki akses jarak jauh ke sumber daya internal, tetapi kami menggunakan IPSEC VPN pada sekelompok klien VPN lunak Shrew + Pfsense untuk akses darurat beberapa spesialis TI ke sistem informasi yang terkait dengan mereka yang mendukung. Klien VPN lunak Shrew menunjukkan kekhasan yang terdiri dari fakta bahwa setelah sejumlah koneksi yang berhasil, rute ipv4 berhenti bekerja. Situasi ini ditangani dengan me-restart layanan Windows atau me-reboot perangkat akhir. Prospek untuk menjelaskan nuansa ini kepada kolega dalam jumlah yang tidak terbatas berapa kali sehari menyebabkan kegugupan dan getaran anggota badan pada saat yang bersamaan.


Pilihan tepung


Saya telah mengidentifikasi persyaratan solusi berikut untuk mengatur sistem VPN ke kantor:

  1. Pengaturan mudah. Dengan harapan bahwa beberapa akan mengatasi sendiri;
  2. Ketersediaan klien untuk sistem operasi populer;
  3. Dukungan untuk otentikasi kata sandi Active Directory; Masalah kunci (sertifikat) yang mendesak tidak ada dalam rencana saya
  4. Otentikasi dua faktor. Lebih disukai gratis;
  5. Investasi minimum, dan lebih baik gratis, karena anggaran untuk peralatan TI 2020 tidak menyiratkan biaya gateway akses jarak jauh;
  6. Dan stabilitas dan kinerja yang dapat diprediksi;

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 dapat menggunakan mekanisme pam untuk otorisasi. Untuk otorisasi "end-to-end" dari klien Active Directory, tambahkan server baru kami ke domain:


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

Memeriksa Ketersediaan Infrastruktur Direktori Aktif
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

File konfigurasi SSSD (Daemon Layanan Keamanan Sistem) /etc/sssd/sssd.conf akan secara otomatis dihasilkan. Anda harus menambahkan layanan VPN server ocserv yang belum diinstal ke pengaturan. Parameter use_fully_qualified_names bertanggung jawab atas format nama pengguna.
Daftar /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

Nyalakan dan mulai layanan SSSD

systemctl enable sssd
systemctl start sssd

Dimungkinkan untuk membatasi jumlah pengguna dengan hak untuk terhubung. Dalam hal ini, saya mengizinkan semua pengguna untuk terhubung ke server.

realm permit --all

Pada tahap ini, ssh otentikasi ke server untuk pengguna domain harus berfungsi.

Memilih modul untuk menerapkan otentikasi dua langkah dua faktor , saya melihat biaya keamanan Duo yang didukung dari kotak dan memilih TOTP (Time-based One-time Password) yang diwakili oleh Google Authenticator. Dalam implementasi ini, waktu sinkronisasi waktu server dengan layanan waktu yang tepat sangat penting. Anda dapat memeriksa operasi daemon chronyd yang benar dengan perintah: chronyc sources

Kesimpulan sumber kronik
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

Pasang Google Authenticator:

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

Selanjutnya, Anda perlu menjalankan perintah google-authenticator dari akun pengguna di server (sudo su DomainUser) dan menjawab semua pertanyaan secara positif untuk mendapatkan kode pengenal / qr untuk aplikasi Google Authenticator pada smartphone pengguna ( 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