Freeradius + Google Autheticator + LDAP + Fortigate

Was ist, wenn Sie eine Zwei-Faktor-Authentifizierung wünschen und es weh tut, aber es gibt kein Geld für Hardware-Token, und im Allgemeinen bieten sie an, gut gelaunt zu bleiben.



Diese Lösung ist nicht besonders originell, sondern eine Mischung aus verschiedenen Lösungen im Internet.



Also gegeben



Active Directory- Domäne .



Domänenbenutzer, die ein VPN verwenden, wie viele heute. Fortigate



fungiert als VPN-Gateway . Das Speichern des Kennworts für den VPN-Client ist gemäß den Sicherheitsrichtlinien verboten. Fortinets Politik in Bezug auf seine eigenen Token kann nicht weniger als Redneck genannt werden - es gibt bis zu 10 kostenlose Token, der Rest ist zu einem sehr nicht koscheren Preis. RSASecureID, Duo und dergleichen wurden nicht berücksichtigt, da ich Open Source möchte. Voraussetzungen: * nix- Host mit installiertem Freeradius , sssd - in die Domäne eingegeben, Domänenbenutzer können sich leicht darauf authentifizieren. Zusätzliche Pakete:















Shellinabox , Figlet , Freeeradius-LDAP , Rebel.tlf Schriftart aus dem https://github.com/xero/figlet-fonts Repository .



In meinem Beispiel - CentOS 7.8.



Die Arbeitslogik lautet wie folgt: Bei der Verbindung mit einem VPN muss der Benutzer anstelle eines Kennworts eine Domänenanmeldung und ein OTP eingeben.



Dienste einrichten



In /etc/raddb/radiusd.conf werden nur der Benutzer und die Gruppe geändert , unter denen freeradius gestartet wird , da der Dienst radiusd Dateien in allen Unterverzeichnissen von / home / lesen kann .



user = root
group = root


Um Gruppen in den Fortigate- Einstellungen verwenden zu können , müssen Sie das herstellerspezifische Attribut übergeben . Um dies zu tun, in dem raddb / policy.d Verzeichnis, erstellen Sie eine Datei mit folgendem 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
        }
}


Nach der Installation von freeradius-ldap im Verzeichnis raddb / mods-available wird ein ldap installiert .



Sie müssen einen symbolischen Link zum raddb / mods-fähigen Verzeichnis erstellen .



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


Ich bringe seinen Inhalt in dieses 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'
        }
}


In den Dateien raddb / sites-enabled / default und raddb / sites-enabled / inner-tunnel im Abschnitt authorize füge ich den Namen der Richtlinie hinzu, die verwendet werden soll - group_authorization. Ein wichtiger Punkt: Der Name der Richtlinie wird nicht durch den Namen der Datei im Verzeichnis policy.d bestimmt , sondern durch die Anweisung in der Datei vor den geschweiften Klammern.

Kommentieren Sie im Authentifizierungsabschnitt derselben Dateien die Pam aus . Schreiben Sie in die



Datei clients.conf die Parameter, mit denen Fortigate eine Verbindung herstellen soll :



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


Konfiguration des Pam.d / Radiusd- Moduls :



#%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


Für die Standardoptionen zum Implementieren des Freeradius- Bundles mit dem Google-Authentifikator muss der Benutzer Anmeldeinformationen im folgenden Format eingeben : Benutzername / Passwort + OTP .



Nachdem die Anzahl der Flüche angegeben wurde, die auf den Kopf fallen, wurde bei Verwendung des Standard- Freeradius- Bundles mit Google Authenticator beschlossen, die Konfiguration des Pam- Moduls zu verwenden, um nur das Google Authenticator- Token zu überprüfen .



Wenn ein Benutzer eine Verbindung herstellt, geschieht Folgendes:



  • Freeradius überprüft die Anwesenheit des Benutzers in der Domäne und in einer bestimmten Gruppe und bei Erfolg das OTP-Token.


Alles sah gut genug aus, bis ich dachte: "Wie kann ich OTP für mehr als 300 Benutzer registrieren?"



Der Benutzer muss sich mit freeradius und unter seinem Konto beim Server anmelden und die Google-Authentifizierungsanwendung ausführen , die einen QR-Code für die Anwendung für den Benutzer generiert. Hier bietet sich Shellinabox in Kombination mit .bash_profile an .



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


Die Daemon-Konfigurationsdatei befindet sich in / etc / sysconfig / shellinabox .

Ich gebe dort Port 443 an und Sie können Ihr Zertifikat angeben.



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


Der Benutzer muss nur dem Link folgen, Domain-Credits eingeben und einen QR-Code für die Anwendung erhalten.



Der Algorithmus ist wie folgt:



  • Der Benutzer meldet sich über einen Browser am Computer an.
  • Der Domänenbenutzer wird überprüft. Wenn nicht, werden keine Maßnahmen ergriffen.
  • Wenn der Benutzer ein Domänenbenutzer ist, wird die Mitgliedschaft in der Gruppe Administratoren überprüft.
  • Wenn nicht admin, wird überprüft, ob Google Autheticator konfiguriert ist. Wenn nicht, wird ein QR-Code und eine Benutzerabmeldung generiert.
  • Wenn kein Administrator und kein Google Authenticator konfiguriert sind, melden Sie sich einfach ab.
  • Wenn der Administrator, dann überprüfen Sie erneut Google Authenticator. Wenn nicht konfiguriert, wird ein QR-Code generiert.


Die gesamte Logik wird mit /etc/skel/.bash_profile erstellt .



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:



  • Erstellen Sie einen Radius- Server



  • Wir erstellen die erforderlichen Gruppen, differenzieren bei Bedarf den Zugriff nach Gruppen. Der Gruppenname in Fortigate muss mit der Gruppe übereinstimmen, die im herstellerspezifischen Attribut Fortinet- Gruppenname übergeben wird .



  • Bearbeiten der erforderlichen SSL- Portale.



  • Fügen Sie Richtlinien Richtlinien hinzu.







Die Vorteile dieser Lösung:

  • Es besteht die Möglichkeit der OTP-Authentifizierung bei Fortigate Open Source-Lösungen.
  • Der Benutzer, der das Domänenkennwort eingibt, wenn er eine Verbindung über VPN herstellt, wird ausgeschlossen, was den Verbindungsprozess etwas vereinfacht. Das 6-stellige Passwort ist einfacher einzugeben als die Sicherheitsrichtlinie. Infolgedessen verringert sich die Anzahl der Tickets mit dem Betreff "Verbindung zu VPN nicht möglich".


PS Wir planen, diese Lösung auf eine vollwertige Zwei-Faktor-Autorisierung mit Challenge-Response zu bringen.



Aktualisieren:



Wie versprochen habe ich es bis zur Challenge-Response-Option fertiggestellt.

Also:

In der Datei / etc / raddb / sites-enabled / default - Datei, die autorisieren Abschnitt sieht wie folgt aus :



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
}


Der Authentifizierungsabschnitt sieht nun folgendermaßen 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
}


Jetzt wird der Benutzer nach folgendem Algorithmus verifiziert:

  • Der Benutzer gibt Domänenguthaben im VPN-Client ein.
  • Freeradius überprüft die Gültigkeit des Kontos und des Passworts
  • Wenn das Passwort korrekt ist, wird eine Anforderung für ein Token gesendet.
  • Das Token wird überprüft.
  • Profitieren).



All Articles