E se l'autentificazione à dui fattori hè à tempu desirabile è spinosa, ma ùn ci hè micca soldi per i tokens di hardware è in generale offrenu per stà in un bonu umore.
Sta suluzione ùn hè micca qualcosa di super originale, ma piuttostu un mischju di diverse suluzioni truvate in Internet.
Cusì datu
Domain Name Active Directory.
L'utilizatori di u duminiu chì travaglianu attraversu una VPN, cum'è parechji oghje.
Agisce cum'è una porta VPN Fortigate.
A salvezza di a password per u cliente VPN hè pruibita da a pulitica di sicurità.
Pulitica Fortinet in relazione à i vostri tokens, ùn pudete micca chjamà menu di un zhlob - ci sò quant'è 10 tokens gratuiti, u restu - à un prezzu assai micca kosher. Ùn aghju micca cunsideratu RSASecureID, Duo è simili, perchè vogliu open source.
Prerequisites: accoltu * nix cun stabilitu freeradius, ssd - intrutu in u duminiu, l'utilizatori di u duminiu ponu autentificà facilmente.
Pacchetti supplementari: scatula di shellina, figatellu, freeradius-ldap, font ribellu.tlf da u repository
In u mo esempiu - CentOS 7.8.
A logica di u travagliu deve esse cusì: quandu si cunnetta à una VPN, l'utilizatore deve inserisce un login di duminiu è OTP invece di una password.
Configurazione di servizii
В /etc/raddb/radiusd.conf solu l'utilizatore è u gruppu in nome di quale principia freeradius, dapoi u serviziu radiusd deve esse capaci di leghje i schedari in tutti i subdirectorii / casa /.
user = root
group = root
Per pudè utilizà i gruppi in i paràmetri Fortigate, deve esse trasmessa Attributu specificu di u venditore. Per fà questu, in u cartulare raddb/pulitica.d Creu un schedariu cù u seguente cuntenutu:
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
}
}
Dopu a stallazione freeradius-ldap in u cartulare raddb/mods-disponibili u schedariu hè creatu ldap.
Hè bisognu di creà un ligame simbolicu à u cartulare raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Aghju purtatu u so cuntenutu à sta forma:
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'
}
}
In i schedari raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel in rùbbrica auturizà Aghju aghjustatu u nome di a pulitica per esse utilizata - group_authorization. Un puntu impurtante - u nome di a pulitica ùn hè micca determinata da u nome di u schedariu in u cartulare pulitica.d, ma da una direttiva in u schedariu prima di i ricci.
In a rùbbrica autentificà in i stessi schedari avete bisognu di uncomment a linea Pam.
In u schedariu clienti.conf prescrive i paràmetri cù quale si cunnetta Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Configurazione di u modulu 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
Opzioni di implementazione di bundle predefinite freeradius с autentificazione Google richiede à l'utilizatore per inserisce credenziali in u formatu: nome d'utilizatore / password+OTP.
Immaginendu u numeru di maledizioni chì cascanu nantu à a testa, in u casu di utilizà u bundle predeterminatu freeradius с Google Authenticator, hè statu decisu di utilizà a cunfigurazione di u modulu Pam cusì chì solu u token pò esse verificatu Google Authenticator.
Quandu un utilizatore si cunnetta, succede ciò chì segue:
- Freeradius verifica se l'utilizatore hè in u duminiu è in un certu gruppu è, se successu, verifica u token OTP.
Tuttu pareva abbastanza bè finu à u mumentu chì aghju pensatu "Cumu possu registrà l'OTP per più di 300 utenti?"
L'utilizatore deve accede à u servitore cù freeradius è da sottu à u vostru contu è eseguite l'applicazione Google Authenticator, chì generà un codice QR per l'applicazione per l'utilizatore. Questu hè induve l'aiutu vene. scatula di shellina in cumbinazione cù .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
U schedariu di cunfigurazione daemon hè situatu à /etc/sysconfig/shellinabox.
I specificà u portu 443 quì è pudete specificà u vostru certificatu.
[root@freeradius ~]#systemctl enable --now shellinaboxd
L'utilizatore solu deve seguità u ligame, inserisce crediti di duminiu è riceve un codice QR per l'applicazione.
L'algoritmu hè u seguente:
- L'utilizatore accede à a macchina attraversu un navigatore.
- Se l'utilizatore di u duminiu hè verificatu. Se no, allora ùn ci hè micca azzione.
- Se l'utilizatore hè un utilizatore di duminiu, l'appartenenza à u gruppu Amministratori hè verificata.
- Se ùn hè micca un amministratore, verifica se Google Authenticator hè cunfiguratu. Se no, allora un codice QR è un logout d'utilizatore hè generatu.
- Se ùn hè micca un amministratore è Google Authenticator hè cunfiguratu, allora solu logout.
- Se amministratore, verificate di novu Google Authenticator. Se ùn hè micca cunfiguratu, un codice QR hè generatu.
Tutta a logica hè fatta usendu /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
Configurazione di Fortigate:
- Creemu raghju-servitore
- Creemu i gruppi necessarii, se ne necessariu, cuntrollu di accessu per gruppi. U nome di u gruppu Fortigate deve currisponde à u gruppu chì hè passatu Attributu specificu di u venditore Fortinet-Gruppu-Nome.
- Editendu u necessariu SSL- portali.
- Aghjunghje gruppi à e pulitiche.
I vantaghji di sta suluzione:
- Hè pussibule autentificà per OTP Fortigate suluzione open source.
- L'utilizatore ùn inserisce micca una password di duminiu quandu si cunnetta via VPN, chì simplificà un pocu u prucessu di cunnessione. A password di 6 cifre hè più faciule d'introduce da quella furnita da a pulitica di sicurità. In u risultatu, u numeru di biglietti cù u sughjettu: "Ùn possu micca cunnette à a VPN" diminuite.
PS Avemu pensatu à aghjurnà sta suluzione à una autentificazione di dui fattori cumpleta cù sfida-risposta.
aghjuntu:
Cum'è prumessu, aghju aghjustatu à l'opzione sfida-risposta.
So:
In u schedariu /etc/raddb/sites-enabled/default sezione auturizà Hè cum'è a siguenti manera:
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
}
Sezione autentificà avà pare cusì:
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
}
Avà a verificazione di l'utilizatori si faci secondu l'algoritmu seguente:
- L'utilizatore entra in crediti di duminiu in u cliente VPN.
- Freeradius verifica a validità di u contu è a password
- Se a password hè curretta, allora una dumanda per un token hè mandatu.
- U token hè verificatu.
- prufittu).
Source: www.habr.com