Kuidas käituda, kui kahefaktoriline autentimine on vajalik, aga raha riistvara tokenite jaoks ei ole ning soovitatakse lihtsalt üritada head tuju hoida.
See lahendus ei ole midagi superoriginaalset, pigem on see segu erinevatest lahendustest, mida on internetist leitud.
Nii et on antud
Domeen Active Directory.
Domeeni kasutajad, kes töötavad VPN-i kaudu, nagu paljud praegu.
VPN-i väravana toimib Fortigate.
VPN- kliendi jaoks parooli salvestamine on turvapoliitika järgi keelatud.
Poliitika Fortinet oma tokenite osas ei ole vähem kui ahne — tasuta tokeneid on lausa 10 tükki, ülejäänud on väga kahtlase hinnaga. RSASecureID, Duo ja sarnaseid ma ei kaalunud, kuna soovin avatud lähtekoodiga lahendust.
Eeltingimused: host *nix installeeritud freeradius, sssd — on domeeni lisatud, domeeni kasutajad saavad seda probleemideta autentida.
Lisapakid: shellinabox, figlet, freeeradius-ldap, font rebel.tlf repoist .
Minu näites — CentOS 7.8.
Töö loogika on selline: VPN-i ühendamisel peab kasutaja sisestama domeeni sisselogimisnime ja OTP koos parooliga.
Teenuste seadistamine
Uues /etc/raddb/radiusd.conf muutub ainult kasutaja ja grupp, kelle nimel teenus käivitub freeradius, kuna teenus radiusd peab suutma lugeda faile kõigist alamkaustadest /home/.
user = root
group = root
Kuna gruppe tuleb seadetesse kasutada Fortigate, tuleb edastada Vendor Specific Attribute. Selleks loon kataloogis raddb/policy.d faili järgnevate sisudega:
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, Admin"
}
}
else {
update reply {
&Reply-Message := "VPN kasutamiseks ei ole õigusi"
}
reject
}
}
Pärast installeerimist freeradius-ldap kaustas raddb/mods-available luuakse fail ldap.
Tuleb luua sümboolne link katalooge raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldapViin 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 autoriseerida lisame poliitika nime, mida kasutatakse — group_authorization. Oluline punkt — poliitika nimi määratakse mitte faili nimega kaustas policy.d, vaid direktiiviga faili sees enne kõverate sulgude.
Jaotises autentimine nendes samades failides tuleb kommenteerimisrida eemaldada pam.
Failis clients.conf märkime parameetrid, millega otsitakse ühendust Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Moodi 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
Vaikimisi valikud freeradius jot google authenticator eeldavad, et kasutaja sisestab mandaadi järgmises formaadis: kasutajanimi/parool+OTP.
Kuna pean ette kujutama hulga needusi, mis mus silmaringi tuleb, kui kasutada vaikimisi seoseid freeradius jot Google Authenticator, siis otsustatakse kasutada mooduli konfiguratsiooni pam niimoodi, et kontrollitakse ainult tokeni olemasolu Google Authenticator.
Kasutaja ühendused toimuvad järgmiselt:
- Freeradius kontrollib kasutaja olemasolu domeenis ja kindlas grupis ning, kui see õnnestub, toimub OTP tokeni kontroll.
Kõik nägi piisavalt head välja, kuni ma ei mõelnud: "Kuidas registreerida OTP üle 300 kasutaja jaoks?"
Kasutaja peab sisenema serverisse freeradius ja oma kasutajakonto alt ja käivitama rakenduse Google authenticator, mis genereerib kasutaja jaoks QR-koodi rakenduse jaoks. Siin tuleb appi shellinabox koos .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Demon konfiguratsioonifail asub /etc/sysconfig/shellinabox.
Määran seal pordi 443 ja saan määrata oma sertifikaadi.
[root@freeradius ~]#systemctl enable --now shellinaboxdKasutajal jääb ainult minna lingile, sisestada domeeni mandaadid ja saada QR-kood rakenduse jaoks.
Algoritm on järgmine:
- Kasutaja siseneb masinasse brauseri kaudu.
- Kontrollitakse, kas kasutaja on domeenikasutaja. Kui ei, siis ei tehta mingeid toiminguid.
- Kui kasutaja on domeenikasutaja, kontrollitakse liikmelisust administraatorigruppidesse.
- Kui ei ole administraator, kontrollitakse, kas Google Autheticator on seadistatud. Kui ei, siis genereeritakse QR-kood ja kasutaja visatakse välja.
- Kui ei ole administraator ja Google Authenticator on seadistatud, siis lihtsalt logitakse välja.
- Kui on administraator, kontrollitakse uuesti Google Authenticatorit. Kui ei ole seadistatud, genereeritakse QR-kood.
Kogu loogika täidetakse 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 seadistamine:
- Loome Radius-server

- Loome vajalikud grupid, kui on vajalik juurdepääsugruppide eristamine. Grupinimi Fortigate peab vastama grupile, mis edastatakse Vendor Specific Attribute Fortinet-Group-Name.

- Redigeerime vajalikud SSL-portaalid.

- Lisame grupid poliitikutesse.

Selle lahenduse eelised:
- On võimalus autentida OTP kaudu Fortigate avatud lähtekoodiga lahendusega.
- Kasutaja domeeniparooli sisestamine VPN-iga ühendamisel välistatakse, mis lihtsustab ühendamise protsessi. 6-kohaline parool on lihtsam sisestada kui see, mis on ette nähtud turvapoliitikas. Selle tulemusena väheneb juhtumite arv teemaga: „Ei saa VPN-iga ühendust saada“.
P.S. Plaanis on seda lahendust täiustada täisväärtuslikuks kahe teguri autentimiseks koos challenge-response süsteemiga.
Uuendus:
Nagu lubatud, täiustasin selle challenge-response variandiks.
Nii:
Failis /etc/raddb/sites-enabled/default sektsioon autoriseerida on järgmisel kujul:
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, siis proksi päring:
group_authorization
}
pap
}
Jaotis autentimine on nüüd järgmine välimus:
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
digest
# Proovige autentimist otse LDAP-ist:
Auth-Type LDAP {
ldap
if (ok) {
update reply {
# Looge juhuslik State atribuut:
State := "%{randstr:aaaaaaaaaaaaaaaa}"
Reply-Message := "Palun sisestage OTP"
}
# Tagastage Access-Challenge:
challenge
}
}
pam
eap
}
Kasutaja kontrollimine toimub nüüd järgmise algoritmi järgi:
- Kasutaja sisestab domeeni mandaadid VPN-klientis.
- Freeradius kontrollib kontot ja parooli kehtivust
- Kui parool on õige, saadetakse token'i päring.
- Toimub token'i kontrollimine.
- Kasum).
Allikas: habr.com




