Mis siis, et kahefaktoriline autentimine on ühtaegu ihaldusväärne ja torkiv, aga riistvaraliste žetoonide jaoks raha pole ja üldiselt pakuvad need hea tuju hoidmist.
See lahendus pole midagi ülioriginaalset, vaid pigem segu erinevatest internetist leitud lahendustest.
Nii antud
Domeeninimi Active Directory.
VPN-i kaudu töötavad domeenikasutajad, nagu paljud tänapäeval.
Toimib VPN-lüüsina Tugevdada.
VPN-kliendi parooli salvestamine on turvapoliitikaga keelatud.
Poliitika Fortinet seoses oma žetoonidega ei saa te seda nimetada vähemaks kui zhlob - tasuta žetoone on tervelt 10, ülejäänud - väga mitte-kosher hinnaga. Ma ei arvestanud RSASecureID, Duo ja muu sarnasega, kuna tahan avatud lähtekoodiga.
Eeltingimused: võõrustaja * nix koos väljakujunenud freeradius, ssd - sisestatud domeeni, domeeni kasutajad saavad sellel hõlpsalt autentida.
Lisapaketid: shellina karp, figuur, freeradius-ldap, font mässaja.tlf hoidlast
Minu näites - CentOS 7.8.
Töö loogika peaks olema järgmine: VPN-iga ühenduse loomisel peab kasutaja sisestama parooli asemel domeeni sisselogimise ja OTP.
Teenuste seadistamine
В /etc/raddb/radiusd.conf ainult kasutaja ja grupp, kelle nimel alustab freeradius, alates teenusest raadius peaks suutma lugeda faile kõigis alamkataloogides /Kodu/.
user = root
group = root
Et saaks seadetes gruppe kasutada Tugevdada, tuleb edastada Tarnija spetsiifiline atribuut. Selleks kataloogis raddb/policy.d Loon järgmise sisuga faili:
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
}
}
Pärast paigaldamist freeradius-ldap kataloogis raddb/mods-saadaval fail luuakse ldap.
Peate looma sümboolse lingi kataloogi raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Toon selle sisu sellele vormile:
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 и raddb/sites-enabled/inner-tunnel jaotises volitada Lisan kasutatava poliitika nimetuse - group_authorization. Oluline punkt - poliitika nime ei määra kataloogis oleva faili nimi poliitika.d, kuid käskkirjaga faili sees enne lokkis sulgusid.
Jaotises autentida samades failides peate rea kommentaarid tühistama pam.
Failis clients.conf määrake parameetrid, millega see ühendatakse Tugevdada:
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
Vaikimisi kogumi juurutamise valikud freeradius с google autentimistarkvara nõuda kasutajalt mandaatide sisestamist vormingus: kasutajanimi Parool+OTP.
Kujutades ette vaikekimbu kasutamise korral pähe langevate needuste arvu freeradius с Google Authenticator, otsustati kasutada mooduli konfiguratsiooni pam et saaks kontrollida ainult märgi Google Authenticator.
Kui kasutaja ühenduse loob, juhtub järgmine:
- Freeradius kontrollib, kas kasutaja on domeenis ja teatud grupis olemas ning kui see õnnestub, siis kontrollitakse OTP-märki.
Kõik tundus piisavalt hea kuni hetkeni, mil mõtlesin "Kuidas saan registreerida OTP-d 300+ kasutajale?"
Kasutaja peab serverisse sisse logima, kasutades freeradius ja oma konto alt ning käivitage rakendus Google'i autentija, mis genereerib kasutajale rakenduse jaoks QR-koodi. Siit tulebki abi. shellina karp koos .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Deemoni konfiguratsioonifail asub aadressil /etc/sysconfig/shellinabox.
Määran seal pordi 443 ja saate määrata oma sertifikaadi.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Kasutajal on vaja ainult linki jälgida, domeeni krediiti sisestada ja rakenduse jaoks saada QR-kood.
Algoritm on järgmine:
- Kasutaja logib masinasse sisse brauseri kaudu.
- Kas domeeni kasutaja on kontrollitud. Kui ei, siis meetmeid ei võeta.
- Kui kasutaja on domeeni kasutaja, on administraatorite grupi liikmelisus märgitud.
- Kui see pole administraator, kontrollib see, kas Google Authenticator on konfigureeritud. Kui ei, siis genereeritakse QR-kood ja kasutaja väljalogimine.
- Kui pole administraatorit ja Google Authenticator on konfigureeritud, logige lihtsalt välja.
- Kui olete administraator, kontrollige uuesti Google Authenticatorit. Kui see pole konfigureeritud, luuakse QR-kood.
Kogu loogika on tehtud kasutades /etc/skel/.bash_profile.
kass /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
Tugevdage seadistust:
- Meie loome raadius-server
- Loome vajalikud rühmad, vajadusel juurdepääsukontrolli gruppide kaupa. Grupi nimi sisse lülitatud Tugevdada peab vastama edasipääsetavale grupile Tarnija spetsiifiline atribuut Fortinet-rühma nimi.
- Vajaliku toimetamine SSL- portaalid.
- Rühmade lisamine poliitikasse.
Selle lahenduse eelised:
- On võimalik autentida OTP kaudu Tugevdada avatud lähtekoodiga lahendus.
- Kasutaja ei sisesta VPN-i kaudu ühenduse loomisel domeeni parooli, mis mõnevõrra lihtsustab ühendusprotsessi. 6-kohalist parooli on lihtsam sisestada kui turvapoliitikas pakutavat. Selle tulemusel väheneb piletite arv teemaga "Ma ei saa VPN-iga ühendust".
PS Plaanime selle lahenduse uuendada täisväärtuslikuks kahefaktoriliseks autentimiseks väljakutse-vastusega.
Värskenda:
Nagu lubatud, kohandasin selle väljakutse-vastuse valikule.
Nii et:
Failis /etc/raddb/sites-enabled/default osa volitada on järgmine:
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
}
Jagu autentida nüüd näeb välja selline:
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
}
Nüüd toimub kasutaja kontrollimine järgmise algoritmi järgi:
- Kasutaja sisestab VPN-kliendi domeenikrediiti.
- Freeradius kontrollib konto ja parooli kehtivust
- Kui parool on õige, saadetakse taotlus loa saamiseks.
- Token on kontrollimisel.
- kasum).
Allikas: www.habr.com