Freeradius + Google Authenticator + LDAP + Fortigate

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 https://github.com/xero/figlet-fonts.

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

    Freeradius + Google Authenticator + LDAP + Fortigate

  • 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.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Editendu u necessariu SSL- portali.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Aghjunghje gruppi à e pulitiche.

    Freeradius + Google Authenticator + LDAP + Fortigate

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

Add a comment