Freeradius + Google Authenticator + LDAP + Fortigate

Was ist, wenn die Zwei-Faktor-Authentifizierung sowohl wünschenswert als auch heikel ist, aber kein Geld für Hardware-Token vorhanden ist und sie im Allgemeinen dazu dienen, bei guter Laune zu bleiben?

Bei dieser Lösung handelt es sich nicht um etwas besonders Originelles, sondern vielmehr um eine Mischung aus verschiedenen Lösungen, die im Internet zu finden sind.

So gegeben

Домен Active Directory.

Domänenbenutzer arbeiten über ein VPN, wie viele heutzutage.

Fungiert als VPN-Gateway fortigate.

Das Speichern des Passworts für den VPN-Client ist aus Sicherheitsgründen verboten.

Politik Fortinet In Bezug auf Ihre eigenen Token kann man es nicht weniger als einen Zhlob nennen – es gibt bis zu 10 kostenlose Token, der Rest – zu einem sehr nicht koscheren Preis. Ich habe RSASecureID, Duo und dergleichen nicht in Betracht gezogen, weil ich Open Source möchte.

Voraussetzungen: Gastgeber * nix mit etabliert Freeradius, SSD - Wird in die Domäne eingegeben, können Domänenbenutzer sich dort problemlos authentifizieren.

Zusatzpakete: Shellinabox, Feige, freeradius-ldap, Schriftart rebel.tlf aus dem Repository https://github.com/xero/figlet-fonts.

In meinem Beispiel - CentOS 7.8.

Die Arbeitslogik soll wie folgt aussehen: Beim Herstellen einer Verbindung zu einem VPN muss der Benutzer anstelle eines Passworts einen Domänen-Login und ein OTP eingeben.

Einrichtung der Dienste

В /etc/raddb/radiusd.conf Nur der Benutzer und die Gruppe, in deren Namen gestartet wird Freeradius, seit dem Dienst Radiusd sollte in der Lage sein, Dateien in allen Unterverzeichnissen zu lesen /Zuhause/.

user = root
group = root

Um Gruppen in den Einstellungen verwenden zu können fortigate, muss übermittelt werden Anbieterspezifisches Attribut. Dazu im Verzeichnis raddb/policy.d Ich erstelle 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 freeradius-ldap im Verzeichnis raddb/mods-verfügbar Datei wird erstellt ldap.

Es muss ein symbolischer Link zum Verzeichnis erstellt werden raddb/mods-aktiviert.

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 Akten raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel im Abschnitt autorisieren Ich füge den Namen der zu verwendenden Richtlinie hinzu – group_authorization. Ein wichtiger Punkt: Der Name der Richtlinie wird nicht durch den Namen der Datei im Verzeichnis bestimmt politik.d, sondern durch eine Direktive innerhalb der Datei vor den geschweiften Klammern.
Im Bereich authentifizieren In denselben Dateien müssen Sie die Zeile auskommentieren pam.

Im Ordner client.conf Geben Sie die Parameter vor, mit denen eine Verbindung hergestellt wird fortigate:

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

Modulkonfiguration 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

Standardoptionen für die Bundle-Implementierung Freeradius с Google-Authentifikator verlangen, dass der Benutzer Anmeldeinformationen im folgenden Format eingibt: Benutzername Passwort+OTP.

Stellen Sie sich vor, wie viele Flüche Ihnen auf den Kopf fallen, wenn Sie das Standardpaket verwenden Freeradius с Google Authenticator, wurde beschlossen, die Modulkonfiguration zu verwenden pam sodass nur der Token überprüft werden kann Google Authenticator.

Wenn ein Benutzer eine Verbindung herstellt, passiert Folgendes:

  • Freeradius prüft, ob sich der Benutzer in der Domäne und einer bestimmten Gruppe befindet und überprüft 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 am Server anmelden Freeradius und unter Ihrem Konto und führen Sie die Anwendung aus Google Authenticator, wodurch für den Benutzer ein QR-Code für die Anwendung generiert wird. Hier kommt Hilfe ins Spiel. Shellinabox in Kombination mit Bash_profile.

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

Die Daemon-Konfigurationsdatei befindet sich unter /etc/sysconfig/shellinabox.
Ich gebe dort den Port 443 an und Sie können Ihr Zertifikat angeben.

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

Der Nutzer muss lediglich dem Link folgen, Domain-Credits eingeben und erhält einen QR-Code für die Bewerbung.

Der Algorithmus ist der folgende:

  • Der Benutzer meldet sich über einen Browser an der Maschine an.
  • Ob der Domänenbenutzer überprüft wird. Wenn nicht, werden keine Maßnahmen ergriffen.
  • Wenn es sich bei dem Benutzer um einen Domänenbenutzer handelt, wird die Mitgliedschaft in der Gruppe „Administratoren“ überprüft.
  • Wenn Sie kein Administrator sind, prüft es, ob Google Authenticator konfiguriert ist. Wenn nicht, wird ein QR-Code und eine Benutzerabmeldung generiert.
  • Wenn kein Administrator und Google Authenticator konfiguriert ist, melden Sie sich einfach ab.
  • Wenn Sie Administrator sind, überprüfen Sie den Google Authenticator erneut. Wenn nicht konfiguriert, wird ein QR-Code generiert.

Die gesamte Logik erfolgt mit /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:

  • Erstellen Radius-Server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Wir erstellen die notwendigen Gruppen, ggf. Zugangskontrolle nach Gruppen. Gruppenname aktiviert fortigate muss mit der übergebenen Gruppe übereinstimmen Anbieterspezifisches Attribut Fortinet-Gruppenname.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Bearbeiten des Notwendigen SSL-Portale.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Gruppen zu Richtlinien hinzufügen.

    Freeradius + Google Authenticator + LDAP + Fortigate

Die Vorteile dieser Lösung:

  • Es ist möglich, sich per OTP zu authentifizieren fortigate Open-Source-Lösung.
  • Bei der Verbindung über VPN gibt der Benutzer kein Domänenkennwort ein, was den Verbindungsvorgang etwas vereinfacht. Das 6-stellige Passwort ist einfacher einzugeben als das in der Sicherheitsrichtlinie vorgesehene. Dadurch sinkt die Anzahl der Tickets mit dem Betreff: „Ich kann keine Verbindung zum VPN herstellen“.

PS: Wir planen, diese Lösung auf eine vollwertige Zwei-Faktor-Authentifizierung mit Challenge-Response zu aktualisieren.

Update:

Wie versprochen habe ich es auf die Challenge-Response-Option umgestellt.
Also:
Im Ordner /etc/raddb/sites-enabled/default Abschnitt autorisieren выглядит следующим образом:

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
}

Abschnitt authentifizieren sieht jetzt so 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
}

Die Benutzerüberprüfung erfolgt nun nach folgendem Algorithmus:

  • Der Benutzer gibt im VPN-Client Domain-Credits ein.
  • Freeradius prüft die Gültigkeit des Kontos und des Passworts
  • Wenn das Passwort korrekt ist, wird eine Anforderung für ein Token gesendet.
  • Der Token wird überprüft.
  • profitieren).

Source: habr.com

Kommentar hinzufügen