Čo ak je dvojfaktorová autentifikácia žiaduca aj pichľavá, no nie sú peniaze na hardvérové tokeny a vo všeobecnosti ponúkajú dobrú náladu.
Toto riešenie nie je niečo super originálne, ale skôr mix rôznych riešení nájdených na internete.
Tak dané
Домен Active Directory.
Používatelia domény pracujúci prostredníctvom VPN, ako mnohí dnes.
Funguje ako brána VPN Fortigate.
Bezpečnostná politika zakazuje ukladanie hesla pre klienta VPN.
politika Fortinet v súvislosti s vašimi vlastnými tokenmi to nemôžete nazvať menej ako zhlob - existuje až 10 bezplatných tokenov, zvyšok - za veľmi nekóšer cenu. Neuvažoval som nad RSASecureID, Duo a podobne, pretože chcem open source.
Predpoklady: hostiteľ * nix so zavedeným freeradius, ssd - zadané do domény, používatelia domény sa na nej môžu jednoducho autentifikovať.
Dodatočné balíčky: škatuľka shellina, fígeľ, freeradius-ldap, písmo rebel.tlf z úložiska
V mojom príklade - CentOS 7.8.
Logika práce má byť nasledovná: pri pripájaní k VPN musí používateľ namiesto hesla zadať prihlasovacie meno domény a OTP.
Nastavenie služieb
В /etc/raddb/radiusd.conf iba používateľ a skupina, v mene ktorej začína freeradius, od služby polomer by mal byť schopný čítať súbory vo všetkých podadresároch /Domov/.
user = root
group = root
Aby ste mohli používať skupiny v nastaveniach Fortigate, musí byť prenesená Špecifický atribút dodávateľa. Ak to chcete urobiť, v adresári raddb/policy.d Vytvorím súbor s nasledujúcim obsahom:
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 inštalácii freeradius-ldap v adresári raddb/mods-dostupné súbor je vytvorený ldap.
Je potrebné vytvoriť symbolický odkaz na adresár povolený raddb/mods.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Jeho obsah prinášam do tohto formulára:
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 súboroch raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel v sekcii povoliť Pridávam názov politiky, ktorá sa má použiť - group_authorization. Dôležitý bod - názov politiky nie je určený názvom súboru v adresári politika.d, ale direktívou vo vnútri súboru pred zloženými zátvorkami.
V sekcii overiť v rovnakých súboroch musíte odkomentovať riadok pam.
V súbore klienti.conf predpísať parametre, s ktorými sa bude spájať Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Konfigurácia 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
Predvolené možnosti implementácie balíka freeradius с autentifikátor Google vyžadovať, aby používateľ zadal prihlasovacie údaje vo formáte: užívateľské meno/heslo+OTP.
Predstavením si množstva kliatieb, ktoré padnú na hlavu, v prípade použitia predvoleného zväzku freeradius с Google Authenticator, bolo rozhodnuté použiť konfiguráciu modulu pam aby bolo možné skontrolovať iba token Google Authenticator.
Keď sa používateľ pripojí, stane sa toto:
- Freeradius skontroluje, či je používateľ v doméne a v určitej skupine a v prípade úspechu skontroluje OTP token.
Všetko vyzeralo dosť dobre až do momentu, keď som si pomyslel: „Ako môžem zaregistrovať jednorazové heslo pre viac ako 300 používateľov?
Používateľ sa musí prihlásiť na server pomocou freeradius a zo svojho účtu a spustite aplikáciu Google autentifikátor, ktorý používateľovi vygeneruje QR kód aplikácie. Tu prichádza na rad pomoc. škatuľka shellina v kombinácii s .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Konfiguračný súbor démona sa nachádza na adrese /etc/sysconfig/shellinabox.
Uvádzam tam port 443 a môžete zadať svoj certifikát.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Používateľovi stačí nasledovať odkaz, zadať kredity domény a získať QR kód pre aplikáciu.
Algoritmus je nasledujúci:
- Používateľ sa prihlási do stroja cez prehliadač.
- Či je začiarknutý používateľ domény. Ak nie, nepodniknú sa žiadne kroky.
- Ak je používateľ doménovým používateľom, je začiarknuté členstvo v skupine Administrators.
- Ak nie je správcom, skontroluje, či je Google Authenticator nakonfigurovaný. Ak nie, vygeneruje sa QR kód a odhlásenie používateľa.
- Ak nemáte správcu a je nakonfigurovaný Google Authenticator, stačí sa odhlásiť.
- Ak ste správcom, znova skontrolujte aplikáciu Google Authenticator. Ak nie je nakonfigurovaný, vygeneruje sa QR kód.
Celá logika sa vykonáva pomocou /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
Posilňujúce nastavenie:
- tvoríme Polomer-server
- Vytvárame potrebné skupiny, v prípade potreby riadenie prístupu podľa skupín. Názov skupiny je zapnutý Fortigate musí zodpovedať skupine, do ktorej je odovzdaná Špecifický atribút dodávateľa Fortinet-Group-Name.
- Úprava potrebného SSL- portály.
- Pridávanie skupín do politík.
Výhody tohto riešenia:
- Autentifikácia pomocou OTP je možná zapnutá Fortigate open source riešenie.
- Používateľ pri pripájaní cez VPN nezadáva heslo domény, čo trochu zjednodušuje proces pripojenia. 6-miestne heslo sa zadáva jednoduchšie ako heslo, ktoré poskytuje bezpečnostná politika. V dôsledku toho klesá počet lístkov s predmetom: „Nemôžem sa pripojiť k VPN“.
PS Plánujeme upgradovať toto riešenie na plnohodnotnú dvojfaktorovú autentifikáciu s výzvou-odpoveď.
Update:
Ako som sľúbil, vylepšil som to na možnosť výzva-reakcia.
Takže:
V súbore /etc/raddb/sites-enabled/default oddiele povoliť je nasledovné:
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
}
časť overiť teraz to vyzerá 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
}
Teraz sa overenie používateľa uskutoční podľa nasledujúceho algoritmu:
- Používateľ zadá kredity domény v klientovi VPN.
- Freeradius kontroluje platnosť účtu a hesla
- Ak je heslo správne, odošle sa žiadosť o token.
- Token sa overuje.
- zisk).
Zdroj: hab.com