Freeradius + Google Autheticator + LDAP + Fortigate

اگر آپ دو عنصر کی توثیق چاہتے ہیں اور ہچکچاتے ہیں تو کیا کریں، لیکن ہارڈویئر ٹوکن کے لیے پیسے نہیں ہیں اور عام طور پر وہ اچھے موڈ کو برقرار رکھنے کا مشورہ دیتے ہیں۔

یہ حل کوئی انتہائی اصلی چیز نہیں ہے، بلکہ انٹرنیٹ پر پائے جانے والے مختلف حلوں کا مرکب ہے۔

تو دیا ہے۔

ڈومین۔ ایکٹو ڈائریکٹری.

VPN کے ذریعے کام کرنے والے ڈومین صارفین، جیسے آج بہت سے لوگ۔

VPN گیٹ وے کے طور پر کام کرتا ہے۔ جعل سازی کرنا۔.

وی پی این کلائنٹ کے لیے پاس ورڈ محفوظ کرنا سیکیورٹی پالیسی کے ذریعے ممنوع ہے۔

سیاست Fortinet اس کے اپنے ٹوکنز کے سلسلے میں، آپ اسے redneck سے کم نہیں کہہ سکتے ہیں - مفت ٹوکن کے زیادہ سے زیادہ 10 یونٹس ہیں، باقی انتہائی غیر کوشر قیمت پر ہیں۔ میں نے RSASecureID، Duo اور اس طرح پر غور نہیں کیا، کیونکہ میں اوپن سورس چاہتا ہوں۔

شرائط: میزبان * nix نصب کے ساتھ freeradius, ایس ایس ڈی - ڈومین میں داخل ہونے پر، ڈومین استعمال کرنے والے آسانی سے اس کی تصدیق کر سکتے ہیں۔

اضافی پیکجز: shellinabox, انجیر, 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-دستیاب فائل بنائی گئی ہے۔ ایل ڈی اے پی.

آپ کو ڈائریکٹری کے لیے ایک علامتی لنک بنانے کی ضرورت ہے۔ 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۔ ایک اہم نکتہ - پالیسی کا نام ڈائریکٹری میں موجود فائل کے نام سے متعین نہیں ہوتا ہے۔ پالیسی ڈی، لیکن گھوبگھرالی منحنی خطوط وحدانی سے پہلے فائل کے اندر ایک ہدایت۔
سیکشن میں تصدیق انہی فائلوں میں آپ کو لائن کو غیر تبصرہ کرنے کی ضرورت ہے۔ پام.

فائل میں 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 с Google Authenticator، یہ ماڈیول کنفیگریشن کو استعمال کرنے کا فیصلہ کیا گیا۔ پام تاکہ صرف ٹوکن چیک کیا جائے۔ Google Authenticator.

جب کوئی صارف جڑتا ہے تو درج ذیل ہوتا ہے:

  • Freeradius چیک کرتا ہے کہ آیا صارف ڈومین میں ہے اور کسی مخصوص گروپ میں اور، اگر کامیاب ہو تو OTP ٹوکن چیک کرتا ہے۔

ہر چیز کافی کامیاب نظر آتی تھی جب تک کہ میں نے سوچا، "میں 300+ صارفین کے لیے OTP کیسے رجسٹر کر سکتا ہوں؟"

صارف کو اس کے ساتھ سرور میں لاگ ان کرنا ہوگا۔ freeradius اور اپنے اکاؤنٹ سے اور ایپلیکیشن لانچ کریں۔ گوگل مستند، جو صارف کے لیے درخواست کے لیے ایک QR کوڈ تیار کرے گا۔ یہ وہ جگہ ہے جہاں یہ بچاؤ آتا ہے۔ shellinabox کے ساتھ مجموعہ میں .bash_profile.

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

ڈیمون کنفیگریشن فائل میں واقع ہے۔ /etc/sysconfig/shellinabox.
میں وہاں پورٹ 443 بتاتا ہوں اور آپ اپنا سرٹیفکیٹ بتا سکتے ہیں۔

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

صارف صرف لنک پر عمل کر سکتا ہے، ڈومین کی اسناد درج کر سکتا ہے اور درخواست کے لیے QR کوڈ حاصل کر سکتا ہے۔

الگورتھم مندرجہ ذیل ہے:

  • صارف براؤزر کے ذریعے مشین میں لاگ ان ہوتا ہے۔
  • آیا صارف ڈومین صارف ہے چیک کیا جاتا ہے۔ اگر نہیں تو کوئی کارروائی نہیں کی جاتی۔
  • اگر صارف ڈومین صارف ہے تو، منتظمین کے گروپ میں رکنیت کی جانچ پڑتال کی جاتی ہے۔
  • اگر منتظم نہیں ہے، تو یہ چیک کرتا ہے کہ آیا Google Autheticator کو کنفیگر کیا گیا ہے۔ اگر نہیں، تو ایک 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

فورٹیگیٹ سیٹ اپ:

  • ہم تخلیق کرتے ہیں۔ رداس-سرور

    Freeradius + Google Autheticator + LDAP + Fortigate

  • اگر گروپ کے لحاظ سے رسائی میں فرق کرنا ضروری ہو تو ہم ضروری گروپ بناتے ہیں۔ گروپ کا نام آن جعل سازی کرنا۔ اس گروپ سے مماثل ہونا چاہیے جس کو بھیجا گیا ہے۔ وینڈر کی مخصوص وصف Fortinet-گروپ-نام.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • ضروری ترمیم کرنا SSL-پورٹلز

    Freeradius + Google Autheticator + LDAP + Fortigate

  • پالیسیوں میں گروپوں کو شامل کرنا۔

    Freeradius + Google Autheticator + 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

نیا تبصرہ شامل کریں