Ya iki faktörlü kimlik doğrulama hem arzu edilir hem de zahmetliyse, ancak donanım belirteçleri için para yoksa ve genel olarak iyi bir ruh halinde kalmayı teklif ediyorlarsa?
Bu çözüm, süper orijinal bir şey değil, İnternette bulunan farklı çözümlerin bir karışımıdır.
yani verildi
Alan Adı Active Directory.
Günümüzde pek çok kişi gibi, bir VPN aracılığıyla çalışan etki alanı kullanıcıları.
VPN ağ geçidi görevi görür güçlendirmek.
VPN istemcisi için şifrenin kaydedilmesi güvenlik politikası tarafından yasaklanmıştır.
Siyaset Fortinet kendi jetonlarınızla ilgili olarak, buna bir zhlob'tan daha az diyemezsiniz - 10 kadar ücretsiz jeton vardır, geri kalanı - koşer olmayan bir fiyata. Açık kaynak istediğim için RSASecureID, Duo ve benzerlerini düşünmedim.
Önkoşullar: evsahibi * nix kurulan ile FreeRADIUS'un, ssd - etki alanına girildiğinde, etki alanı kullanıcıları üzerinde kolayca kimlik doğrulaması yapabilir.
Ek paketler: çöp kutusu, balık, freeradius-ldap, yazı tipi asi.tlf depodan
Benim örneğimde - CentOS 7.8.
Çalışma mantığının şu şekilde olması gerekiyor: Bir VPN'e bağlanırken, kullanıcının şifre yerine bir etki alanı girişi ve OTP girmesi gerekir.
servis kurulumu
В /etc/raddb/radiusd.conf sadece adına başlayan kullanıcı ve grup FreeRADIUS'un, çünkü hizmet yarıçaplı tüm alt dizinlerdeki dosyaları okuyabilmelidir /ev/.
user = root
group = root
Ayarlarda grupları kullanabilmek için güçlendirmek, iletilmelidir Satıcıya Özgü Öznitelik. Bunun için dizinde raddb/policy.d Aşağıdaki içeriğe sahip 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 := "Welcome Admin"
}
}
else {
update reply {
&Reply-Message := "Not authorized for vpn"
}
reject
}
}
Kurulumdan sonra freeradius-ldap dizinde Raddb/mods-mevcut dosya oluşturuldu ldap.
Dizine sembolik bir bağlantı oluşturmanız gerekiyor raddb/mods etkin.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
İçeriğini bu forma getiriyorum:
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'
}
}
dosyalarda raddb/siteler etkin/varsayılan и raddb/siteler etkin/iç tünel kısımda yetki vermek Kullanılacak politikanın adını ekliyorum - group_yetkilendirme. Önemli bir nokta - ilkenin adı, dizindeki dosyanın adıyla belirlenmez politika.d, ancak kaşlı ayraçlardan önce dosyanın içindeki bir yönerge ile.
Bölümde kimlik doğrulaması aynı dosyalarda satırın açıklamasını kaldırmanız gerekir pam.
Dosyada client.conf bağlanacağı parametreleri belirtin güçlendirmek:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
Modül yapılandırması pam.d/yarıçap:
#%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
Varsayılan paket uygulama seçenekleri FreeRADIUS'un с google authenticator kullanıcının kimlik bilgilerini şu biçimde girmesini gerektir: Kullanıcı adı Şifre+OTP.
Varsayılan paketin kullanılması durumunda kafaya düşecek lanet sayısını hayal ederek FreeRADIUS'un с Google Şifrematik, modül konfigürasyonunun kullanılmasına karar verildi pam böylece yalnızca belirteç kontrol edilebilir Google Şifrematik.
Bir kullanıcı bağlandığında aşağıdakiler gerçekleşir:
- Freeradius, kullanıcının etki alanında ve belirli bir grupta olup olmadığını kontrol eder ve başarılı olursa OTP jetonunu kontrol eder.
"300'den fazla kullanıcı için OTP'yi nasıl kaydedebilirim?" diye düşündüğüm ana kadar her şey yeterince iyi görünüyordu.
Kullanıcı sunucuya şununla giriş yapmalıdır: FreeRADIUS'un ve hesabınızın altından ve uygulamayı çalıştırın Google kimlik doğrulayıcıkullanıcı için uygulama için bir QR kodu oluşturacak. Yardımın geldiği yer burasıdır. çöp kutusu ile bütünlüğünde .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
Arka plan programı yapılandırma dosyası şurada bulunur: /etc/sysconfig/shellinabox.
Orada 443 numaralı bağlantı noktasını belirtiyorum ve sertifikanızı belirtebilirsiniz.
[root@freeradius ~]#systemctl enable --now shellinaboxd
Kullanıcının yalnızca bağlantıyı takip etmesi, alan adı kredilerini girmesi ve uygulama için bir QR kodu alması yeterlidir.
Algoritma aşağıdaki gibidir:
- Kullanıcı, bir tarayıcı aracılığıyla makinede oturum açar.
- Etki alanı kullanıcısının kontrol edilip edilmediği. Değilse, hiçbir işlem yapılmaz.
- Kullanıcı bir etki alanı kullanıcısı ise, Yöneticiler grubundaki üyelik kontrol edilir.
- Yönetici değilse, Google Authenticator'ın yapılandırılıp yapılandırılmadığını kontrol eder. Değilse, bir QR kodu ve kullanıcı oturumu kapatılır.
- Bir yönetici değilse ve Google Authenticator yapılandırılmışsa, oturumu kapatın.
- Yönetici ise, Google Authenticator'ı tekrar kontrol edin. Yapılandırılmamışsa, bir QR kodu oluşturulur.
Tüm mantık kullanılarak yapılır /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 kurulumu:
- oluşturmak yarıçap-sunucu
- Gerekli grupları, gerekirse gruplara göre erişim kontrolü oluşturuyoruz. Grup adı açık güçlendirmek iletilen grupla eşleşmelidir Satıcıya Özgü Öznitelik Fortinet-Grup-Adı.
- Gerekli düzenleme SSL-portallar.
- Politikalara grup ekleme.
Bu çözümün avantajları:
- OTP ile kimlik doğrulaması yapmak mümkündür. güçlendirmek açık kaynak çözümü.
- Kullanıcı, VPN aracılığıyla bağlanırken bir etki alanı parolası girmez, bu da bağlantı sürecini biraz basitleştirir. 6 haneli şifrenin girilmesi, güvenlik politikası tarafından sağlanandan daha kolaydır. Sonuç olarak, “VPN'ye bağlanamıyorum” konulu bilet sayısı azalır.
Not: Bu çözümü, sorgulama-yanıtlama özelliğine sahip tam teşekküllü iki faktörlü kimlik doğrulamasına yükseltmeyi planlıyoruz.
Güncelleme:
Söz verdiğim gibi, onu meydan okuma-yanıt seçeneğine ayarladım.
Yani:
Dosyada /etc/raddb/siteler etkin/varsayılan bölüm yetki vermek выглядит следующим образом:
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ölüm kimlik doğrulaması şimdi şöyle görünüyor:
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
}
Artık kullanıcı doğrulaması aşağıdaki algoritmaya göre gerçekleşir:
- Kullanıcı, VPN istemcisine etki alanı kredilerini girer.
- Freeradius hesabın ve şifrenin geçerliliğini kontrol eder
- Parola doğruysa, belirteç için bir istek gönderilir.
- Belirteç doğrulanıyor.
- kâr).
Kaynak: habr.com