Entä jos kaksivaiheinen todennus on sekä toivottavaa että piikikäs, mutta laitteistotokeneihin ei ole rahaa ja yleensä ne tarjoavat hyvällä tuulella pysymistä.
Tämä ratkaisu ei ole mikään superalkuperäinen, vaan pikemminkin sekoitus erilaisia Internetistä löytyviä ratkaisuja.
Niin annettu
Verkkotunnuksen nimi Active Directory.
VPN:n kautta työskentelevät verkkotunnuksen käyttäjät, kuten monet nykyään.
Toimii VPN-yhdyskäytävänä FortiGate.
VPN-asiakkaan salasanan tallentaminen on kielletty suojauskäytännöissä.
Politiikka Fortinet suhteessa omiin rahakkeihisi, et voi kutsua sitä vähemmäksi kuin zhlob - ilmaisia tokeneita on jopa 10, loput - erittäin ei-kosher-hintaan. En ajatellut RSASecureID:tä, Duoa ja vastaavia, koska haluan avoimen lähdekoodin.
Edellytykset: isäntä * nix vakiintuneen kanssa FreeRADIUS, ssd - syötetty verkkotunnukseen, verkkotunnuksen käyttäjät voivat helposti todentaa sen.
Lisäpaketit: shellina laatikko, hahmo, freeradius-ldap, fontti kapinallinen.tlf arkistosta
Esimerkissäni CentOS 7.8.
Työn logiikan oletetaan olevan seuraava: VPN-yhteyttä muodostettaessa käyttäjän on syötettävä verkkotunnuksen sisäänkirjautuminen ja OTP salasanan sijaan.
Palvelujen asennus
В /etc/raddb/radiusd.conf vain käyttäjä ja ryhmä, jonka puolesta aloittaa FreeRADIUS, palvelusta lähtien säde pitäisi pystyä lukemaan tiedostoja kaikissa alihakemistoissa /Koti/.
user = root
group = root
Jotta ryhmiä voidaan käyttää asetuksissa FortiGate, on lähetettävä Toimittajakohtainen ominaisuus. Voit tehdä tämän hakemistossa raddb/policy.d Luon seuraavan sisällön sisältävän tiedoston:
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
}
}
Kun olet asentanut freeradius-ldap hakemistossa raddb/mods-saatavilla tiedosto luodaan ldap.
Sinun on luotava symbolinen linkki hakemistoon raddb/mods-käytössä.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Tuon sen sisällön tähän lomakkeeseen:
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'
}
}
Tiedostoissa raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel osiossa valtuuttaa Lisään käytettävän käytännön nimen - group_authorization. Tärkeä kohta - käytännön nimeä ei määritä hakemistossa olevan tiedoston nimi politiikka.d, mutta käskyllä tiedoston sisällä ennen kiharoita.
osiossa todentaa samoissa tiedostoissa sinun on poistettava rivin kommentti pam.
Tiedostossa clients.conf määritä parametrit, joihin se yhdistetään FortiGate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Moduulin kokoonpano 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
Paketin oletustoteutusvaihtoehdot FreeRADIUS с google todentaja vaatia käyttäjää antamaan valtuustiedot muodossa: Käyttäjänimi Salasana+OTP.
Kuvittelemalla päähän osuvien kirousten lukumäärän, jos käytetään oletuspakettia FreeRADIUS с Google Authenticator, päätettiin käyttää moduulikokoonpanoa pam niin, että vain merkki voidaan tarkistaa Google Authenticator.
Kun käyttäjä muodostaa yhteyden, tapahtuu seuraavaa:
- Freeradius tarkistaa, onko käyttäjä toimialueella ja tietyssä ryhmässä, ja onnistuessaan OTP-tunnus tarkistetaan.
Kaikki näytti riittävän hyvältä, kunnes ajattelin "Kuinka voin rekisteröidä OTP:n yli 300 käyttäjälle?"
Käyttäjän tulee kirjautua sisään palvelimelle tunnuksella FreeRADIUS ja tilisi alta ja suorita sovellus Google autentikaattori, joka luo käyttäjälle QR-koodin sovellukselle. Tässä tulee apua. shellina laatikko yhdessä .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Daemon-määritystiedosto sijaitsee osoitteessa /etc/sysconfig/shellinabox.
Määritän siellä portin 443 ja voit määrittää varmenteen.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Käyttäjän tarvitsee vain seurata linkkiä, syöttää verkkotunnuksen krediittejä ja saada QR-koodi sovellukseen.
Algoritmi on seuraava:
- Käyttäjä kirjautuu sisään koneelle selaimen kautta.
- Onko verkkotunnuksen käyttäjä tarkistettu. Jos ei, toimenpiteisiin ei ryhdytä.
- Jos käyttäjä on toimialueen käyttäjä, jäsenyys Järjestelmänvalvojat-ryhmässä on valittu.
- Jos ei ole järjestelmänvalvoja, se tarkistaa, onko Google Authenticator määritetty. Jos ei, luodaan QR-koodi ja käyttäjä kirjautuu ulos.
- Jos järjestelmänvalvojaa ja Google Authenticatoria ei ole määritetty, kirjaudu ulos.
- Jos järjestelmänvalvoja, tarkista Google Authenticator uudelleen. Jos sitä ei ole määritetty, QR-koodi luodaan.
Kaikki logiikka tehdään käyttämällä /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
Vahvista asetukset:
- Me luomme Säde-palvelin
- Luomme tarvittavat ryhmät, tarvittaessa kulunvalvonta ryhmittäin. Ryhmän nimi käytössä FortiGate on vastattava hyväksyttyä ryhmää Toimittajakohtainen ominaisuus Fortinet-ryhmän nimi.
- Tarvittavan muokkaaminen SSL-portaalit.
- Ryhmien lisääminen käytäntöihin.
Tämän ratkaisun edut:
- On mahdollista todentaa OTP:llä FortiGate avoimen lähdekoodin ratkaisu.
- Käyttäjä ei syötä verkkotunnuksen salasanaa muodostaessaan yhteyden VPN:n kautta, mikä yksinkertaistaa jonkin verran yhteysprosessia. 6-numeroinen salasana on helpompi syöttää kuin suojauskäytännön antama. Tämän seurauksena lippujen määrä, joiden aihe on: "En voi muodostaa yhteyttä VPN-verkkoon", vähenee.
PS Aiomme päivittää tämän ratkaisun täysimittaiseksi kaksivaiheiseksi todennukseksi haaste-vastauksella.
Päivitys:
Kuten lupasin, muokkasin sen haaste-vastaus -vaihtoehdoksi.
Joten:
Tiedostossa /etc/raddb/sites-enabled/default jakso valtuuttaa on seuraava:
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
}
Jakso todentaa nyt näyttää tältä:
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
}
Nyt käyttäjän vahvistus tapahtuu seuraavan algoritmin mukaan:
- Käyttäjä syöttää verkkotunnuksen krediittejä VPN-asiakkaaseen.
- Freeradius tarkistaa tilin ja salasanan oikeellisuuden
- Jos salasana on oikea, lähetetään tunnuspyyntö.
- Tunnusta tarkistetaan.
- voitto).
Lähde: will.com