İki faktorlu doğrulama olursa, ne yapmalı, hem yapıldığı hem de para olmadığı halde, donanım jetonları almak için düşündüğünüzde, ruh halinizi iyi tutun.
Bu çözüm, tamamen orijinal bir şey değil; daha çok, internette bulunan çeşitli çözümlerin bir karışımı.
İşte burada
Alan adı Active Directory.
VPN üzerinden çalışan alan kullanıcıları, günümüzde birçok kişi gibi.
VPN geçidi olarak görev yapan Fortigate.
VPN istemcisi için şifre kaydetmek güvenlik politikası tarafından yasaklanmıştır.
Politika Fortinet kendi jetonları konusunda oldukça cömert söylemek zor — toplam 10 ücretsiz jeton var, diğerleri ise oldukça pahalı. RSASecureID, Duo gibi seçenekleri düşünmedim çünkü açık kaynak istemekteyim.
Ön gereksinimler: sunucu *nix kurulu freeradius, sssd — alanın içine alınmış, alan kullanıcıları bunun üzerinde rahatça kimlik doğrulayabilir.
Ek paketler: shellinabox, figlet, freeradius-ldap, yazı tipi rebel.tlf deposundan .
Örneğimde — CentOS 7.8.
Çalışma mantığı şu şekilde: VPN'e bağlandığında kullanıcı, şifre yerine alan kimliğini ve OTP'yi girmelidir.
Hizmetlerin yapılandırılması
İ /etc/raddb/radiusd.conf sadece kullanıcı ve grup, başlangıçta çalışan isim değiştirilir freeradius, çünkü hizmetin radiusd tüm alt dizinlerde dosyaları okuyabilmesi gerekiyor. /home/.
user = root
group = root
Grupların ayarlarda kullanılabilmesi için Fortigate, şu değerleri iletmek gerekir: Vendor Specific Attribute. Bunun için raddb/policy.d bu içerikle yeni bir dosya oluşturuyorum:
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 := "Hoş geldiniz Admin"
}
}
else {
update reply {
&Reply-Message := "VPN için yetkilendirilmedi"
}
reject
}
}
freeradius-ldap yüklendikten sonra raddb/mods-available dizini içinde bir dosya oluşturur ldap raddb/mods-enabled.
bünyesinde sembolik bir bağlantı oluşturmamız gerekiyor. ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap.
İçeriğini şöyle düzenliyorum: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' } }
raddb/sites-enabled/default raddb/sites-enabled/inner-tunnel dosyasında da və authorize bölümüne kullanılacak politika adını ekliyorum — group_authorization. Önemli bir nokta — politika adı, dizin içindeki dosya adı ile değil, dosya içerisindeki süslü parantezlerden önceki direktif ile belirlenir. authenticate bu dosyalarda de pamsatırını aktif hale getirmek gerekiyor.
clients.conf authenticate в этих же файлах нужно раскомментировать строку pam.
Faylda clients.conf bağlantı qurulacaq parametrləri qeyd edirik Fortigate:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Modul konfiqurasiyası 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
Defolt tətbiq variantları freeradius c google authenticator istifadəçi tərəfindən daxil edilməsini nəzərdə tutur: istifadəçi_adı/parol+OTP.
Defolt kombinasiya istifadə edildikdə başına yağacaq lənətlərin sayını düşündüm freeradius c Google Authenticator, modul konfiqurasiyasını istifadə etməyə qərar verildi pam sadəcə tokeni yoxlamaq üçün Google Authenticator.
İstifadəçi qoşularkən aşağıdakılar baş verir:
- Freeradius, istifadəçinin domen içində olub olmadığını yoxlayır və uğur qazandığı halda OTP tokenini yoxlayır.
Hər şey çox yaxşı görünürdü, ta ki «300+ istifadəçini OTP qeydiyyatdan necə keçirəcəyimi düşünməyə başlayana qədər»
İstifadəçi serverə qoşulmalıdır freeradius və öz hesabından Google authenticator proqramını açmalıdır , bu da istifadəçi üçün QR-kod yaradacaq. Buradakombinasiyası köməyə gəlir shellinabox .bash_profile [root@freeradius ~]# yum install -y shellinabox.
Demonun konfiqurasiya faylı
oradakı portu 443 göstərirəm və şəxsi sertifikatınızı da göstərə bilərsiniz. /etc/sysconfig/shellinabox.
[root@freeradius ~]#systemctl enable --now shellinaboxd
İstifadəçi sadəcə linkə daxil olmalı, domen kredensiallarını daxil etməli və proqram üçün QR-kod almalıdır.Alqoritm aşağıdakı kimidir:
İstifadəçi brauzer vasitəsilə maşına daxil olur.
- İstifadəçinin domen olub-olmadığı yoxlanılır. Əgər yoxdursa, heç bir əməl görülmür.
- İstifadəçi domenidirsə, administrator qrupuna aid olub-olmadığı yoxlanılır.
- Əgər administrator deyilsə, Google Authenticator-un qurulması yoxlanılır. Əgər yoxdursa, QR-kod yaradılır və istifadəçi çıxarılır.
- Əgər administrator deyilərsə və Google Authenticator qurulubsa, sadəcə çıxarılır.
- Əgər administratordırlarsa, yenidən Google Authenticator yoxlanılır. Əgər qurulmamışdırsa, QR-kod yaradılır.
- Bütün məntiq
cat /etc/skel/.bash_profile /etc/skel/.bash_profile.
Fortigate konfiqurasiyası:
# .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
Radius
- yaradırıq -serverTələb olunduqda qruplara girişin ayrılması üçün zəruri qrupları yaradırıq. Qrup adı

- Fortinet-Group-Name Fortigate -ə uyğun olmalıdır Vendor Specific Attribute Zəruri.

- -portalını tənzimləyirik. SSLQrupları siyasətlərə əlavə edirik.

- Bu həllin üstünlükləri:

OTP autentikasiyası imkanı var
- açıq mənbə həlli ilə. Fortigate VPN ilə qoşulma zamanı istifadəçinin domen parolunu daxil etməsini istisna edir, bu da qoşulma prosesini sadələşdirir. 6-rəqəmli parol daxil etmək, təhlükəsizlik siyasəti ilə nəzərdə tutulmuş olandan daha asandır. Nəticədə, «VPN-ə qoşula bilmirəm» mövzusunda bilet sayı azalır.
- P.S. Bu həllin tam iki faktorlu təsdiqləmə ilə challenge-response variantına gətirmək planlayıram.
Yenilik:
Söylədiyim kimi, challenge-response variantına keçidi tamamladım.
seksiya
Beləliklə:
Faylda /etc/raddb/sites-enabled/default aşağıdakı kimi görünür: authenticate aşağıdakı kimi görünür:
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
}
Bölmə authenticate indi aşağıdakı formada:
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 := "Lütfən OTP daxil edin"
}
# Return Access-Challenge:
challenge
}
}
pam
eap
}
İndi istifadəçi yoxlaması aşağıdakı alqoritm ilə həyata keçirilir:
- İstifadəçi VPN müştərisində domen kreditlərini daxil edir.
- Freeradius hesabın etibarlılığını və şifrəni yoxlayır
- Əgər parol düzgün deyilsə, token üçün sorğu göndərilir.
- Token yoxlanılır.
- Qazanc).
Mənbə: habr.com




