Wat als tweefactorauthenticatie zowel wenselijk als prikkelbaar is, maar er geen geld is voor hardwaretokens en ze in het algemeen aanbieden om in een goed humeur te blijven.
Deze oplossing is niet iets superorigineels, maar eerder een mix van verschillende oplossingen die op internet te vinden zijn.
Zo gegeven
domein Active Directory.
Domeingebruikers die via een VPN werken, zoals velen tegenwoordig.
Fungeert als een VPN-gateway versterken.
Het opslaan van het wachtwoord voor de VPN-client is verboden door het beveiligingsbeleid.
Politiek Fortinet met betrekking tot je eigen tokens kun je het niet minder dan een zhlob noemen - er zijn maar liefst 10 gratis tokens, de rest - tegen een zeer niet-koosjere prijs. Ik heb RSASecureID, Duo en dergelijke niet overwogen, omdat ik open source wil.
Vereisten: gastheer * nix met vastgesteld FreeRADIUS, ssd - ingevoerd in het domein, domeingebruikers kunnen zich er eenvoudig op authenticeren.
Aanvullende pakketten: shellina doos, figletje, freeradius-ldap, lettertype rebel.tlf uit het archief
In mijn voorbeeld - CentOS 7.8.
De logica van het werk zou als volgt moeten zijn: bij het verbinden met een VPN moet de gebruiker een domeinlogin en OTP invoeren in plaats van een wachtwoord.
Diensten instellen
В /etc/raddb/radiusd.conf alleen de gebruiker en groep namens wie start FreeRADIUS, sinds de dienst radius zou bestanden in alle submappen moeten kunnen lezen /huis/.
user = root
group = root
Groepen kunnen gebruiken in instellingen versterken, moet worden doorgegeven Leveranciersspecifiek kenmerk. Om dit te doen, in de directory raddb/beleid.d Ik maak een bestand aan met de volgende inhoud:
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
}
}
Na installatie freeradius-ldap in de map raddb/mods-beschikbaar bestand wordt aangemaakt ldap.
Noodzaak om een symbolische link naar de directory te maken raddb/mods ingeschakeld.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Ik breng de inhoud ervan naar deze vorm:
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 bestanden raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel in sectie toestemming geven Ik voeg de naam toe van het te gebruiken beleid - group_authorization. Een belangrijk punt - de naam van het beleid wordt niet bepaald door de naam van het bestand in de map beleid.d, maar door een richtlijn in het bestand vóór de accolades.
In de sectie waarmerken in dezelfde bestanden moet u de regel ongedaan maken pam.
In bestand klanten.conf de parameters voorschrijven waarmee het verbinding zal maken versterken:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Moduleconfiguratie pam.d/straal:
#%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
Standaard opties voor bundelimplementatie FreeRADIUS с google authenticator vereisen dat de gebruiker inloggegevens invoert in de indeling: gebruikersnaam wachtwoord+OTP.
Door je het aantal vloeken voor te stellen dat op het hoofd zal vallen, in het geval van het gebruik van de standaardbundel FreeRADIUS с Google Authenticator, werd besloten om de moduleconfiguratie te gebruiken pam zodat alleen het token kan worden gecontroleerd Google Authenticator.
Wanneer een gebruiker verbinding maakt, gebeurt het volgende:
- Freeradius controleert of de gebruiker zich in het domein en in een bepaalde groep bevindt en, indien succesvol, het OTP-token.
Alles zag er goed uit tot het moment dat ik dacht "Hoe kan ik OTP registreren voor 300+ gebruikers?"
De gebruiker moet inloggen op de server met FreeRADIUS en van onder uw account en voer de applicatie uit Google authenticator, die een QR-code voor de applicatie voor de gebruiker zal genereren. Dit is waar hulp binnenkomt. shellina doos in combinatie met .bash_profiel.
[root@freeradius ~]# yum install -y shellinabox
Het daemon-configuratiebestand bevindt zich op /etc/sysconfig/shellinabox.
Ik specificeer daar poort 443 en u kunt uw certificaat specificeren.
[root@freeradius ~]#systemctl enable --now shellinaboxd
De gebruiker hoeft alleen de link te volgen, domeincredits in te voeren en een QR-code te ontvangen voor de toepassing.
Het algoritme is als volgt:
- De gebruiker logt via een browser in op de machine.
- Of de domeingebruiker is aangevinkt. Zo niet, dan wordt er geen actie ondernomen.
- Als de gebruiker een domeingebruiker is, is het lidmaatschap van de groep Administrators aangevinkt.
- Als het geen beheerder is, controleert het of Google Authenticator is geconfigureerd. Zo niet, dan wordt een QR-code gegenereerd en logt de gebruiker uit.
- Als er geen beheerder en Google Authenticator is geconfigureerd, logt u gewoon uit.
- Als beheerder, vink dan Google Authenticator opnieuw aan. Indien niet geconfigureerd, wordt een QR-code gegenereerd.
Alle logica wordt gedaan met behulp van /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-opstelling:
- We creëren Straal-server
- We maken de nodige groepen aan, eventueel toegangscontrole per groep. Groepsnaam op versterken moet overeenkomen met de groep die wordt doorgegeven Leveranciersspecifiek kenmerk Fortinet-groepsnaam.
- Het nodige bewerken SSL-portalen.
- Groepen toevoegen aan beleid.
De voordelen van deze oplossing:
- Het is mogelijk om via OTP te authenticeren versterken open source-oplossing.
- De gebruiker voert geen domeinwachtwoord in bij het verbinden via VPN, wat het verbindingsproces enigszins vereenvoudigt. Het 6-cijferige wachtwoord is gemakkelijker in te voeren dan het wachtwoord dat wordt verstrekt door het beveiligingsbeleid. Hierdoor neemt het aantal tickets met als onderwerp: “Ik kan geen verbinding maken met de VPN” af.
PS We zijn van plan deze oplossing te upgraden naar een volwaardige tweefactorauthenticatie met challenge-response.
update:
Zoals beloofd, heb ik het aangepast naar de uitdaging-antwoordoptie.
Dus:
In bestand /etc/raddb/sites-enabled/default sectie toestemming geven ziet er zo uit:
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
}
Секция waarmerken ziet er nu zo uit:
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
}
Nu vindt gebruikersverificatie plaats volgens het volgende algoritme:
- De gebruiker voert domeincredits in de VPN-client in.
- Freeradius controleert de geldigheid van het account en wachtwoord
- Als het wachtwoord correct is, wordt er een verzoek om een token verzonden.
- Het token wordt geverifieerd.
- winst).
Bron: www.habr.com