Freeradius + Google Authenticator + LDAP + Fortigate

ڇا جيڪڏهن ٻه عنصر جي تصديق ٻنهي گهربل ۽ ڇڪيل آهي، پر هارڊويئر ٽوڪن لاء پئسا نه آهن ۽ عام طور تي اهي سٺو موڊ ۾ رهڻ جي آڇ ڪندا آهن.

هي حل ڪجهه سپر اصل نه آهي، بلڪه انٽرنيٽ تي مليا مختلف حلن جو هڪ ميلاپ.

سو ڏنو

Домен فعال ڊاريڪٽري.

ڊومين استعمال ڪندڙ هڪ وي پي اين ذريعي ڪم ڪري رهيا آهن، جهڙوڪ ڪيترائي اڄ.

VPN گيٽ وي طور ڪم ڪري ٿو فارغ ڪيو.

VPN ڪلائنٽ لاءِ پاسورڊ محفوظ ڪرڻ سيڪيورٽي پاليسي طرفان منع ٿيل آهي.

سياست قلعي واري توهان جي پنهنجي ٽوڪن جي سلسلي ۾، توهان ان کي zhlob کان گهٽ نه ٿا سڏي سگهو - هتي 10 کان وڌيڪ مفت ٽوڪن آهن، باقي - تمام گهڻي غير ڪوشر قيمت تي. مون غور نه ڪيو RSASecureID، Duo ۽ پسند، ڇاڪاڻ ته مون کي کليل ذريعو چاهيو.

شرطون: ميزبان * اينڪس قائم ڪيل سان فري ريڊيس, ايس ايس ڊي آهي - ڊومين ۾ داخل ٿيو، ڊومين استعمال ڪندڙ آساني سان ان تي تصديق ڪري سگھن ٿا.

اضافي پيڪيجز: شيلينا باڪس, خطو, freeradius-ldap، فونٽ rebel.tlf مخزن کان https://github.com/xero/figlet-fonts.

منهنجي مثال ۾ - CentOS 7.8.

ڪم جو منطق هن ريت هجڻ گهرجي: جڏهن هڪ VPN سان ڳنڍڻ، صارف کي پاسورڊ جي بدران ڊومين لاگ ان ۽ 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-دستياب فائل ٺاهي وئي آهي ايل ڊي پي.

ڊاريڪٽري ڏانهن علامتي لنڪ ٺاهڻ جي ضرورت آهي 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. هڪ اهم نقطو - پاليسي جو نالو ڊاريڪٽري ۾ فائل جي نالي سان طئي ٿيل نه آهي پاليسي ڊي, پر ھڪڙي ھدايت سان فائل اندر گھڙي گھڙي کان اڳ.
سيڪشن ۾ مستند ساڳئي فائلن ۾ توهان کي لڪير کي ختم ڪرڻ جي ضرورت آهي 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

ڊفالٽ بنڈل لاڳو ڪرڻ جا اختيار فري ريڊيس с گوگل ريٽيڪلٽر صارف کي فارميٽ ۾ سندون داخل ڪرڻ جي ضرورت آھي: يوزرنيم/پاسورڊ+او ٽي پي.

ڪَمَرَ جو تعداد تصور ڪرڻ سان جيڪو سر تي پوندو، ڊفالٽ بنڊل استعمال ڪرڻ جي صورت ۾ فري ريڊيس с Google Authenticator, ان کي استعمال ڪرڻ جو فيصلو ڪيو ويو ماڊل ترتيب pam ته جيئن صرف ٽوڪن چيڪ ڪري سگهجي Google Authenticator.

جڏهن هڪ صارف ڳنڍيندو آهي، هيٺيان ٿئي ٿو:

  • Freeradius چيڪ ڪري ٿو ته صارف ڊومين ۾ آهي ۽ هڪ خاص گروپ ۾ ۽، جيڪڏهن ڪامياب ٿي، OTP ٽوڪن کي چيڪ ڪري ٿو.

هر شيءِ ڪافي سٺي لڳي رهي هئي ان لمحي تائين جڏهن مون سوچيو ”مان 300+ استعمال ڪندڙن لاءِ OTP ڪيئن رجسٽر ڪري سگهان ٿو؟

استعمال ڪندڙ کي سرور سان لاگ ان ٿيڻ گهرجي فري ريڊيس ۽ توهان جي اڪائونٽ هيٺان ۽ ايپليڪيشن کي هلائي گوگل تصديق ڪندڙ، جيڪو صارف لاءِ ايپليڪيشن لاءِ QR ڪوڊ ٺاهيندو. هي آهي جتي مدد اچي ٿي. شيلينا باڪس سان ميلاپ ۾ .bash_profile.

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

ڊيمن جي ٺاھ جوڙ واري فائل تي واقع آھي /etc/sysconfig/shellinabox.
مان هتي پورٽ 443 جي وضاحت ڪريان ٿو ۽ توهان پنهنجي سرٽيفڪيٽ جي وضاحت ڪري سگهو ٿا.

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

استعمال ڪندڙ کي صرف لنڪ جي پيروي ڪرڻ جي ضرورت آهي، ڊومين ڪريڊٽ داخل ڪريو ۽ ايپليڪيشن لاء QR ڪوڊ حاصل ڪريو.

الگورتھم ھي as ڏنل آھي:

  • صارف برائوزر ذريعي مشين ۾ لاگ ان ٿئي ٿو.
  • ڇا ڊومين استعمال ڪندڙ چيڪ ڪيو ويو آهي. جيڪڏهن نه، ته پوء ڪو به عمل نه ڪيو ويندو.
  • جيڪڏهن صارف هڪ ڊومين استعمال ڪندڙ آهي، منتظمين جي گروپ ۾ رڪنيت چيڪ ڪئي وئي آهي.
  • جيڪڏهن منتظم نه آهي، اهو چيڪ ڪري ٿو ته ڇا Google Authenticator ترتيب ڏنل آهي. جيڪڏهن نه، ته پوء هڪ 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

مضبوط سيٽ اپ:

  • اسان ٺاهيندا آهيون ريڊيس Radius-سرور

    Freeradius + Google Authenticator + LDAP + Fortigate

  • اسان ضروري گروپ ٺاھيون ٿا، جيڪڏھن ضروري ھجي، گروپن جي ڪنٽرول تائين رسائي. گروپ جو نالو فارغ ڪيو انهي گروپ سان ملائڻ گهرجي جنهن ۾ پاس ڪيو ويو آهي وينڊر جي مخصوص خاصيت Fortinet-گروپ-نالو.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • ضروري ترميم ڪرڻ ايس ايس ايل- پورٽل.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • گروپن کي پاليسين ۾ شامل ڪرڻ.

    Freeradius + Google Authenticator + LDAP + Fortigate

هن حل جا فائدا:

  • OTP ذريعي تصديق ڪرڻ ممڪن آهي فارغ ڪيو اوپن سورس حل.
  • VPN ذريعي ڳنڍڻ دوران صارف ڊومين پاسورڊ داخل نٿو ڪري، جيڪو ڪنيڪشن جي عمل کي ڪجهه آسان بڻائي ٿو. 6 عددي پاسورڊ سيڪيورٽي پاليسي پاران مهيا ڪيل هڪ کان وڌيڪ داخل ڪرڻ آسان آهي. نتيجي طور، موضوع سان ٽڪيٽن جو تعداد: "مان وي پي اين سان ڳنڍي نٿو سگهان" گھٽجي ٿو.

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

تبصرو شامل ڪريو