Çfarë të bëjmë nëse dy faktorët e autentikimit janë të nevojshëm, por nuk ka para për tokena harduerikë dhe përgjithësisht ofrohet që të mbështetesh dhe të kesh humor të mirë.
Ky zgjidhje nuk është asgjë superorigjinale, përkundrazi — një mix i zgjidhjeve të ndryshme të gjetura në hapësirat e internetit.
Pra, është dhënë
Domeni Active Directory.
Përdoruesit e domainit që punojnë përmes VPN-së, siç është rasti me shumë sot.
Si një portë VPN vepron Fortigate.
Ruajtja e fjalëkalimit për klientin VPN është e ndaluar nga politika e sigurisë.
Politika Fortinet për tokenat e tyre nuk është aspak bujare — ka deri në 10 tokena falas, të tjerët me një çmim shumë të shtrenjtë. Nuk shqyrtova RSASecureID, Duo dhe të ngjashme, pasi dëshiroj burim të hapur.
Kërkesat paraprake: host *nix i instaluar freeradius, sssd — i futur në domain, përdoruesit e domainit mund të autentifikohen rehat.
Paketa shtesë: shellinabox, figlet, freeeradius-ldap, shkronja rebel.tlf nga repositori .
Në shembullin tim — CentOS 7.8.
Logjika e punës parashikohet të jetë kështu: kur lidhet me VPN, përdoruesi duhet të vendosë emrin e domainit dhe OTP-në në vend të fjalëkalimit.
Konfigurimi i shërbimeve
Në /etc/raddb/radiusd.conf ndryshohet vetëm përdoruesi dhe grupi, në emër të cilit fillon freeradius, pasi shërbimi radiusd duhet të jetë në gjendje të lexojë skedarët në të gjitha nën-direktoritë /home/.
përdoruesi = root
grupi = root
Për të mundësuar përdorimin e grupeve në cilësime Fortigate, nevojitet dërgimi i Vendor Specific Attribute. Për këtë, në direktorinë raddb/policy.d krijoj një skedar me përmbajtjen e mëposhtme:
grup_autorizimi {
nëse (&LDAP-Group[*] == "CN=vpn_admins,OU=vpn-groups,DC=domain,DC=local") {
përditëso përgjigjen {
&Fortinet-Group-Name = "vpn_admins" }
përditëso kontrollin {
&Auth-Type := PAM
&Reply-Message := "Mirë se erdhët Admin"
}
}
ndryshe {
përditëso përgjigjen {
&Reply-Message := "Nuk jeni të autorizuar për vpn"
}
refuzo
}
}
Pas instalimit freeradius-ldap në direktorinë raddb/mods-available krijohet një skedar ldap.
Duhet të krijoni një lidhje simbole në katalogun raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldapE përkthej përmbajtjen e tij në këtë formë:
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'
}
} Në skedarët raddb/sites-enabled/default dhe raddb/sites-enabled/inner-tunnel në seksionin autorizo duke shtuar emrin e politikës që do të përdoret — group_authorization. Një pikë e rëndësishme — emri i politikës përcaktohet nga direktiva brenda skedarit përpara kllapave gris. policy.d, dhe nga direktiva brenda skedarit përpara kllapave gris.
Në seksionin autentifikoj në këto skedarë duhet të çaktivizoni rreshtin pam.
Në skedar clients.conf vendosim parametrat me të cilët do të lidhet Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Konfigurimi i modulit 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
Opsionet e paracaktuara për implementimin e lidhjes freeradius me google authenticator parashikojnë futjen nga ana e përdoruesit të të dhënave në formatin: emri/pasword+OTP.
Duke pasqyrën e numrit të mallkimeve që do të bien mbi kokën, në rastin e përdorimit të skemës standarde freeradius me Google Authenticator, u mor vendimi për të përdorur konfigurimin e modulit pam në mënyrë që të kontrollohet vetëm tokeni Google Authenticator.
Kur përdoruesi lidhet ndodhin këto:
- Freeradius kontrollon nëse përdoruesi është në domen dhe në një grup të caktuar dhe, në rast suksesi, kryhet kontrolli i OTP tokenit.
Gjithçka dukej mjaft mirë deri në momentin kur mendova, "Si të regjistroj OTP për 300+ përdorues?"
Përdoruesi duhet të hyjë në server freeradius nën llogarinë e tij dhe të nisë aplikacionin Google authenticator, i cili do të gjenerojë për përdoruesin një kod QR për aplikacionin. Këtu vjen në ndihmë shellinabox në kombinim me .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Skedari i konfigurimit të demoni ndodhet në /etc/sysconfig/shellinabox.
Atje specifikoj portin 443 dhe mund të tregoj certifikatën time.
[root@freeradius ~]#systemctl enable --now shellinaboxdPërdoruesit i mbetet vetëm të hyjë në lidhje, të futë kredencialet e domenit dhe të marrë kodin QR për aplikacionin.
Algoritmi është si më poshtë:
- Përdoruesi hyn në makinë përmes shfletuesit.
- Kontrollohet nëse përdoruesi është domen. Nëse jo, nuk merren masa.
- Nëse përdoruesi është domen, kontrollohet përfshirja në grupin e administratorëve.
- Nëse nuk është admin, kontrollohet nëse është konfigurimi i Google Authenticator. Nëse jo, krijohet një kod QR dhe përdoruesi del jashtë.
- Nëse nuk është admin dhe Google Authenticator është i konfigururar, thjesht del jashtë.
- Nëse është admin, përsëri kontrollohet Google Authenticator. Nëse nuk është i konfigururar, krijohet një kod QR.
Të gjitha logjikat kryhen duke përdorur /etc/skel/.bash_profile.
cat /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
Konfigurimi Fortigate:
- Krijojmë Radius-server

- Krijojmë grupet e nevojshme, në rast se është e nevojshme të ndahen qasje sipas grupeve. Emri i grupit në Fortigate duhet të përputhet me grupin që dërgohet në Vendor Specific Attribute Fortinet-Group-Name.

- Redaktojmë portalet e nevojshme. SSLShtojmë grupet në politikat.

- Pikat pozitive të këtij zgjidhjeje:

Ka mundësi autentifikimi me OTP në
- zgjidhjen open source. Fortigate опенсорс решением.
- Përdoruesi nuk ka nevojë të fusë fjalëkalimin e domain-it gjatë lidhjes përmes VPN, duke e thjeshtësuar kështu procesin e lidhjes. Është më e lehtë të futet një fjalëkalim 6-cifror sesa ai që parashikohet nga politika e sigurisë. Si pasojë, numri i biletave me temën: «Nuk mund të lidhem me VPN» është reduktuar.
P.S. Në planet është përmirësimi i kësaj zgjidhjeje në një autentifikim të plotë me dy faktorë me challenge-response.
Përditësim:
Siç premtova, e përmirësova në një opsion me challenge-response.
Pra:
Në skedar /etc/raddb/sites-enabled/default seksioni autorizo duket si më poshtë:
authorize {
filter_username
preprocess
auth_log
chap
mschap
suffix
eap {
ok = return
}
files
-sql
#-ldap
expiration
logintime
if (!State) {
if (&User-Password) {
# Nëse !State dhe User-Password (PAP), atëherë detyro LDAP:
update control {
Ldap-UserDN := "%{User-Name}"
Auth-Type := LDAP
}
}
else {
reject
}
}
else {
# Nëse State, atëherë kërkesë proxy:
group_authorization
}
pap
}
Sekcioni autentifikoj tani ka formën e mëposhtme:
autentiko {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
digest
# Provoni autentikimin me një lidhje të drejtpërdrejtë LDAP:
Auth-Type LDAP {
ldap
if (ok) {
update reply {
# Krijo një atribut State rastësor:
State := "%{randstr:aaaaaaaaaaaaaaaa}"
Reply-Message := "Ju lutemi futni OTP"
}
# Kthe Access-Challenge:
challenge
}
}
pam
eap
}
Tani verifikimi i përdoruesit ndodh sipas algoritmit të mëposhtëm:
- Përdoruesi përshkruan kredencialet e domainit në klientin VPN.
- Freeradius verifikon vlefshmërinë e llogarisë dhe fjalëkalimin.
- Nëse fjalëkalimi është i saktë, dërgohet një kërkesë për token.
- Kryhet verifikimi i tokenit.
- Profit).
Burimi: habr.com




