Wat as twee-faktor-verifikasie beide wenslik en stekelrig is, maar daar is geen geld vir hardeware-tokens nie en hulle bied in die algemeen aan om in 'n goeie bui te bly.
Hierdie oplossing is nie iets super oorspronklik nie, maar eerder 'n mengsel van verskillende oplossings wat op die internet gevind word.
So gegee
Домен Active Directory.
Domeingebruikers wat deur 'n VPN werk, soos baie vandag.
Dien as 'n VPN-poort Forteer.
Die stoor van die wagwoord vir die VPN-kliënt word deur sekuriteitsbeleid verbied.
Politiek Fortinet met betrekking tot jou eie tokens, kan jy dit nie minder as 'n zhlob noem nie - daar is soveel as 10 gratis tokens, die res - teen 'n baie nie-kosher prys. Ek het nie RSASecureID, Duo en dies meer oorweeg nie, want ek wil oopbron hê.
Voorvereistes: gasheer * nix met gevestigde vrye radius, ssd - ingeskryf in die domein, kan domeingebruikers maklik daarop verifieer.
Bykomende pakkette: shellina boks, vyetjie, freeradius-ldap, font rebel.tlf uit die bewaarplek
In my voorbeeld - CentOS 7.8.
Die logika van werk is veronderstel om soos volg te wees: wanneer die gebruiker aan 'n VPN koppel, moet die gebruiker 'n domeinaanmelding en OTP in plaas van 'n wagwoord invoer.
Dienste opstelling
В /etc/raddb/radiusd.conf slegs die gebruiker en groep namens wie begin vrye radius, sedert die diens radiusd behoort lêers in alle subgidse te kan lees / Huis /.
user = root
group = root
Om groepe in instellings te kan gebruik Forteer, moet oorgedra word Verkoper spesifieke kenmerk. Om dit te doen, in die gids raddb/beleid.d Ek skep 'n lêer met die 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 die installasie freeradius-ldap in die gids raddb/mods-beskikbaar lêer geskep word ldap.
Moet 'n simboliese skakel na die gids skep raddb/mods-geaktiveer.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Ek bring die inhoud na hierdie 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 lêers raddb/sites-enabled/default и raddb/sites-enabled/inner-tonnel in afdeling magtig Ek voeg die naam by van die beleid wat gebruik gaan word - group_authorization. 'n Belangrike punt - die naam van die beleid word nie bepaal deur die naam van die lêer in die gids nie beleid.d, maar deur 'n aanwysing binne die lêer voor die krulhakies.
In die afdeling authentic in dieselfde lêers wat jy nodig het om die reël te verwyder PAM.
In lêer clients.conf skryf die parameters voor waarmee dit sal verbind Forteer:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Module -opset 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
Verstek bundel implementering opsies vrye radius с Google-verifikasie vereis dat die gebruiker geloofsbriewe in die formaat invoer: gebruikersnaam wagwoord+OTP.
Deur die aantal vloeke te verbeel wat op die kop sal val, in die geval van die gebruik van die verstekbundel vrye radius с Google Authenticator, is besluit om die modulekonfigurasie te gebruik PAM sodat slegs die teken nagegaan kan word Google Authenticator.
Wanneer 'n gebruiker koppel, gebeur die volgende:
- Freeradius kontroleer of die gebruiker in die domein en in 'n sekere groep is en, indien suksesvol, kontroleer die OTP-token.
Alles het goed genoeg gelyk tot die oomblik toe ek gedink het "Hoe kan ek OTP vir 300+ gebruikers registreer?"
Die gebruiker moet by die bediener aanmeld met vrye radius en van onder jou rekening en hardloop die toepassing Google Authenticator, wat 'n QR-kode vir die toepassing vir die gebruiker sal genereer. Dit is waar hulp inkom. shellina boks in kombinasie met .bash_profiel.
[root@freeradius ~]# yum install -y shellinabox
Die daemon-konfigurasielêer is geleë by /etc/sysconfig/shellinabox.
Ek spesifiseer poort 443 daar en jy kan jou sertifikaat spesifiseer.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Die gebruiker hoef slegs die skakel te volg, domeinkrediete in te voer en 'n QR-kode vir die toepassing te ontvang.
Die algoritme is soos volg:
- Die gebruiker meld by die masjien aan deur 'n blaaier.
- Of die domeingebruiker gekontroleer is. Indien nie, word geen aksie geneem nie.
- As die gebruiker 'n domeingebruiker is, word lidmaatskap in die Administrateursgroep nagegaan.
- Indien nie 'n administrateur nie, kyk dit of Google Authenticator opgestel is. Indien nie, word 'n QR-kode en gebruikeruitmelding gegenereer.
- As nie 'n administrateur en Google Authenticator opgestel is nie, teken dan net af.
- As admin, gaan dan weer na Google Authenticator. As dit nie gekonfigureer is nie, word 'n QR-kode gegenereer.
Alle logika word gedoen met behulp van /etc/skel/.bash_profile.
kat /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:
- Ons skep radius-bediener
- Ons skep die nodige groepe, indien nodig, toegangsbeheer deur groepe. Groepnaam aan Forteer moet ooreenstem met die groep wat deurgegee word Verkoper spesifieke kenmerk Fortinet-groepnaam.
- Redigeer die nodige SSL-portale.
- Voeg groepe by beleide.
Die voordele van hierdie oplossing:
- Dit is moontlik om te verifieer deur OTP aan Forteer oopbron oplossing.
- Die gebruiker voer nie 'n domeinwagwoord in wanneer hy via VPN koppel nie, wat die verbindingsproses ietwat vergemaklik. Die 6-syfer wagwoord is makliker om in te voer as die een wat deur die sekuriteitsbeleid verskaf word. Gevolglik verminder die aantal kaartjies met die onderwerp: "Ek kan nie aan die VPN koppel nie".
NS Ons beplan om hierdie oplossing op te gradeer na 'n volwaardige twee-faktor-verifikasie met uitdaging-reaksie.
Update:
Soos belowe, het ek dit aangepas na die uitdaging-reaksie-opsie.
Dus:
In lêer /etc/raddb/sites-enabled/default afdeling magtig is soos volg:
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
}
Afdeling authentic lyk nou so:
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
}
Nou vind gebruikerverifikasie plaas volgens die volgende algoritme:
- Die gebruiker voer domeinkrediete in die VPN-kliënt in.
- Freeradius kontroleer die geldigheid van die rekening en wagwoord
- As die wagwoord korrek is, word 'n versoek vir 'n teken gestuur.
- Die teken word geverifieer.
- wins).
Bron: will.com