چه می شود اگر احراز هویت دو مرحله ای هم مطلوب و هم خاردار باشد، اما پولی برای توکن های سخت افزاری وجود ندارد و به طور کلی پیشنهاد می کنند که روحیه خوبی داشته باشند.
این راه حل چیزی فوق العاده اصلی نیست، بلکه ترکیبی از راه حل های مختلف موجود در اینترنت است.
بنابراین داده شده است
Домен اکتیو دایرکتوری.
کاربران دامنه مانند بسیاری از امروز از طریق VPN کار می کنند.
به عنوان دروازه VPN عمل می کند تقویت کنید.
ذخیره رمز عبور برای سرویس گیرنده VPN توسط سیاست امنیتی ممنوع است.
سیاست Fortinet در رابطه با توکنهای خود، نمیتوانید آن را کمتر از یک zhlob بنامید - به اندازه 10 توکن رایگان وجود دارد، بقیه - با قیمت بسیار غیرکوشر. من RSASecureID، Duo و امثال آن را در نظر نگرفتم، زیرا منبع باز می خواهم.
پیش نیازها: میزبان * نیکس با تاسیس رادیوس آزاد, ssd - وارد دامنه، کاربران دامنه می توانند به راحتی روی آن احراز هویت کنند.
بسته های اضافی: شلینا باکس, انجیر, Freeradius-ldap، فونت شورشی.tlf از مخزن
در مثال من - CentOS 7.8.
منطق کار قرار است به این صورت باشد: در هنگام اتصال به VPN، کاربر باید به جای رمز عبور، Login دامنه و OTP را وارد کند.
راه اندازی خدمات
В /etc/raddb/radiusd.conf فقط کاربر و گروهی که از طرف آنها شروع می شود رادیوس آزاد، از زمان ارائه خدمات شعاع باید بتواند فایل ها را در همه زیر شاخه ها بخواند / خانه /.
user = root
group = root
برای اینکه بتوانید از گروه ها در تنظیمات استفاده کنید تقویت کنید، باید منتقل شود ویژگی خاص فروشنده. برای انجام این کار، در دایرکتوری raddb/policy.d من یک فایل با محتوای زیر ایجاد می کنم:
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
}
}
بعد از نصب Freeradius-ldap در دایرکتوری raddb/mods-available فایل ایجاد می شود ldap.
نیاز به ایجاد یک پیوند نمادین به دایرکتوری raddb/mods-enabled.
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
من مطالب آن را به این شکل می آورم:
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 در بخش اجازه دادن من نام خط مشی مورد استفاده را اضافه می کنم - group_authorization. یک نکته مهم - نام خط مشی با نام فایل موجود در فهرست تعیین نمی شود Policy.d، اما با یک دستورالعمل در داخل فایل قبل از بریس های فرفری.
در بخش تصدیق کردن در همان فایل ها باید خط را از کامنت خارج کنید pam.
در پرونده clients.conf پارامترهایی را که با آن متصل می شود را تجویز کنید تقویت کنید:
client fortigate {
ipaddr = 192.168.1.200
secret = testing123
require_message_authenticator = no
nas_type = other
}
پیکربندی ماژول 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
گزینه های اجرای پیش فرض بسته رادیوس آزاد с گواهینامه گوگل از کاربر می خواهد که اعتبارنامه ها را در قالب زیر وارد کند: نام کاربری/رمز عبور+OTP.
با تصور تعداد نفرین هایی که در صورت استفاده از بسته نرم افزاری پیش فرض بر سر می افتد رادیوس آزاد с Google Authenticator را، تصمیم گرفته شد از پیکربندی ماژول استفاده شود pam به طوری که فقط نشانه قابل بررسی است Google Authenticator را.
هنگامی که یک کاربر متصل می شود، موارد زیر رخ می دهد:
- Freeradius بررسی می کند که آیا کاربر در دامنه و در یک گروه خاص قرار دارد و در صورت موفقیت، توکن OTP را بررسی می کند.
همه چیز به اندازه کافی خوب به نظر می رسید تا زمانی که فکر کردم "چگونه می توانم OTP را برای بیش از 300 کاربر ثبت کنم؟"
کاربر باید با وارد شدن به سرور رادیوس آزاد و از زیر اکانت خود و برنامه را اجرا کنید تأییدکننده Google، که یک کد QR برای برنامه برای کاربر ایجاد می کند. اینجاست که کمک می آید. شلینا باکس در ترکیب با .bash_profile.
[root@freeradius ~]# yum install -y shellinabox
فایل پیکربندی دیمون در این آدرس قرار دارد /etc/sysconfig/shellinabox.
من پورت 443 را در آنجا مشخص می کنم و شما می توانید گواهی خود را مشخص کنید.
[root@freeradius ~]#systemctl enable --now shellinaboxd
کاربر فقط باید پیوند را دنبال کند، اعتبار دامنه را وارد کند و یک کد QR برای برنامه دریافت کند.
الگوریتم به شرح زیر است:
- کاربر از طریق مرورگر وارد دستگاه می شود.
- اینکه آیا کاربر دامنه بررسی شده است یا خیر. در غیر این صورت هیچ اقدامی صورت نمی گیرد.
- اگر کاربر یک کاربر دامنه باشد، عضویت در گروه Administrators بررسی می شود.
- اگر سرپرست نیست، بررسی میکند که آیا Google Authenticator پیکربندی شده است یا خیر. اگر نه، یک کد QR و خروج کاربر ایجاد می شود.
- اگر مدیر نیست و Google Authenticator پیکربندی شده است، فقط از سیستم خارج شوید.
- اگر سرپرست هستید، دوباره Google Authenticator را بررسی کنید. اگر پیکربندی نشده باشد، یک کد QR ایجاد می شود.
تمام منطق با استفاده از آن انجام می شود /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:
- ما ایجاد می کنیم شعاع-سرور
- ما گروه های لازم را ایجاد می کنیم، در صورت لزوم، کنترل دسترسی توسط گروه ها. نام گروه روشن است تقویت کنید باید با گروه قبول شده مطابقت داشته باشد ویژگی خاص فروشنده Fortinet-گروه-نام.
- ویرایش موارد لازم SSL-پورتال ها
- افزودن گروه ها به خط مشی ها
مزایای این راه حل:
- امکان احراز هویت توسط OTP روشن وجود دارد تقویت کنید راه حل منبع باز
- کاربر هنگام اتصال از طریق VPN رمز عبور دامنه را وارد نمی کند که تا حدودی فرآیند اتصال را ساده می کند. گذرواژه 6 رقمی آسانتر از رمزی است که توسط سیاست امنیتی ارائه شده است. در نتیجه، تعداد بلیطهای با موضوع: «نمیتوانم به VPN متصل شوم» کاهش مییابد.
PS ما قصد داریم این راه حل را به یک احراز هویت دو مرحله ای کامل با چالش-پاسخ ارتقا دهیم.
به روز رسانی:
همانطور که قول داده بودم، آن را به گزینه چالش-پاسخ تغییر دادم.
پس:
در پرونده /etc/raddb/sites-enabled/default بخش اجازه دادن به نظر می رسد این:
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
}
بخش تصدیق کردن اکنون به این شکل است:
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
}
اکنون تأیید کاربر طبق الگوریتم زیر انجام می شود:
- کاربر اعتبار دامنه را در سرویس گیرنده VPN وارد می کند.
- Freeradius اعتبار حساب و رمز عبور را بررسی می کند
- اگر رمز عبور صحیح باشد، درخواست توکن ارسال می شود.
- رمز در حال تایید است.
- سود).
منبع: www.habr.com