Co když je dvoufaktorová autentizace žádoucí i pichlavá, ale na hardwarové tokeny nejsou peníze a obecně nabízejí udržení dobré nálady.
Toto řešení není něco super originálního, ale spíše mix různých řešení nalezených na internetu.
Tak daný
Domén Active Directory.
Uživatelé domény pracující přes VPN, jako mnozí dnes.
Funguje jako brána VPN Opevnit se.
Uložení hesla pro klienta VPN je zakázáno zásadami zabezpečení.
Politika Fortinet ve vztahu k vašim vlastním tokenům to nemůžete nazvat méně než zhlob – existuje až 10 bezplatných tokenů, zbytek – za velmi nekošer cenu. Neuvažoval jsem o RSASecureID, Duo a podobně, protože chci open source.
Předpoklady: host * nix se zavedenými freeradius, ssd - zadáno do domény, uživatelé domény se na ní mohou snadno autentizovat.
Další balíčky: Shellina box, fílek, freeradius-ldap, písmo rebel.tlf z úložiště
V mém příkladu - CentOS 7.8.
Logika práce má být následující: při připojení k VPN musí uživatel místo hesla zadat doménové přihlášení a OTP.
Nastavení služeb
В /etc/raddb/radiusd.conf pouze uživatel a skupina, jejichž jménem začíná freeradius, od služby rádiusd by měl být schopen číst soubory ve všech podadresářích /Domov/.
user = root
group = root
Aby bylo možné používat skupiny v nastavení Opevnit se, musí být přenášeny Specifický atribut dodavatele. Chcete-li to provést, v adresáři raddb/policy.d Vytvořím soubor s následujícím obsahem:
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
}
}
Po instalaci freeradius-ldap v adresáři raddb/mods-dostupné soubor je vytvořen LDAP.
Je třeba vytvořit symbolický odkaz na adresář povoleno raddb/mods.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Jeho obsah přináším do tohoto formuláře:
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'
}
}
V souborech raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel v sekci povolit Přidám název zásady, která se má použít - group_authorization. Důležitý bod - název zásady není určen názvem souboru v adresáři politika.d, ale direktivou uvnitř souboru před složenými závorkami.
V sekci ověřit ve stejných souborech musíte odkomentovat řádek pam.
V souboru client.conf předepsat parametry, se kterými se bude spojovat Opevnit se:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Konfigurace 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
Výchozí možnosti implementace balíčku freeradius с google authenticator vyžadovat, aby uživatel zadal přihlašovací údaje ve formátu: uživatelské jméno heslo+OTP.
Představením si počtu kleteb, které padnou na hlavu, v případě použití výchozího svazku freeradius с Google Authenticator, bylo rozhodnuto použít konfiguraci modulu pam aby bylo možné zkontrolovat pouze token Google Authenticator.
Když se uživatel připojí, dojde k následujícímu:
- Freeradius zkontroluje, zda uživatel existuje v doméně a v určité skupině a v případě úspěchu zkontroluje OTP token.
Všechno vypadalo dost dobře až do okamžiku, kdy jsem si pomyslel: „Jak mohu zaregistrovat OTP pro 300+ uživatelů?
Uživatel se musí přihlásit k serveru pomocí freeradius a z vašeho účtu a spusťte aplikaci Google autentizátor, který uživateli vygeneruje QR kód aplikace. Zde přichází na řadu pomoc. Shellina box v kombinaci s .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Konfigurační soubor démona se nachází na adrese /etc/sysconfig/shellinabox.
Uvádím tam port 443 a můžete zadat svůj certifikát.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Uživateli stačí následovat odkaz, zadat kredity domény a získat QR kód pro aplikaci.
Algoritmus je následující:
- Uživatel se přihlásí do stroje prostřednictvím prohlížeče.
- Zda je zaškrtnutý uživatel domény. Pokud ne, neprovede se žádná akce.
- Pokud je uživatel doménovým uživatelem, je zaškrtnuto členství ve skupině Administrators.
- Pokud se nejedná o správce, zkontroluje, zda je Google Authenticator nakonfigurován. Pokud ne, vygeneruje se QR kód a odhlášení uživatele.
- Pokud nemáte správce a je nakonfigurován Google Authenticator, stačí se odhlásit.
- Pokud jste správcem, zkontrolujte znovu Google Authenticator. Pokud není nakonfigurován, vygeneruje se QR kód.
Veškerá logika se provádí pomocí /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
Posílené nastavení:
- tvoříme Poloměr-server
- Vytvoříme potřebné skupiny, v případě potřeby řízení přístupu po skupinách. Název skupiny zapnut Opevnit se musí odpovídat skupině, která je předána Specifický atribut dodavatele Fortinet-Group-Name.
- Úprava potřebného SSL- portály.
- Přidávání skupin do zásad.
Výhody tohoto řešení:
- Je možné autentizovat pomocí OTP na Opevnit se open source řešení.
- Uživatel při připojení přes VPN nezadává heslo domény, což poněkud zjednodušuje proces připojení. Zadání 6místného hesla je snazší než to, které poskytuje bezpečnostní politika. V důsledku toho klesá počet lístků s předmětem: „Nemohu se připojit k VPN“.
PS Plánujeme upgradovat toto řešení na plnohodnotnou dvoufaktorovou autentizaci s výzvou-odpověď.
aktualizace:
Jak jsem slíbil, vylepšil jsem to na možnost výzva-odpověď.
Takže:
V souboru /etc/raddb/sites-enabled/default sekce povolit je následující:
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
}
část ověřit teď to vypadá takto:
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
}
Nyní proběhne ověření uživatele podle následujícího algoritmu:
- Uživatel zadá kredity domény v klientovi VPN.
- Freeradius kontroluje platnost účtu a hesla
- Pokud je heslo správné, je odeslána žádost o token.
- Token se ověřuje.
- zisk).
Zdroj: www.habr.com