Freeradius + Google Authenticator + LDAP + Fortigate

E se l'autenticazione a due fattori fosse sia desiderabile che spinosa, ma non ci sono soldi per i token hardware e in generale si offrono di rimanere di buon umore.

Questa soluzione non è qualcosa di super originale, ma piuttosto un mix di diverse soluzioni trovate su Internet.

Così dato

Nome di dominio Active Directory.

Utenti di dominio che lavorano attraverso una VPN, come molti oggi.

Agisce come un gateway VPN FortiGate.

Il salvataggio della password per il client VPN è proibito dalla politica di sicurezza.

Politica Fortinet in relazione ai tuoi token, non puoi chiamarlo meno di uno zhlob - ci sono fino a 10 token gratuiti, il resto - a un prezzo molto non kosher. Non ho considerato RSASecureID, Duo e simili, perché voglio l'open source.

Prerequisiti: хост * nix con stabilito FreeRADIUS, sss - entrato nel dominio, gli utenti del dominio possono facilmente autenticarsi su di esso.

Pacchetti aggiuntivi: scatola di shellina, fichitta, freeradius-ldap, carattere ribelli.tlf dal deposito https://github.com/xero/figlet-fonts.

Nel mio esempio - CentOS 7.8.

La logica di lavoro dovrebbe essere la seguente: quando ci si connette a una VPN, l'utente deve inserire un login di dominio e OTP invece di una password.

Configurazione dei servizi

В /etc/raddb/radiusd.conf solo l'utente e il gruppo per conto del quale inizia FreeRADIUS, dal momento che il servizio raggiato dovrebbe essere in grado di leggere i file in tutte le sottodirectory /casa/.

user = root
group = root

Per poter utilizzare i gruppi nelle impostazioni FortiGate, deve essere trasmesso Attributo specifico del fornitore. Per fare ciò, nella directory raddb/policy.d Creo un file con il seguente contenuto:

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

Dopo l'installazione raggio libero-ldap nella rubrica raddb/mods-disponibile file viene creato ldap.

È necessario creare un collegamento simbolico alla directory abilitato per raddb/mods.

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

Porto il suo contenuto in questa 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 file raddb/siti-abilitato/predefinito и raddb/sites-enabled/inner-tunnel nella sezione autorizzare Aggiungo il nome della policy da utilizzare - group_authorization. Un punto importante: il nome del criterio non è determinato dal nome del file nella directory politica.d, ma da una direttiva all'interno del file prima delle parentesi graffe.
Nella sezione autenticare negli stessi file è necessario decommentare la riga pam.

In archivio client.conf prescrivere i parametri con cui si collegherà FortiGate:

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

Configurazione del modulo pam.d/raggiod:

#%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 predefinite per l'implementazione del pacchetto FreeRADIUS с autenticatore google richiedere all'utente di inserire le credenziali nel formato: username / password+OTP.

Immaginando il numero di maledizioni che cadranno sulla testa, nel caso di utilizzo del pacchetto predefinito FreeRADIUS с Google Authenticator, si è deciso di utilizzare la configurazione del modulo pam in modo che solo il token possa essere controllato Google Authenticator.

Quando un utente si connette, accade quanto segue:

  • Freeradius controlla se l'utente è nel dominio e in un determinato gruppo e, in caso di successo, controlla il token OTP.

Tutto sembrava abbastanza buono fino al momento in cui ho pensato "Come posso registrare OTP per oltre 300 utenti?"

L'utente deve accedere al server con FreeRADIUS e da sotto il tuo account ed esegui l'applicazione Autenticatore di Google, che genererà un codice QR per l'applicazione per l'utente. È qui che entra in gioco l'aiuto. scatola di shellina in combinazione con .bash_profilo.

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

Il file di configurazione del demone si trova in /etc/sysconfig/shellinabox.
Specifico la porta 443 lì e puoi specificare il tuo certificato.

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

L'utente deve solo seguire il link, inserire i crediti del dominio e ricevere un codice QR per l'applicazione.

L'algoritmo è il seguente:

  • L'utente accede alla macchina tramite un browser.
  • Se l'utente del dominio è controllato. In caso contrario, non viene intrapresa alcuna azione.
  • Se l'utente è un utente di dominio, viene verificata l'appartenenza al gruppo Administrators.
  • Se non è un amministratore, controlla se Google Authenticator è configurato. In caso contrario, viene generato un codice QR e il logout dell'utente.
  • Se non è un amministratore e Google Authenticator è configurato, disconnettiti.
  • Se amministratore, controlla di nuovo Google Authenticator. Se non configurato, viene generato un codice QR.

Tutta la logica è fatta usando /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:

  • Creare Raggio-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Creiamo i gruppi necessari, se necessario, controllo degli accessi per gruppi. Nome del gruppo attivato FortiGate deve corrispondere al gruppo passato Attributo specifico del fornitore Nome-gruppo Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Modifica del necessario SSL-portali.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Aggiunta di gruppi ai criteri.

    Freeradius + Google Authenticator + LDAP + Fortigate

I vantaggi di questa soluzione:

  • È possibile autenticarsi tramite OTP su FortiGate soluzione opensource.
  • L'utente non inserisce una password di dominio durante la connessione tramite VPN, il che semplifica in qualche modo il processo di connessione. La password a 6 cifre è più facile da inserire rispetto a quella fornita dalla politica di sicurezza. Di conseguenza, il numero di ticket con oggetto: “Non riesco a connettermi alla VPN” diminuisce.

PS Abbiamo in programma di aggiornare questa soluzione a un'autentica autenticazione a due fattori con challenge-response.

Aggiornare:

Come promesso, l'ho ottimizzato per l'opzione di risposta alla sfida.
Quindi:
In archivio /etc/raddb/sites-enabled/default sezione autorizzare assomiglia a questo:

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
}

Секция autenticare ora assomiglia a questo:

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
}

Ora la verifica dell'utente avviene secondo il seguente algoritmo:

  • L'utente inserisce i crediti di dominio nel client VPN.
  • Freeradius controlla la validità dell'account e della password
  • Se la password è corretta, viene inviata una richiesta per un token.
  • Il token è in fase di verifica.
  • profitto).

Fonte: habr.com

Aggiungi un commento