Freeradius + Google Authenticator + LDAP + Fortigate

چه می شود اگر احراز هویت دو مرحله ای هم مطلوب و هم خاردار باشد، اما پولی برای توکن های سخت افزاری وجود ندارد و به طور کلی پیشنهاد می کنند که روحیه خوبی داشته باشند.

این راه حل چیزی فوق العاده اصلی نیست، بلکه ترکیبی از راه حل های مختلف موجود در اینترنت است.

بنابراین داده شده است

Домен اکتیو دایرکتوری.

کاربران دامنه مانند بسیاری از امروز از طریق VPN کار می کنند.

به عنوان دروازه VPN عمل می کند تقویت کنید.

ذخیره رمز عبور برای سرویس گیرنده VPN توسط سیاست امنیتی ممنوع است.

سیاست Fortinet در رابطه با توکن‌های خود، نمی‌توانید آن را کمتر از یک zhlob بنامید - به اندازه 10 توکن رایگان وجود دارد، بقیه - با قیمت بسیار غیرکوشر. من RSASecureID، Duo و امثال آن را در نظر نگرفتم، زیرا منبع باز می خواهم.

پیش نیازها: میزبان * نیکس با تاسیس رادیوس آزاد, ssd - وارد دامنه، کاربران دامنه می توانند به راحتی روی آن احراز هویت کنند.

بسته های اضافی: شلینا باکس, انجیر, Freeradius-ldap، فونت شورشی.tlf از مخزن https://github.com/xero/figlet-fonts.

در مثال من - 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:

  • ما ایجاد می کنیم شعاع-سرور

    Freeradius + Google Authenticator + LDAP + Fortigate

  • ما گروه های لازم را ایجاد می کنیم، در صورت لزوم، کنترل دسترسی توسط گروه ها. نام گروه روشن است تقویت کنید باید با گروه قبول شده مطابقت داشته باشد ویژگی خاص فروشنده Fortinet-گروه-نام.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • ویرایش موارد لازم SSL-پورتال ها

    Freeradius + Google Authenticator + LDAP + Fortigate

  • افزودن گروه ها به خط مشی ها

    Freeradius + Google Authenticator + LDAP + Fortigate

مزایای این راه حل:

  • امکان احراز هویت توسط 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

اضافه کردن نظر