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
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
- 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.
- Änneren déi néideg SSL- Portalen.
- Dobäizemaachen Gruppen zu Politik.
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