Freeradius + Google Authenticator + LDAP + Fortigate

Wat wann Zwee-Faktor Authentifikatioun souwuel wënschenswäert a stacheleg ass, awer et gi keng Sue fir Hardware Tokens an allgemeng bidden se an enger gudder Stëmmung ze bleiwen.

Dës Léisung ass net eppes super Original, mee éischter eng Mëschung vu verschiddene Léisungen um Internet fonnt.

Also ginn

Domain Numm Active Directory.

Domain Benotzer déi duerch e VPN schaffen, wéi vill haut.

Akten als VPN Gateway Fortigéieren.

D'Späichere vum Passwuert fir de VPN Client ass duerch Sécherheetspolitik verbueden.

Politik Fortinet par rapport zu Ären eegene Stongen, Dir kënnt et net manner wéi e zhlob nennen - et gi sou vill wéi 10 fräi Stongen, de Rescht - bei engem ganz net-kosher Präis. Ech hunn net RSASecureID, Duo an dergläiche berücksichtegt, well ech wëll Open Source.

Viraussetzunge: Provider * nix mat etabléiert fräi Radius, ssd - an d'Domain aginn, kënnen d'Domain Benotzer einfach drop authentifizéieren.

Zousätzlech Packagen: Shellina Këscht, Figlet, freeradius-ldap, font rebell.tlf aus dem Repository https://github.com/xero/figlet-fonts.

A mengem Beispill, CentOS 7.8.

D'Logik vun der Aarbecht soll wéi follegt sinn: wann Dir mat engem VPN verbënnt, muss de Benotzer en Domain Login an OTP anstatt e Passwuert aginn.

Servicer Ariichten

В /etc/raddb/radiusd.conf nëmmen de Benotzer an de Grupp am Numm vun deem fänkt un fräi Radius, zanter dem Service radiusd soll fäeg sinn Dateien an all Ënnerverzeechnes ze liesen / Hause /.

user = root
group = root

Fir Gruppen an Astellungen ze benotzen Fortigéieren, muss iwwerdroe ginn Verkeefer Spezifesch Attributer. Fir dëst ze maachen, am Dossier raddb/policy.d Ech erstellen e Fichier mat dem folgenden Inhalt:

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

No der Installatioun freeradius-ldap am Verzeechnes raddb/mods-verfügbar Datei erstallt gëtt ldap.

Muss e symbolesche Link zum Verzeechnes erstellen raddb/mods-aktivéiert.

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

Ech bréngen säin Inhalt op dës Form:

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

An Dateien raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel an der Rubrik autoriséieren Ech addéieren den Numm vun der Politik déi benotzt gëtt - group_authorization. E wichtege Punkt - den Numm vun der Politik gëtt net vum Numm vun der Datei am Verzeechnes bestëmmt Politik.d, awer duerch eng Direktiv am Fichier virun de Curly Klameren.
An der Rubrik authentifizéieren an déiselwecht Dateien musst Dir d'Linn decommentéieren Pam.

Am Dossier clients.conf virschreift d'Parameteren mat deenen et verbënnt Fortigéieren:

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

Modul Konfiguratioun 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

Standard Bündel Ëmsetzungsoptiounen fräi Radius с google authentikator erfuerdert de Benotzer Umeldungsinformatiounen am Format anzeginn: Benotzernumm / Passwuert+OTP.

Andeems Dir d'Zuel vu Fluchen virstellt, déi op de Kapp falen, am Fall vun der Benotzung vum Standardbündel fräi Radius с Google Authenticator, Et gouf decidéiert d'Modulkonfiguratioun ze benotzen Pam sou datt nëmmen den Token iwwerpréift ka ginn Google Authenticator.

Wann e Benotzer verbënnt, geschitt déi folgend:

  • Freeradius kontrolléiert ob de Benotzer am Domain an an enger bestëmmter Grupp ass a wann et erfollegräich ass, kontrolléiert den OTP Token.

Alles huet gutt genuch ausgesinn bis de Moment wou ech geduecht hunn "Wéi kann ech OTP fir 300+ Benotzer registréieren?"

De Benotzer muss op de Server aloggen mat fräi Radius a vun ënner Ärem Kont a lafen d'Applikatioun Google Authentifizéierer, deen e QR Code fir d'Applikatioun fir de Benotzer generéiert. Dëst ass wou Hëllef kënnt. Shellina Këscht a Kombinatioun mat .bash_profile.

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

D'Daemon Konfiguratiounsdatei ass op /etc/sysconfig/shellinabox.
Ech uginn port 443 do an Dir kënnt Är Certificat uginn.

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

De Benotzer brauch nëmmen de Link ze verfollegen, Domain Credits aginn an en QR Code fir d'Applikatioun kréien.

Den Algorithmus ass wéi follegt:

  • De Benotzer loggt sech op d'Maschinn duerch e Browser un.
  • Ob den Domain Benotzer iwwerpréift ass. Wann net, da gëtt keng Aktioun ënnerholl.
  • Wann de Benotzer en Domain Benotzer ass, gëtt d'Memberschaft an der Administrateursgrupp iwwerpréift.
  • Wann net en Admin, kontrolléiert et ob Google Authenticator konfiguréiert ass. Wann net, da gëtt e QR-Code a Benotzerlogout generéiert.
  • Wann net en Admin a Google Authenticator konfiguréiert ass, da loggt einfach aus.
  • Wann Admin, kontrolléiert dann nach eng Kéier Google Authenticator. Wann net konfiguréiert ass, gëtt e QR Code generéiert.

All Logik gëtt mat Hëllef gemaach /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

Fortigate Setup:

  • Mir kreéieren Radius-Server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Mir schafen déi néideg Gruppen, wann néideg, Zougang Kontroll vun Gruppen. Grupp Numm op Fortigéieren muss de Grupp passen, deen erakomm ass Verkeefer Spezifesch Attributer Fortinet-Grupp-Numm.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Änneren déi néideg SSL- Portalen.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Dobäizemaachen Gruppen zu Politik.

    Freeradius + Google Authenticator + LDAP + Fortigate

D'Virdeeler vun dëser Léisung:

  • Et ass méiglech duerch OTP ze authentifizéieren Fortigéieren Open Source Léisung.
  • De Benotzer gitt net en Domain Passwuert wann Dir iwwer VPN verbënnt, wat de Verbindungsprozess e bësse vereinfacht. Dat 6-Zifferen Passwuert ass méi einfach ze aginn wéi dat vun der Sécherheetspolitik. Als Resultat gëtt d'Zuel vun den Ticketen mam Thema: "Ech kann net mam VPN konnektéieren" erof.

PS Mir plangen dës Léisung op eng vollwäerteg zwee-Faktor Authentifikatioun mat Erausfuerderung-Äntwert ze upgrade.

Aktualiséierung:

Wéi versprach, hunn ech et op d'Erausfuerderung-Äntwert Optioun ugepasst.
Also:
Am Dossier /etc/raddb/sites-enabled/default Sektioun autoriséieren ass folgend:

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
}

Sektioun authentifizéieren gesäit elo esou aus:

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
}

Elo geschitt d'Benotzerverifikatioun no dem folgenden Algorithmus:

  • De Benotzer gitt Domain Credits am VPN Client.
  • Freeradius kontrolléiert d'Gëltegkeet vum Kont a Passwuert
  • Wann d'Passwuert richteg ass, da gëtt eng Ufro fir en Token geschéckt.
  • Den Token gëtt verifizéiert.
  • Gewënn).

Source: will.com

Setzt e Commentaire