Bagaimana jika pengesahan dua faktor adalah wajar dan berduri, tetapi tidak ada wang untuk token perkakasan dan secara amnya mereka menawarkan untuk kekal dalam mood yang baik.
Penyelesaian ini bukanlah sesuatu yang sangat asli, melainkan gabungan penyelesaian berbeza yang terdapat di Internet.
Jadi diberi
Домен Active Directory.
Pengguna domain yang bekerja melalui VPN, seperti kebanyakan hari ini.
Bertindak sebagai gerbang VPN Berpantang.
Menyimpan kata laluan untuk klien VPN adalah dilarang oleh dasar keselamatan.
Politik Fortinet berhubung dengan token anda sendiri, anda tidak boleh menyebutnya kurang daripada zhlob - terdapat sebanyak 10 token percuma, selebihnya - pada harga yang sangat tidak halal. Saya tidak menganggap RSASecureID, Duo dan seumpamanya, kerana saya mahukan sumber terbuka.
Prasyarat: tuan rumah * nix dengan ditubuhkan freeradius, ssd - dimasukkan ke dalam domain, pengguna domain boleh mengesahkannya dengan mudah.
Pakej tambahan: kotak shellina, figlett, jejari bebas-ldap, fon memberontak.tlf daripada repositori
Dalam contoh saya - CentOS 7.8.
Logik kerja sepatutnya seperti berikut: apabila menyambung ke VPN, pengguna mesti memasukkan log masuk domain dan OTP dan bukannya kata laluan.
Persediaan perkhidmatan
В /etc/raddb/radiusd.conf hanya pengguna dan kumpulan bagi pihak yang bermula freeradius, sejak perkhidmatan jejari sepatutnya boleh membaca fail dalam semua subdirektori / rumah /.
user = root
group = root
Untuk dapat menggunakan kumpulan dalam tetapan Berpantang, mesti dihantar Atribut Khusus Vendor. Untuk melakukan ini, dalam direktori raddb/polisi.d Saya mencipta fail dengan kandungan berikut:
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
}
}
Selepas pemasangan jejari bebas-ldap dalam direktori raddb/mods-tersedia fail dibuat ldap.
Perlu membuat pautan simbolik ke direktori raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Saya membawa kandungannya ke borang ini:
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'
}
}
Dalam fail raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel dalam bahagian memberi kebenaran Saya menambah nama dasar yang akan digunakan - group_authorization. Perkara penting - nama dasar tidak ditentukan oleh nama fail dalam direktori dasar.d, tetapi dengan arahan di dalam fail sebelum pendakap kerinting.
Dalam bahagian mengesahkan dalam fail yang sama anda perlu menyahkomen baris PAM.
Dalam fail pelanggan.conf tetapkan parameter yang akan disambungkan Berpantang:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Konfigurasi modul 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
Pilihan pelaksanaan himpunan lalai freeradius с pengesah google memerlukan pengguna memasukkan bukti kelayakan dalam format: kata laluan nama pengguna+OTP.
Dengan membayangkan bilangan kutukan yang akan jatuh ke atas kepala, dalam hal menggunakan bundle lalai freeradius с Pengesah Google, telah diputuskan untuk menggunakan konfigurasi modul PAM supaya hanya token boleh disemak Pengesah Google.
Apabila pengguna menyambung, perkara berikut berlaku:
- Freeradius menyemak sama ada pengguna berada dalam domain dan dalam kumpulan tertentu dan, jika berjaya, semak token OTP.
Semuanya kelihatan cukup baik sehingga saat saya terfikir "Bagaimanakah saya boleh mendaftarkan OTP untuk 300+ pengguna?"
Pengguna mesti log masuk ke pelayan dengan freeradius dan dari bawah akaun anda dan jalankan aplikasi Pengesah Google, yang akan menjana kod QR untuk aplikasi untuk pengguna. Di sinilah bantuan datang. kotak shellina dalam kombinasi dengan .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Fail konfigurasi daemon terletak di /etc/sysconfig/shellinabox.
Saya nyatakan port 443 di sana dan anda boleh menentukan sijil anda.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Pengguna hanya perlu mengikuti pautan, memasukkan kredit domain dan menerima kod QR untuk aplikasi.
Algoritma adalah seperti berikut:
- Pengguna log masuk ke mesin melalui pelayar.
- Sama ada pengguna domain disemak. Jika tidak, maka tiada tindakan diambil.
- Jika pengguna ialah pengguna domain, keahlian dalam kumpulan Pentadbir disemak.
- Jika bukan pentadbir, ia menyemak sama ada Google Authenticator dikonfigurasikan. Jika tidak, maka kod QR dan log keluar pengguna dijana.
- Jika bukan pentadbir dan Google Authenticator dikonfigurasikan, maka hanya log keluar.
- Jika pentadbir, semak Google Authenticator sekali lagi. Jika tidak dikonfigurasikan, kod QR dijana.
Semua logik dilakukan menggunakan /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
Persediaan Fortigate:
- Kami cipta Radius-pelayan
- Kami mencipta kumpulan yang diperlukan, jika perlu, kawalan akses mengikut kumpulan. Nama kumpulan dihidupkan Berpantang mesti sepadan dengan kumpulan yang diluluskan Atribut Khusus Vendor Nama-Kumpulan Fortinet.
- Mengedit yang perlu SSL-portal.
- Menambah kumpulan pada dasar.
Kelebihan penyelesaian ini:
- Ia adalah mungkin untuk mengesahkan melalui OTP pada Berpantang penyelesaian sumber terbuka.
- Pengguna tidak memasukkan kata laluan domain apabila menyambung melalui VPN, yang sedikit sebanyak memudahkan proses sambungan. Kata laluan 6 digit lebih mudah untuk dimasukkan daripada yang disediakan oleh dasar keselamatan. Akibatnya, bilangan tiket dengan subjek: "Saya tidak dapat menyambung ke VPN" berkurangan.
PS Kami merancang untuk menaik taraf penyelesaian ini kepada pengesahan dua faktor sepenuhnya dengan respons cabaran.
Kini:
Seperti yang dijanjikan, saya mengubahnya kepada pilihan respons cabaran.
Jadi:
Dalam fail /etc/raddb/sites-enabled/default bahagian memberi kebenaran kelihatan seperti ini:
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
}
Bahagian mengesahkan sekarang kelihatan seperti ini:
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
}
Sekarang pengesahan pengguna berlaku mengikut algoritma berikut:
- Pengguna memasukkan kredit domain dalam klien VPN.
- Freeradius menyemak kesahihan akaun dan kata laluan
- Jika kata laluan adalah betul, maka permintaan untuk token dihantar.
- Token sedang disahkan.
- keuntungan).
Sumber: www.habr.com