Kuidas käituda, kui kahefaktoriline autentimine on vajalik, kuid raha riistvaralistest tokenitest pole ja pakutakse lihtsalt heatahtlikku meeleolu hoidmist.
See lahendus ei ole midagi ülioriginaalset, pigem segu erinevatest lahendustest, mis leitud internetiavarustest.
Nii et, antud
Domeen Active Directory.
Domeeni kasutajad, kes töötavad VPN-i kaudu, nagu paljud tänapäeval.
VPN-i värava rollis on Fortigate.
Parooli salvestamine VPN-i kliendi jaoks on keelatud turvapoliitika tõttu.
Poliitika Fortinet oma tokenite suhtes ei saa nimetada vähem kui ahneks — tasuta tokeneid on tervelt 10, ülejäänud aga väga ebaausate hindadega. RSASecureID, Duo ja neile sarnastele ei vaadanud, kuna eelistan avatud lähtekoodi.
Eeltingimused: host *nix paigaldatuga freeradius, sssd — on domeeni sisse viidud ja domeeni kasutajad saavad sellega rahulikult autentida.
Lisapakid: shellinabox, figlet, freeeradius-ldap, font rebel.tlf hoidlast .
Minu näites — CentOS 7.8.
Töölogika eeldab järgmist: VPN-iga ühendudes peab kasutaja sisestama domeenilogini ja OTP parooli asemel.
Teenuste seadistamine
V /etc/raddb/radiusd.conf muutuvad ainult kasutaja ja grupp, kelle nimel käivitatakse freeradius, kuna teenus radiusd peab suutma lugeda faile kõigist alamkaustadest /home/.
user = root
group = root
Kuna gruppe tuleb seadistustes kasutada Fortigate, tuleb edastada Müüja Spetsiifiline Atribuut. Sel eesmärgil kaustas raddb/policy.d loodan faili järgmise sisuga:
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 := "Tere tulemast, administraator"
}
}
else {
update reply {
&Reply-Message := "Ei ole volitatud vpn kasutamiseks"
}
reject
}
}
Pärast installimist freeradius-ldap kaustas raddb/mods-available loodakse fail ldap.
Peab looma sümboolse lingi katalooge raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldapMuudan selle sisu selliseks:
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'
}
} Failides raddb/sites-enabled/default ja raddb/sites-enabled/inner-tunnel jaotises authorize lisame grupi autoriseerimise määramine — group_authorization. Oluline detail — määramine süsivesiku nime järgi, mitte kausta nime järgi policy.d, aga direktiiviga failis enne sulgude avamist.
jaotises authenticate nendes failides tuleb kommenteerida välja rida pam.
Failis clients.conf defineerime parameetrid, millega ühendust luuakse Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Mooduli konfiguratsioon 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
Vaikesed ühendamisvõimalused freeradius koos google authenticator eeldavad kasutaja sisestamist andmeid järgmisel kujul: kasutajanimi/parool+OTP.
Kui palju needuse peaks pähe sadama, kui kasutada vaikeühendust, freeradius koos Google Authenticator, siis otsustati kasutada mooduli konfiguratsiooni pam nii, et kontrollitakse ainult märki Google Authenticator.
Kasutaja ühendamisel toimub järgmist:
- Freeradius kontrollib, kas kasutaja asub domeenis ja kindlas grupis ning, kui see õnnestub, toimub OTP-märgi kontroll.
Kõik näis üsna hästi minevat, kuni ma ei hakanud mõtlema: "Kuidas registreerida OTP 300+ kasutaja jaoks?"
Kasutaja peab serverisse sisse logima freeradius oma kontolt ja käivitama rakenduse Google authenticator, mis genereerib kasutajale rakenduse QR-koodi. Siin tuleb appi shellinabox koos .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Demonite konfiguratsioonifail asub /etc/sysconfig/shellinabox.
Määran port 443 ja saan lisada oma sertifikaadi.
[root@freeradius ~]#systemctl enable --now shellinaboxdKasutajale jääb vaid linki minna, domeeni mandaate sisestada ja rakenduse QR-kood saada.
Algrütm on järgmine:
- Kasutaja logib masina kaudu brauseriga sisse.
- Kontrollitakse, kas kasutaja on domeeniline. Kui ei, siis ei tehta mingeid samme.
- Kui kasutaja on domeeniline, kontrollitakse, kas ta kuulub administraatorite gruppi.
- Kui ei ole administraator, kontrollitakse, kas Google Autheticator on seadistatud. Kui ei, genereeritakse QR-kood ja kasutaja logitakse välja.
- Kui ei ole administraator ja Google Authenticator on seadistatud, logitakse lihtsalt välja.
- Kui on administraator, siis kontrollitakse taas Google Authenticatorit. Kui see ei ole seadistatud, genereeritakse QR-kood.
Kõik loogika teostatakse kasutades /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
Fortigate seadistus:
- Loome Raadius-server

- Loome vajalikud grupid, vajadusel juurdepääsu rikkaunistamiseks. Grupi nimi Fortigate peab vastama grupile, mis edastatakse Müüja Spetsiifiline Atribuut Fortinet-Group-Name.

- Redigeerime vajalikud SSL-portaalid.

- Lisame grupid poliitikatesse.

Selle lahenduse eelised:
- On võimalik autentida OTP kaudu Fortigate avatud lähtekoodiga lahendusele.
- Domeeniparooli sisenemine kasutaja poolt VPN-i ühendamisel on välistatud, mis lihtsustab ühenduse loomise protsessi. 6-kohaline parool on lihtsam sisestada kui see, mis on ette nähtud turvapoliitikas. Seetõttu väheneb piletite arv teemaga: „Ei saa VPN-iga ühendust”.
P.S. Plaanides on see lahendus täiendada täieliku kahefaasilise autentimisega challenge-response meetodiga.
Uuendus:
Nagu lubatud, täiendasin siiski versiooni challenge-response meetodiga.
Nii et:
Failis /etc/raddb/sites-enabled/default sektsioon authorize see näeb välja järgmine:
authorize {
filter_username
preprocess
auth_log
chap
mschap
suffix
eap {
ok = return
}
files
-sql
#-ldap
expiration
logintime
if (!State) {
if (&User-Password) {
# Kui !State ja User-Password (PAP), siis sunni LDAP:
update control {
Ldap-UserDN := "%{User-Name}"
Auth-Type := LDAP
}
}
else {
reject
}
}
else {
# Kui State on olemas, siis proksi päring:
group_authorization
}
pap
}
Sektsioon authenticate on nüüd järgmine:
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
digest
# Proovi autentimist otsese LDAP sidumisega:
Auth-Type LDAP {
ldap
if (ok) {
update reply {
# Loo juhuslik State atribuut:
State := "%{randstr:aaaaaaaaaaaaaaaa}"
Reply-Message := "Palun sisestage OTP"
}
# Tagasta Access-Challenge:
challenge
}
}
pam
eap
}
Nüüd toimub kasutaja kontroll järgmise algoritmi järgi:
- Kasutaja sisestab domeeni mandaadid VPN-kliendis.
- Freeradius kontrollib konto ja parooli kehtivust.
- Kui parool on õige, saadetakse päring token'i kohta.
- Tokeni kontrollimine on käimas.
- Tulu).
Allikas: habr.com




