Hvað ef tveggja þátta auðkenning er bæði æskileg og stingandi, en það eru engir peningar fyrir vélbúnaðartákn og almennt bjóða þeir upp á að vera í góðu skapi.
Þessi lausn er ekki eitthvað ofurfrumlegt, heldur blanda af mismunandi lausnum sem finnast á netinu.
Svo gefið
Домен Active Directory.
Lénsnotendur sem vinna í gegnum VPN, eins og margir í dag.
Virkar sem VPN gátt Duglegur.
Það er bannað samkvæmt öryggisstefnu að vista lykilorðið fyrir VPN biðlarann.
Stjórnmál Fortinet í tengslum við eigin tákn, þá geturðu ekki kallað það minna en zhlob - það eru allt að 10 ókeypis tákn, restin - á mjög ókosher verði. Ég taldi ekki RSASecureID, Duo og þess háttar, vegna þess að ég vil opinn uppspretta.
Forkröfur: gestgjafi * nix með staðfestu fríradíus, ssd - slegið inn á lénið geta notendur léns auðveldlega auðkennt á því.
Viðbótarpakkar: shellina kassi, fíkill, freeradius-ldap, leturgerð rebel.tlf úr geymslunni
Í dæminu mínu - CentOS 7.8.
Rökfræði vinnunnar á að vera sem hér segir: þegar hann er tengdur við VPN verður notandinn að slá inn innskráningu léns og OTP í stað lykilorðs.
Uppsetning þjónustu
В /etc/raddb/radiusd.conf aðeins notandinn og hópurinn fyrir hönd sem byrjar fríradíus, frá þjónustunni radíusd ætti að geta lesið skrár í öllum undirmöppum /heim/.
user = root
group = root
Til að geta notað hópa í stillingum Duglegur, verður að senda Seljandi sérstakur eiginleiki. Til að gera þetta, í möppunni raddb/policy.d Ég bý til skrá með eftirfarandi efni:
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
}
}
Eftir uppsetningu freeradius-ldap í skránni raddb/mods-available skrá er búin til ldap.
Þarftu að búa til táknrænan hlekk á möppuna raddb/mods-virkt.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Ég færi innihald þess á þetta 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'
}
}
Í skrám raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel í kafla heimila Ég bæti við nafni stefnunnar sem á að nota - group_authorization. Mikilvægt atriði - heiti stefnunnar ræðst ekki af nafni skráarinnar í möppunni stefna.d, en með tilskipun inni í skránni á undan hrokknu axlaböndunum.
Í kaflanum auðkenna í sömu skrám þarftu að afskrifa línuna Pam.
Í skrá clients.conf mælt fyrir um breytur sem það mun tengjast Duglegur:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Stilling einingar 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
Sjálfgefin útfærsluvalkostir fyrir búnt fríradíus с Google Authenticator krefjast þess að notandinn slær inn skilríki á sniðinu: notendanafn Lykilorð+OTP.
Með því að ímynda sér fjölda bölvuna sem munu falla á höfuðið, ef um er að ræða að nota sjálfgefið búnt fríradíus с Google Authenticator, var ákveðið að nota einingastillinguna Pam þannig að aðeins sé hægt að athuga táknið Google Authenticator.
Þegar notandi tengist gerist eftirfarandi:
- Freeradius athugar hvort notandinn sé á léninu og í ákveðnum hópi og, ef vel tekst til, athugar OTP táknið.
Allt leit nógu vel út þar til ég hugsaði „Hvernig get ég skráð OTP fyrir 300+ notendur?“
Notandinn verður að skrá sig inn á netþjóninn með fríradíus og undir reikningnum þínum og keyrðu forritið Sannvottari frá Google, sem mun búa til QR kóða fyrir forritið fyrir notandann. Þetta er þar sem hjálp kemur inn. shellina kassi ásamt .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Stillingarskrá púkans er staðsett á /etc/sysconfig/shellinabox.
Ég tilgreini port 443 þar og þú getur tilgreint vottorðið þitt.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Notandinn þarf aðeins að fylgja hlekknum, slá inn lénseiningar og fá QR kóða fyrir forritið.
Reikniritið er sem hér segir:
- Notandinn skráir sig inn á vélina í gegnum vafra.
- Hvort lénsnotandinn sé merktur. Ef ekki, þá er ekkert gert.
- Ef notandinn er lénsnotandi er hakað við aðild að Administrators hópnum.
- Ef hann er ekki stjórnandi, athugar hann hvort Google Authenticator sé stillt. Ef ekki, þá myndast QR kóða og útskráning notanda.
- Ef ekki er stjórnandi og Google Authenticator stilltur, þá er bara að skrá þig út.
- Ef stjórnandi, athugaðu Google Authenticator aftur. Ef hann er ekki stilltur er QR kóða búinn til.
Öll rökfræði er gerð með því að nota /etc/skel/.bash_profile.
köttur /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 uppsetning:
- Við sköpum radíus-þjónn
- Við búum til nauðsynlega hópa, ef þörf krefur, aðgangsstýring eftir hópum. Hópnafn á Duglegur verður að passa við hópinn sem er sendur inn Seljandi sérstakur eiginleiki Fortinet-Group-Name.
- Breyta nauðsynlegum SSL-gáttir.
- Bætir hópum við stefnur.
Kostir þessarar lausnar:
- Það er hægt að auðkenna með OTP á Duglegur opinn uppspretta lausn.
- Notandinn slær ekki inn lykilorð léns þegar hann tengist í gegnum VPN, sem einfaldar tengingarferlið nokkuð. Auðveldara er að slá inn 6 stafa lykilorðinu en það sem öryggisstefnan gefur upp. Fyrir vikið minnkar fjöldi miða með efninu: „Ég get ekki tengst VPN“.
PS Við ætlum að uppfæra þessa lausn í fullgilda tvíþætta auðkenningu með áskorun-viðbrögðum.
Update:
Eins og lofað var, breytti ég því í valmöguleikann áskorun-viðbrögð.
Svo:
Í skrá /etc/raddb/sites-enabled/default kafla heimila lítur svona út:
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
}
Kafli auðkenna lítur nú svona út:
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ú fer staðfesting notenda fram samkvæmt eftirfarandi reiknirit:
- Notandinn slær inn lénseiningar í VPN biðlaranum.
- Freeradius athugar gildi reikningsins og lykilorðsins
- Ef lykilorðið er rétt er beiðni um tákn send.
- Verið er að staðfesta táknið.
- hagnaði).
Heimild: www.habr.com