Freeradius + Google Authenticator + LDAP + Fortigate

Ce se întâmplă dacă autentificarea cu doi factori este deopotrivă de dorit și înțepător, dar nu există bani pentru jetoanele hardware și, în general, acestea oferă să rămână într-o dispoziție bună.

Această soluție nu este ceva super original, ci mai degrabă un mix de soluții diferite găsite pe Internet.

Deci dat

Numele de domeniu Active Directory.

Utilizatori de domeniu care lucrează printr-un VPN, ca mulți în prezent.

Acționează ca un gateway VPN Fortificați.

Salvarea parolei pentru clientul VPN este interzisă de politica de securitate.

Politică Fortinet în legătură cu propriile jetoane, nu îl puteți numi mai puțin de un zhlob - există până la 10 jetoane gratuite, restul - la un preț foarte nekosher. Nu am luat în considerare RSASecureID, Duo și altele asemenea, pentru că vreau open source.

Cerințe preliminare: gazdă *nix cu stabilit rază liberă, ssd - introdus în domeniu, utilizatorii domeniului se pot autentifica cu ușurință pe acesta.

Pachete suplimentare: Shellinabox, smochină, freeradius-ldap, font rebel.tlf din depozit https://github.com/xero/figlet-fonts.

În exemplul meu - CentOS 7.8.

Logica de lucru ar trebui să fie următoarea: atunci când se conectează la un VPN, utilizatorul trebuie să introducă o autentificare de domeniu și OTP în loc de o parolă.

Configurarea serviciilor

В /etc/raddb/radiusd.conf numai utilizatorul și grupul în numele cărora începe rază liberă, de la serviciu radiusd ar trebui să poată citi fișierele din toate subdirectoarele /Acasă/.

user = root
group = root

Pentru a putea folosi grupuri în setări Fortificați, trebuie transmis Atribut specific furnizorului. Pentru a face acest lucru, în director raddb/politică.d Creez un fișier cu următorul conținut:

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
        }
}

După instalare freeradius-ldap în director raddb/mods-available fișierul este creat ldap.

Trebuie să creați o legătură simbolică către director raddb/mods-activat.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Îi aduc conținutul în acest formular:

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'
        }
}

În dosare raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel in sectiune autoriza Adaug numele politicii de utilizat - group_authorization. Un punct important - numele politicii nu este determinat de numele fișierului din director politica.d, dar printr-o directivă în interiorul fișierului înaintea acoladelor.
In sectiunea autentifica în aceleași fișiere trebuie să decomentați linia pam.

În dosar clienti.conf prescrie parametrii cu care se va conecta Fortificați:

client fortigate {
    ipaddr = 192.168.1.200
    secret = testing123
    require_message_authenticator = no
    nas_type = other
}

Configurarea modulului 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

Opțiuni implicite de implementare a pachetului rază liberă с google autentificare solicitați utilizatorului să introducă acreditările în formatul: nume utilizator, parola+OTP.

Prin imaginarea numărului de blesteme care vor cădea pe cap, în cazul utilizării pachetului implicit rază liberă с Google Authenticator, s-a decis să se utilizeze configurația modulului pam astfel încât doar jetonul să poată fi verificat Google Authenticator.

Când un utilizator se conectează, se întâmplă următoarele:

  • Freeradius verifică dacă utilizatorul se află în domeniu și într-un anumit grup și, dacă are succes, verifică jetonul OTP.

Totul arăta suficient de bine până în momentul în care m-am gândit „Cum pot înregistra OTP pentru peste 300 de utilizatori?”

Utilizatorul trebuie să se autentifice la server cu rază liberă și de sub contul dvs. și rulați aplicația Autentificator Google, care va genera un cod QR pentru aplicație pentru utilizator. Aici intervine ajutorul. Shellinabox in combinatie cu .bash_profile.

[root@freeradius ~]# yum install -y shellinabox

Fișierul de configurare a demonului se află la /etc/sysconfig/shellinabox.
Specific portul 443 acolo și poți specifica certificatul tău.

[root@freeradius ~]#systemctl enable --now shellinaboxd

Utilizatorul trebuie doar să urmeze linkul, să introducă credite de domeniu și să primească un cod QR pentru aplicație.

Algoritmul este după cum urmează:

  • Utilizatorul se conectează la aparat printr-un browser.
  • Dacă utilizatorul domeniului este verificat. Dacă nu, atunci nu se ia nicio măsură.
  • Dacă utilizatorul este un utilizator de domeniu, apartenența la grupul Administratori este bifată.
  • Dacă nu este un administrator, verifică dacă Google Authenticator este configurat. Dacă nu, atunci se generează un cod QR și deconectarea utilizatorului.
  • Dacă nu este configurat un administrator și Google Authenticator, atunci pur și simplu deconectați-vă.
  • Dacă este administrator, verificați din nou Google Authenticator. Dacă nu este configurat, este generat un cod QR.

Toată logica se face folosind /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

Fortificați configurarea:

  • Noi creăm Rază-Server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Creăm grupurile necesare, dacă este necesar, control acces pe grupuri. Numele grupului este activat Fortificați trebuie să se potrivească cu grupul care este transmis Atribut specific furnizorului Fortinet-Group-Nume.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Editarea necesarului SSL-portale.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Adăugarea de grupuri la politici.

    Freeradius + Google Authenticator + LDAP + Fortigate

Avantajele acestei soluții:

  • Este posibilă autentificarea prin OTP Fortificați soluție open source.
  • Utilizatorul nu introduce o parolă de domeniu atunci când se conectează prin VPN, ceea ce simplifică oarecum procesul de conectare. Parola din 6 cifre este mai ușor de introdus decât cea prevăzută de politica de securitate. Ca urmare, numărul de bilete cu subiectul: „Nu mă pot conecta la VPN” scade.

PS Intenționăm să facem upgrade la această soluție la o autentificare completă cu doi factori, cu răspuns la provocare.

Actualizați:

După cum am promis, l-am adaptat la opțiunea provocare-răspuns.
Deci:
În dosar /etc/raddb/sites-enabled/default secțiune autoriza este după cum urmează:

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
}

Secțiune autentifica acum arata asa:

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
}

Acum, verificarea utilizatorului are loc conform următorului algoritm:

  • Utilizatorul introduce credite de domeniu în clientul VPN.
  • Freeradius verifică valabilitatea contului și a parolei
  • Dacă parola este corectă, atunci se trimite o solicitare pentru un token.
  • Jetonul este în curs de verificare.
  • profit).

Sursa: www.habr.com

Adauga un comentariu