Hva om tofaktorautentisering er både ønskelig og stikkende, men det er ingen penger til maskinvaretokens og generelt tilbyr de å holde seg i godt humør.
Denne løsningen er ikke noe superoriginalt, men snarere en blanding av ulike løsninger som finnes på Internett.
Så det er gitt
Domenenavn Active Directory.
Domenebrukere som jobber gjennom en VPN, som mange i dag.
Fungerer som en VPN-gateway Heldig.
Lagring av passordet for VPN-klienten er forbudt av sikkerhetspolicy.
Politikk Fortinet i forhold til dine egne tokens, kan du ikke kalle det mindre enn en zhlob - det er så mange som 10 gratis tokens, resten - til en svært ikke-kosher pris. Jeg vurderte ikke RSASecureID, Duo og lignende, fordi jeg vil ha åpen kildekode.
Forutsetninger: host * nix med etablerte Freeradius, ssd - inngått i domenet, kan domenebrukere enkelt autentisere seg på det.
Tilleggspakker: shellina boks, figlett, freeradius-ldap, font rebel.tlf fra depotet
I mitt eksempel - CentOS 7.8.
Arbeidslogikken er ment å være som følger: når du kobler til en VPN, må brukeren angi en domenepålogging og en OTP i stedet for et passord.
Tjenester oppsett
В /etc/raddb/radiusd.conf bare brukeren og gruppen på vegne av starter Freeradius, siden tjenesten radiusd skal kunne lese filer i alle underkataloger /hjem/.
user = root
group = root
For å kunne bruke grupper i innstillinger Heldig, må overføres Leverandørspesifikt attributt. For å gjøre dette, i katalogen raddb/policy.d Jeg lager en fil med følgende innhold:
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
}
}
Etter installasjonen freeradius-ldap i katalogen raddb/mods-tilgjengelig filen er opprettet ldap.
Du må opprette en symbolsk lenke til katalogen raddb/mods-aktivert.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Jeg bringer innholdet til dette skjemaet:
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'
}
}
I filer raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel i seksjon autorisere Jeg legger til navnet på policyen som skal brukes - group_authorization. Et viktig poeng - navnet på policyen bestemmes ikke av navnet på filen i katalogen policy.d, men etter et direktiv inne i filen før de krøllete klammeparentesene.
I seksjonen godkjenne i de samme filene må du fjerne kommentering av linjen pam.
I fil clients.conf spesifiser parametrene som skal kobles til Heldig:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Modulkonfigurasjon 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 pakkeimplementeringsalternativer Freeradius с google autentisering kreve at brukeren oppgir legitimasjon i formatet: brukernavn passord+OTP.
Ved å forestille seg antall forbannelser som vil falle på hodet, i tilfelle du bruker standardbunten Freeradius с Google Authenticator, ble det besluttet å bruke modulkonfigurasjonen pam slik at bare tokenet kan kontrolleres Google Authenticator.
Når en bruker kobler til, skjer følgende:
- Freeradius sjekker om brukeren er i domenet og i en bestemt gruppe og, hvis vellykket, sjekker OTP-tokenet.
Alt så bra nok ut til det øyeblikket jeg tenkte "Hvordan kan jeg registrere OTP for 300+ brukere?"
Brukeren må logge inn på serveren med Freeradius og fra kontoen din og start applikasjonen Googles autentisator, som vil generere en QR-kode for applikasjonen for brukeren. Det er her det kommer til unnsetning shellina boks i kombinasjon med .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Daemon-konfigurasjonsfilen er plassert på /etc/sysconfig/shellinabox.
Jeg spesifiserer port 443 der, og du kan spesifisere sertifikatet ditt.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Brukeren trenger bare å følge lenken, angi domenekreditt og motta en QR-kode for applikasjonen.
Algoritmen er som følger:
- Brukeren logger på maskinen via en nettleser.
- Om domenebrukeren er sjekket. Hvis ikke, blir det ikke gjort noe.
- Hvis brukeren er en domenebruker, er medlemskap i Administrator-gruppen avkrysset.
- Hvis ikke en administrator, sjekker den om Google Authenticator er konfigurert. Hvis ikke, genereres en QR-kode og brukeren logger ut.
- Hvis ikke en administrator og Google Authenticator er konfigurert, er det bare å logge av.
- Hvis du er administrator, sjekk Google Authenticator igjen. Hvis den ikke er konfigurert, genereres en QR-kode.
All logikk er gjort ved hjelp av /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
Fortigert oppsett:
- Vi skaper Radius-server
- Vi oppretter de nødvendige gruppene, om nødvendig, tilgangskontroll etter grupper. Gruppenavn på Heldig må samsvare med gruppen som sendes til Leverandørspesifikt attributt Fortinet-gruppenavn.
- Redigering av nødvendig SSL-portaler.
- Legger til grupper i retningslinjer.
Fordelene med denne løsningen:
- Det er mulig å autentisere via OTP på Heldig åpen kildekode-løsning.
- Brukeren skriver ikke inn et domenepassord ved tilkobling via VPN, noe som forenkler tilkoblingsprosessen. Det 6-sifrede passordet er enklere å angi enn det som er gitt av sikkerhetspolicyen. Som et resultat reduseres antall billetter med emnet: "Jeg kan ikke koble til VPN".
PS Vi planlegger å oppgradere denne løsningen til en fullverdig tofaktorautentisering med utfordringsrespons.
Oppdatering:
Som lovet oppgraderte jeg den til alternativet med utfordringssvar.
Så:
I fil /etc/raddb/sites-enabled/default seksjon autorisere er som følger:
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
}
Seksjon godkjenne ser nå slik ut:
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
}
Nå er brukeren verifisert ved hjelp av følgende algoritme:
- Brukeren legger inn domenekreditter i VPN-klienten.
- Freeradius sjekker kontoens gyldighet og passord
- Hvis passordet er riktig, sendes en forespørsel om et token.
- Tokenet blir verifisert.
- profitt).
Kilde: www.habr.com