Freeradius + Google Authenticator + LDAP + Fortigate

څه شی که د دوه فاکتور تصدیق دواړه مطلوب او کاندي وي ، مګر د هارډویر ټیکونو لپاره پیسې شتون نلري او په عموم کې دوی وړاندیز کوي چې په ښه مزاج کې پاتې شي.

دا حل یو څه خورا اصلي ندي ، بلکه په انټرنیټ کې موندل شوي د مختلف حلونو ترکیب دی.

نو ورکړل

دنده فعال نوملړ.

د ډومین کاروونکي د VPN له لارې کار کوي، لکه نن ورځ ډیری.

د VPN دروازې په توګه کار کوي جوړول.

د VPN پیرودونکي لپاره د پټنوم خوندي کول د امنیت پالیسۍ لخوا منع دي.

سیاست فورټینټ ستاسو د خپلو ټوکنونو په تړاو، تاسو نشئ کولی دا له ژلوب څخه کم ووایی - دلته تر 10 وړیا ټوکنونه شتون لري، پاتې نور - په خورا غیر کوشیر قیمت کې. ما RSASecureID، Duo او ورته ورته پام نه دی کړی، ځکه چې زه خلاص سرچینه غواړم.

شرطونه: کوربه * nix د تاسیس سره freeradius, ssd - ډومین ته ننوتل، د ډومین کاروونکي کولی شي په اسانۍ سره تصدیق کړي.

اضافي کڅوړې: د شیلینا بکس, انګور, freeradius-ldap, فونټ rebel.tlf له ذخیره څخه https://github.com/xero/figlet-fonts.

زما په مثال کې - CentOS 7.8.

د کار منطق باید په لاندې ډول وي: کله چې د VPN سره وصل کیږي ، کارونکي باید د پټنوم پرځای ډومین لاګ ان او OTP داخل کړي.

د خدماتو تنظیم کول

В /etc/raddb/radiusd.conf یوازې هغه کارن او ډله چې د هغې په استازیتوب پیل کیږي freeradius، له خدمت راهیسې وړانګې باید په ټولو فرعي ډایرکټرونو کې د فایلونو لوستلو وړ وي / کور /.

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-د شتون وړ فایل جوړیږي ldap.

لارښود ته سمبولیک لینک رامینځته کولو ته اړتیا ده raddb/mods فعال شوی.

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/site-enabled/inner-tunnel په برخه کې اختیار ورکول زه د هغه پالیسۍ نوم اضافه کوم چې کارول کیږي - group_authorization. یو مهم ټکی - د پالیسۍ نوم په لارښود کې د فایل نوم لخوا نه ټاکل کیږي پاليسي, مګر د دوتنې دننه د یو لارښود په واسطه مخکې له دې چې منحل منحل وي.
په برخه کې مستند کول په ورته فایلونو کې تاسو اړتیا لرئ کرښه غیر کمنټ کړئ پام.

په دوتنه کې 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

د ډیفالټ بنډل پلي کولو اختیارونه freeradius с د ګوګل اعتبار کوونکی کاروونکي ته اړتیا لري چې په بڼه کې اسناد داخل کړي: د کارونې نوم پټ توري+OTP.

دتعریفونو د شمیر په تصور کولو سره چې په سر کې به راښکته شي ، د ډیفالټ بنډل کارولو په حالت کې freeradius с د ګوګل Authenticator، پریکړه وشوه چې د ماډل ترتیب وکاروئ پام د دې لپاره چې یوازې نښه وڅیړل شي د ګوګل Authenticator.

کله چې یو کاروونکي وصل شي، لاندې واقع کیږي:

  • Freeradius چک کوي چې آیا کاروونکي په ډومین کې دی او یا په یو ځانګړي ګروپ کې او که بریالی وي، د OTP نښه چک کوي.

هرڅه تر هغه وخته پورې ښه ښکاري چې ما فکر کاوه "زه څنګه کولی شم د 300+ کاروونکو لپاره OTP ثبت کړم؟"

کارونکي باید سرور ته ننوځي freeradius او د خپل حساب لاندې څخه او غوښتنلیک پرمخ وړئ د ګوګل تصدیق کوونکی، کوم چې به د کارونکي لپاره د غوښتنلیک لپاره QR کوډ رامینځته کړي. دا هغه ځای دی چې مرسته راځي. د شیلینا بکس سره په ترکیب کې .bash_profile.

[root@freeradius ~]# yum install -y shellinabox

د ډیمون ترتیب کولو فایل په کې موقعیت لري /etc/sysconfig/shellinabox.
زه هلته 443 پورټ مشخص کوم او تاسو کولی شئ خپل سند مشخص کړئ.

[root@freeradius ~]#systemctl enable --now shellinaboxd

کارن کولی شي یوازې لینک تعقیب کړي، د ډومین اسناد داخل کړي او د غوښتنلیک لپاره د QR کوډ ترلاسه کړي.

الګوریتم په لاندې ډول دی:

  • کارونکي د براوزر له لارې ماشین ته ننوځي.
  • ایا د ډومین کارونکي چک شوي. که نه، نو هیڅ اقدام نه کیږي.
  • که کارن د ډومین کاروونکي وي، د مدیرانو په ګروپ کې غړیتوب چک کیږي.
  • که مدیر نه وي، دا ګوري چې ایا د ګوګل تصدیق کونکی تنظیم شوی. که نه، نو بیا د QR کوډ او د کاروونکي لاګ آوټ رامینځته کیږي.
  • که چیرې مدیر نه وي او د ګوګل تصدیق کونکی تنظیم شوی وي ، نو یوازې لاګ آوټ شئ.
  • که مدیر، نو بیا د ګوګل تصدیق کونکي وګورئ. که تنظیم شوی نه وي، یو 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

د تقویت تنظیم کول:

  • موږ جوړوو وړانګې-سرور

    Freeradius + Google Authenticator + LDAP + Fortigate

  • موږ اړین ګروپونه جوړوو، که اړتیا وي، د ډلو لخوا د لاسرسي کنټرول. د ګروپ نوم پر جوړول باید د هغه ګروپ سره سمون ولري چې انتقال شوی د پلورونکي ځانګړي ځانګړتیا Fortinet-د ګروپ-نوم.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • اړین ترمیم کول ایس ایس-پورټلونه.

    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

Add a comment