Šta ako je dvofaktorska autentifikacija i poželjna i bodljikava, ali nema novca za hardverske tokene i općenito nude da ostanete dobro raspoloženi.
Ovo rješenje nije nešto super originalno, već mješavina različitih rješenja koja se nalaze na internetu.
Tako dato
Ime domena Aktivni direktorij.
Korisnici domena koji rade preko VPN-a, kao i mnogi danas.
Djeluje kao VPN gateway Fortigate.
Pohranjivanje lozinke za VPN klijenta zabranjeno je sigurnosnom politikom.
Politika Fortinet u odnosu na vlastite tokene, ne možete to nazvati manje od zhloba - ima čak 10 besplatnih tokena, ostalo - po vrlo nekošer cijeni. Nisam razmatrao RSASecureID, Duo i slično, jer želim open source.
Preduvjeti: host * nix sa utvrđenim freeradius, ssd - unesene u domenu, korisnici domene mogu lako da se autentifikuju na njemu.
Dodatni paketi: shellina box, figlett, freeradius-ldap, font rebel.tlf iz spremišta
U mom primjeru, CentOS 7.8.
Logika rada bi trebala biti sljedeća: prilikom povezivanja na VPN, korisnik mora umjesto lozinke unijeti login na domenu i OTP.
Podešavanje usluga
В /etc/raddb/radiusd.conf samo korisnik i grupa u čije ime počinje freeradius, od službe radiusd trebao bi moći čitati datoteke u svim poddirektorijumima /Dom/.
user = root
group = root
Da biste mogli koristiti grupe u postavkama Fortigate, mora se prenijeti Specifičan atribut dobavljača. Da biste to učinili, u imeniku raddb/policy.d Pravim fajl sa sledećim sadržajem:
group_authorization {
if (&LDAP-Group[*] == "CN=vpn_admins,OU=vpn-groups,DC=domain,DC=local") {
update reply {
&Fortinet-Group-Name = "vpn_admins" }
update control {
&Auth-Type := PAM
&Reply-Message := "Welcome Admin"
}
}
else {
update reply {
&Reply-Message := "Not authorized for vpn"
}
reject
}
}
Nakon instalacije freeradius-ldap u imeniku raddb/mods-available fajl je kreiran ldap.
Potrebno je kreirati simboličku vezu do direktorija raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Njegov sadržaj donosim u ovaj oblik:
ldap {
server = 'domain.local'
identity = 'CN=freerad_user,OU=users,DC=domain,DC=local'
password = "SupeSecretP@ssword"
base_dn = 'dc=domain,dc=local'
sasl {
}
user {
base_dn = "${..base_dn}"
filter = "(sAMAccountname=%{%{Stripped-User-Name}:-%{User-Name}})"
sasl {
}
scope = 'sub'
}
group {
base_dn = "${..base_dn}"
filter = '(objectClass=Group)'
scope = 'sub'
name_attribute = cn
membership_filter = "(|(member=%{control:Ldap-UserDn})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"
membership_attribute = 'memberOf'
}
}
U fajlovima raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel u sekciji ovlastiti Dodajem naziv politike koja će se koristiti - group_authorization. Važna stvar - naziv politike nije određen imenom datoteke u direktoriju politika.d, ali putem direktive unutar datoteke prije vitičastih zagrada.
U sekciji potvrditi identitet u istim datotekama trebate dekomentirati red Pam.
U fajlu clients.conf propisati parametre sa kojima će se povezati Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Konfiguracija modula pam.d/radiusd:
#%PAM-1.0
auth sufficient pam_google_authenticator.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
session include password-auth
Zadane opcije implementacije paketa freeradius с google autenticator zahtijevaju od korisnika da unese vjerodajnice u formatu: korisnicko ime lozinka+OTP.
Zamišljajući broj psovki koje će pasti na glavu, u slučaju korištenja zadanog paketa freeradius с Google Authenticator, odlučeno je da se koristi konfiguracija modula Pam tako da se samo token može provjeriti Google Authenticator.
Kada se korisnik poveže, dešava se sljedeće:
- Freeradius provjerava da li je korisnik u domeni i u određenoj grupi i, ako je uspješan, provjerava OTP token.
Sve je izgledalo dovoljno dobro do trenutka kada sam pomislio “Kako da registrujem OTP za 300+ korisnika?”
Korisnik se mora prijaviti na server sa freeradius i ispod vašeg naloga i pokrenite aplikaciju Google autentifikator, koji će generirati QR kod za aplikaciju za korisnika. Tu dolazi pomoć. shellina box u kombinaciji sa .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Daemon config file se nalazi na /etc/sysconfig/shellinabox.
Navodim port 443 tamo i možete odrediti svoj certifikat.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Korisnik samo treba da prati link, unese kredite za domenu i dobije QR kod za aplikaciju.
Algoritam je sljedeći:
- Korisnik se prijavljuje na mašinu preko pretraživača.
- Da li je korisnik domene označen. Ako ne, onda se ništa ne preduzima.
- Ako je korisnik korisnik domene, provjerava se članstvo u grupi administratora.
- Ako nije administrator, provjerava da li je Google Authenticator konfiguriran. Ako nije, onda se generira QR kod i korisnik se odjavljuje.
- Ako nije administrator i konfiguriran je Google Authenticator, samo se odjavite.
- Ako je administrator, provjerite ponovo Google Authenticator. Ako nije konfigurisan, generira se QR kod.
Sva logika se radi pomoću /etc/skel/.bash_profile.
mačka /etc/skel/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
# Make several commands available from user shell
if [[ -z $(id $USER | grep "admins") || -z $(cat /etc/passwd | grep $USER) ]]
then
[[ ! -d $HOME/bin ]] && mkdir $HOME/bin
[[ ! -f $HOME/bin/id ]] && ln -s /usr/bin/id $HOME/bin/id
[[ ! -f $HOME/bin/google-auth ]] && ln -s /usr/bin/google-authenticator $HOME/bin/google-auth
[[ ! -f $HOME/bin/grep ]] && ln -s /usr/bin/grep $HOME/bin/grep
[[ ! -f $HOME/bin/figlet ]] && ln -s /usr/bin/figlet $HOME/bin/figlet
[[ ! -f $HOME/bin/rebel.tlf ]] && ln -s /usr/share/figlet/rebel.tlf $HOME/bin/rebel.tlf
[[ ! -f $HOME/bin/sleep ]] && ln -s /usr/bin/sleep $HOME/bin/sleep
# Set PATH env to <home user directory>/bin
PATH=$HOME/bin
export PATH
else
PATH=PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
fi
if [[ -n $(id $USER | grep "domain users") ]]
then
if [[ ! -e $HOME/.google_authenticator ]]
then
if [[ -n $(id $USER | grep "admins") ]]
then
figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"
sleep 1.5
echo "Please, run any of these software on your device, where you would like to setup OTP:
Google Autheticator:
AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605
Play Market - https://play.google.com/stor/apps/details?id=com.google.android.apps.authenticator2&hl=en
FreeOTP:
AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395
Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=en
And prepare to scan QR code.
"
sleep 5
google-auth -f -t -w 3 -r 3 -R 30 -d -e 1
echo "Congratulations, now you can use an OTP token from application as a password connecting to VPN."
else
figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"
sleep 1.5
echo "Please, run any of these software on your device, where you would like to setup OTP:
Google Autheticator:
AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605
Play Market - https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en
FreeOTP:
AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395
Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=en
And prepare to scan QR code.
"
sleep 5
google-auth -f -t -w 3 -r 3 -R 30 -d -e 1
echo "Congratulations, now you can use an OTP token from application as a password to VPN."
logout
fi
else
echo "You have already setup a Google Authenticator"
if [[ -z $(id $USER | grep "admins") ]]
then
logout
fi
fi
else
echo "You don't need to set up a Google Authenticator"
fi
Fortigate setup:
- Mi stvaramo poluprečnik-server
- Kreiramo potrebne grupe, po potrebi kontrolu pristupa po grupama. Ime grupe uključeno Fortigate mora odgovarati grupi koja je proslijeđena Specifičan atribut dobavljača Fortinet-Group-Name.
- Uređivanje potrebnog SSL-portali.
- Dodavanje grupa politikama.
Prednosti ovog rješenja:
- Moguće je autentifikovati putem OTP-a Fortigate rješenje otvorenog koda.
- Korisnik ne unosi lozinku domene prilikom povezivanja putem VPN-a, što donekle pojednostavljuje proces povezivanja. Šestocifrenu lozinku je lakše unijeti od one koju predviđa sigurnosna politika. Kao rezultat toga, smanjuje se broj tiketa s temom: "Ne mogu se povezati s VPN-om".
PS Planiramo nadograditi ovo rješenje na potpunu dvofaktorsku autentifikaciju sa izazov-odgovor.
update:
Kao što sam obećao, podesio sam ga na opciju izazov-odgovor.
Dakle:
U fajlu /etc/raddb/sites-enabled/default odjeljak ovlastiti je sledeći:
authorize {
filter_username
preprocess
auth_log
chap
mschap
suffix
eap {
ok = return
}
files
-sql
#-ldap
expiration
logintime
if (!State) {
if (&User-Password) {
# If !State and User-Password (PAP), then force LDAP:
update control {
Ldap-UserDN := "%{User-Name}"
Auth-Type := LDAP
}
}
else {
reject
}
}
else {
# If State, then proxy request:
group_authorization
}
pap
}
Odjeljak potvrditi identitet sada izgleda ovako:
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
digest
# Attempt authentication with a direct LDAP bind:
Auth-Type LDAP {
ldap
if (ok) {
update reply {
# Create a random State attribute:
State := "%{randstr:aaaaaaaaaaaaaaaa}"
Reply-Message := "Please enter OTP"
}
# Return Access-Challenge:
challenge
}
}
pam
eap
}
Sada se provjera korisnika odvija prema sljedećem algoritmu:
- Korisnik unosi kredite domene u VPN klijentu.
- Freeradius provjerava valjanost naloga i lozinke
- Ako je lozinka ispravna, šalje se zahtjev za token.
- Token se provjerava.
- profit).
izvor: www.habr.com