Solusi ini bukanlah sesuatu yang super orisinal, melainkan campuran dari berbagai solusi yang ditemukan di Internet.
Jadi, diberikan
Domain Direktori Aktif .
Pengguna domain menggunakan VPN, seperti banyak orang saat ini. Fortigate
bertindak sebagai gateway VPN . Menyimpan kata sandi untuk klien VPN dilarang oleh kebijakan keamanan. Kebijakan Fortinet mengenai tokennya sendiri tidak bisa disebut kurang dari redneck - sudah ada 10 token gratis, sisanya dengan harga yang sangat tidak halal. RSASecureID, Duo, dan sejenisnya belum dipertimbangkan, karena saya ingin open source. Prasyarat: * nix host dengan freeradius terinstal , sssd - masuk ke domain, pengguna domain dapat dengan mudah melakukan otentikasi di atasnya. Paket tambahan:
shellinabox , figlet , freeeradius-ldap , rebel.tlf font dari https://github.com/xero/figlet-fonts repositori .
Dalam contoh saya, CentOS 7.8.
Logika kerjanya adalah sebagai berikut: saat menyambung ke VPN, pengguna harus memasukkan login domain dan OTP, bukan sandi.
Menyiapkan layanan
Di /etc/raddb/radiusd.conf, hanya pengguna dan grup di mana freeradius dimulai yang diubah , karena layanan radiusd harus dapat membaca file di semua subdirektori / home / .
user = root
group = root
Untuk dapat menggunakan grup dalam pengaturan Fortigate , Anda harus meneruskan Atribut Khusus Vendor . Untuk melakukan ini, di direktori raddb / policy.d, buat file dengan konten 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
}
}
Setelah menginstal freeradius-ldap di direktori, file yang tersedia raddb / mods dibuat ldap .
Anda perlu membuat tautan simbolis ke direktori yang mendukung raddb / mods .
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Saya bawa isinya ke formulir 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'
}
}
Di file raddb / sites-enabled / default dan raddb / sites-enabled / inner-tunnel, di bagian otorisasi , saya menambahkan nama kebijakan yang akan digunakan - group_authorization. Poin penting - nama kebijakan ditentukan bukan oleh nama file di direktori policy.d , tetapi oleh arahan di dalam file sebelum tanda kurung kurawal.
Di bagian otentikasi dari file yang sama, hapus komentar pam .
Di file clients.conf, tulis parameter yang akan dihubungkan dengan Fortigate :
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
Opsi default untuk mengimplementasikan bundel freeradius dengan google authenticator melibatkan pengguna yang memasukkan kredensial dalam format: nama pengguna / kata sandi + OTP .
Setelah menyajikan jumlah kutukan yang akan terjadi di kepala Anda, dalam kasus menggunakan paket freeradius default dengan Google Authenticator , diputuskan untuk menggunakan konfigurasi modul pam untuk memverifikasi hanya token Google Authenticator .
Saat pengguna terhubung, hal berikut terjadi:
- Freeradius memeriksa keberadaan pengguna di domain dan di grup tertentu dan, jika berhasil, memeriksa token OTP.
Semuanya terlihat cukup baik sampai saya berpikir, "Bagaimana cara mendaftarkan OTP untuk 300+ pengguna?"
Pengguna harus masuk ke server dengan freeradius dan di bawah akunnya dan menjalankan aplikasi Google Authenticator , yang akan menghasilkan kode QR untuk aplikasi tersebut bagi pengguna. Di sinilah shellinabox berguna dalam kombinasi dengan .bash_profile .
[root@freeradius ~]# yum install -y shellinabox
File konfigurasi daemon terletak di / etc / sysconfig / shellinabox .
Saya menunjukkan port 443 di sana dan Anda dapat menentukan sertifikat Anda.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Pengguna hanya perlu mengikuti tautan, memasukkan kredit domain dan menerima kode QR untuk aplikasi tersebut.
Algoritmanya adalah sebagai berikut:
- Pengguna masuk ke mesin melalui browser.
- Pengguna domain dicentang. Jika tidak, tidak ada tindakan yang diambil.
- Jika pengguna adalah pengguna domain, keanggotaan di grup Administrator dicentang.
- Jika bukan admin, ia memeriksa apakah Google Autheticator dikonfigurasi. Jika tidak, maka kode QR dan logout pengguna dibuat.
- Jika tidak ada admin dan Google Authenticator dikonfigurasi, maka cukup logout.
- Jika admin, periksa lagi Google Authenticator. Jika tidak dikonfigurasi, maka kode QR dibuat.
Semua logika dikerjakan dengan 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
Fortigate setup:
- Buat Server Radius

- Kami membuat grup yang diperlukan, jika perlu, membedakan akses berdasarkan grup. Nama grup di Fortigate harus cocok dengan grup yang diteruskan di Vendor Specific Attribute Fortinet-Group-Name .

- Mengedit portal SSL yang diperlukan .

- Tambahkan grup ke kebijakan.

Keuntungan dari solusi ini:
- Ada kemungkinan otentikasi OTP pada solusi sumber terbuka Fortigate .
- Ini mengecualikan pengguna yang memasukkan kata sandi domain saat terhubung melalui VPN, yang agak menyederhanakan proses koneksi. Kata sandi 6 digit lebih mudah untuk dimasukkan daripada kebijakan keamanan. Akibatnya, jumlah tiket dengan subjek: "Tidak dapat terhubung ke VPN" berkurang.
PS Ada rencana untuk memperketat solusi ini ke otentikasi dua faktor yang lengkap dengan tantangan-respons.
Memperbarui:
Seperti yang dijanjikan, saya menyelesaikannya hingga opsi tantangan-respons.
Jadi:
Dalam / etc / raddb / sites-enabled / default file, authorize bagian terlihat 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
}
Bagian otentikasi sekarang terlihat 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 pengguna diverifikasi menurut algoritme berikut:
- Pengguna memasukkan kredit domain di klien VPN.
- Freeradius memeriksa validitas akun dan kata sandi
- Jika kata sandi benar, maka permintaan token dikirim.
- Token diverifikasi.
- Keuntungan).