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
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
- Wir erstellen die notwendigen Gruppen, ggf. Zugangskontrolle nach Gruppen. Gruppenname aktiviert fortigate muss mit der übergebenen Gruppe übereinstimmen Anbieterspezifisches Attribut Fortinet-Gruppenname.
- Bearbeiten des Notwendigen SSL-Portale.
- Gruppen zu Richtlinien hinzufügen.
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