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).