Freeradius + Google Authenticator + LDAP + Fortigate

Què passa si l'autenticació de dos factors és tant desitjable com espinosa, però no hi ha diners per a fitxes de maquinari i, en general, ofereixen mantenir-se de bon humor.

Aquesta solució no és quelcom super original, sinó una barreja de diferents solucions que es troben a Internet.

Així donat

Nom del domini Active Directory.

Usuaris de domini que treballen mitjançant una VPN, com molts d'avui.

Actua com a passarel·la VPN Fortificar.

Desar la contrasenya per al client VPN està prohibit per la política de seguretat.

Política Fortinet en relació amb els vostres propis fitxes, no podeu anomenar-lo menys que un zhlob: hi ha fins a 10 fitxes gratuïtes, la resta, a un preu molt no kosher. No vaig considerar RSASecureID, Duo i similars, perquè vull codi obert.

Requisits previs: amfitrió * nix amb establert radi lliure, sssd - introduït al domini, els usuaris del domini poden autenticar-s'hi fàcilment.

Paquets addicionals: caixa de Shellina, filet, freeradius-ldap, Font rebel.tlf des del repositori https://github.com/xero/figlet-fonts.

En el meu exemple - CentOS 7.8.

La lògica de treball ha de ser la següent: quan es connecta a una VPN, l'usuari ha d'introduir un inici de sessió de domini i una OTP en comptes d'una contrasenya.

Configuració de serveis

В /etc/raddb/radiusd.conf només s'inicia l'usuari i el grup en nom del qual radi lliure, des del servei radisd hauria de poder llegir fitxers a tots els subdirectoris / home /.

user = root
group = root

Per poder utilitzar grups a la configuració Fortificar, s'ha de transmetre Atribut específic del proveïdor. Per fer-ho, al directori raddb/política.d Creo un fitxer amb el següent contingut:

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

Després de la instal·lació freeradius-ldap al directori raddb/mods-disponible es crea el fitxer ldap.

Cal crear un enllaç simbòlic al directori raddb/mods-habilitat.

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

Porto el seu contingut a aquest formulari:

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

En fitxers raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel a la secció autoritzar Afegeix el nom de la política que s'utilitzarà: autorització_grup. Un punt important: el nom de la política no està determinat pel nom del fitxer al directori política.d, però per una directiva dins del fitxer abans de les claus.
A la secció autenticar en els mateixos fitxers cal descomentar la línia pam.

A l'arxiu clients.conf prescriure els paràmetres amb què es connectarà Fortificar:

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

Configuració del mòdul 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

Opcions d'implementació del paquet predeterminades radi lliure с autenticador de google requereix que l'usuari introdueixi les credencials en el format: usuari contrasenya+OTP.

En imaginar el nombre de malediccions que cauran al cap, en el cas d'utilitzar el paquet predeterminat radi lliure с Google autenticador, es va decidir utilitzar la configuració del mòdul pam de manera que només es pot comprovar el testimoni Google autenticador.

Quan un usuari es connecta, passa el següent:

  • Freeradius comprova si l'usuari es troba al domini i a un grup determinat i, si té èxit, comprova el testimoni OTP.

Tot semblava prou bé fins al moment en què vaig pensar "Com puc registrar OTP per a més de 300 usuaris?"

L'usuari ha d'iniciar sessió al servidor amb radi lliure i des del vostre compte i executeu l'aplicació Autenticador de Google, que generarà un codi QR per a l'aplicació per a l'usuari. Aquí és on entra l'ajuda. caixa de Shellina en combinació amb .bash_profile.

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

El fitxer de configuració del dimoni es troba a /etc/sysconfig/shellinabox.
Especifico el port 443 allà i podeu especificar el vostre certificat.

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

L'usuari només ha de seguir l'enllaç, introduir crèdits de domini i rebre un codi QR per a l'aplicació.

L'algorisme és el següent:

  • L'usuari inicia sessió a la màquina mitjançant un navegador.
  • Si l'usuari del domini està comprovat. Si no, no es pren cap acció.
  • Si l'usuari és un usuari de domini, es comprovarà la pertinença al grup Administradors.
  • Si no és un administrador, comprova si Google Authenticator està configurat. Si no és així, es genera un codi QR i la sortida de l'usuari.
  • Si no hi ha un administrador i Google Authenticator està configurat, tanqueu la sessió.
  • Si és administrador, torneu a comprovar Google Authenticator. Si no està configurat, es genera un codi QR.

Tota la lògica es fa utilitzant /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

Configuració de fortificació:

  • Creem Ràdio-servidor

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Creem els grups necessaris, si cal, control d'accés per grups. Nom del grup activat Fortificar ha de coincidir amb el grup que es transmet Atribut específic del proveïdor Nom del grup Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Editant el necessari SSL- portals.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Afegir grups a les polítiques.

    Freeradius + Google Authenticator + LDAP + Fortigate

Els avantatges d'aquesta solució:

  • És possible autenticar-se per OTP activat Fortificar solució de codi obert.
  • L'usuari no introdueix una contrasenya de domini quan es connecta mitjançant VPN, cosa que simplifica una mica el procés de connexió. La contrasenya de 6 dígits és més fàcil d'introduir que la que proporciona la política de seguretat. Com a resultat, disminueix el nombre de bitllets amb l'assumpte: "No puc connectar-me a la VPN".

PS Tenim previst actualitzar aquesta solució a una autenticació completa de dos factors amb resposta a desafiaments.

Actualització:

Tal com vaig prometre, el vaig ajustar a l'opció de resposta al repte.
Per tant:
A l'arxiu /etc/raddb/sites-enabled/default secció autoritzar es veu així:

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
}

Secció autenticar ara es veu així:

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
}

Ara la verificació de l'usuari es produeix segons el següent algorisme:

  • L'usuari introdueix crèdits de domini al client VPN.
  • Freeradius comprova la validesa del compte i la contrasenya
  • Si la contrasenya és correcta, s'envia una sol·licitud d'un testimoni.
  • S'està verificant el testimoni.
  • benefici).

Font: www.habr.com

Afegeix comentari