Freeradius + Google Authenticator + LDAP + Fortigate

ماذا لو كانت المصادقة الثنائية مرغوبة وشائكة على حد سواء ، ولكن لا توجد أموال مقابل الرموز المميزة للأجهزة ، وبشكل عام فإنها تعرض البقاء في حالة مزاجية جيدة.

هذا الحل ليس شيئًا أصليًا للغاية ، ولكنه مزيج من الحلول المختلفة الموجودة على الإنترنت.

ذلك معطى

اسم النطاق نشط الدليل.

مستخدمو المجال الذين يعملون من خلال VPN ، مثل الكثيرين اليوم.

يعمل كبوابة VPN فورتي جيت.

يحظر حفظ كلمة المرور لعميل VPN بموجب سياسة الأمان.

سياسة فورتينت بالنسبة إلى الرموز المميزة الخاصة بك ، لا يمكنك تسميتها أقل من zhlob - هناك ما يصل إلى 10 رموز مجانية ، والباقي - بسعر غير متوافق مع الشريعة اليهودية. لم أفكر في RSASecureID و Duo وما شابه ذلك ، لأنني أريد مصدر مفتوح.

المتطلبات الأساسية: مضيف * لا شىء مع المنشأة freeradius, ssd - دخلت إلى المجال ، يمكن لمستخدمي المجال المصادقة عليه بسهولة.

الحزم الإضافية: شللينابوكس, الفجل الصغير, freeradius-ldap، الخط المتمردين.tlf من المستودع https://github.com/xero/figlet-fonts.

في المثال الخاص بي - CentOS 7.8.

من المفترض أن يكون منطق العمل كما يلي: عند الاتصال بشبكة VPN ، يجب على المستخدم إدخال تسجيل دخول إلى المجال وكلمة مرور لمرة واحدة بدلاً من كلمة المرور.

إعداد الخدمات

В /etc/raddb/radiusd.conf فقط المستخدم والمجموعة نيابة عن الذي يبدأ freeradius، منذ الخدمة نصف القطر يجب أن يكون قادرًا على قراءة الملفات في جميع الأدلة الفرعية /الصفحة الرئيسية/.

user = root
group = root

لتتمكن من استخدام المجموعات في الإعدادات فورتي جيت، يجب أن ينتقل السمة الخاصة بالبائع. للقيام بذلك ، في الدليل رادب / سياسة د أقوم بإنشاء ملف بالمحتوى التالي:

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 في الدليل رادب / تعديل المتاحة تم إنشاء الملف LDAP.

تحتاج إلى إنشاء ارتباط رمزي للدليل رادب / تعديل تمكين.

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 / مواقع تمكين / افتراضي и raddb / تمكين المواقع / النفق الداخلي في قسم يأذن أقوم بإضافة اسم السياسة المراد استخدامها - group_authorization. نقطة مهمة - لا يتم تحديد اسم السياسة من خلال اسم الملف في الدليل السياسة د، ولكن عن طريق توجيه داخل الملف قبل الأقواس المتعرجة.
في القسم مصادقة في نفس الملفات تحتاج إلى uncomment الخط حزب الأصالة والمعاصرة.

في ملف العملاء صف المعلمات التي سيتم الاتصال بها فورتي جيت:

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 code.

بتخيل عدد الشتائم التي ستقع على الرأس ، في حالة استخدام الحزمة الافتراضية freeradius с أداة مصادقة Google، تقرر استخدام تكوين الوحدة حزب الأصالة والمعاصرة بحيث يمكن التحقق من الرمز المميز فقط أداة مصادقة Google.

عندما يتصل المستخدم ، يحدث ما يلي:

  • يتحقق Freeradius مما إذا كان المستخدم موجودًا في المجال وفي مجموعة معينة ، وفي حالة نجاحه ، يتحقق من رمز OTP المميز.

بدا كل شيء جيدًا بما يكفي حتى اللحظة التي فكرت فيها "كيف يمكنني تسجيل OTP لأكثر من 300 مستخدم؟"

يجب على المستخدم تسجيل الدخول إلى الخادم باستخدام freeradius ومن تحت حسابك وتشغيل التطبيق مصدق جوجل، والذي سينشئ رمز الاستجابة السريعة للتطبيق للمستخدم. هذا هو المكان الذي تأتي فيه المساعدة. شللينابوكس بالاشتراك مع .bash_profile.

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

يوجد ملف تكوين البرنامج الخفي في / etc / sysconfig / shellinabox.
أحدد المنفذ 443 هناك ويمكنك تحديد شهادتك.

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

يحتاج المستخدم فقط إلى اتباع الرابط ، وإدخال اعتمادات المجال وتلقي رمز الاستجابة السريعة للتطبيق.

الخوارزمية هي على النحو التالي:

  • يقوم المستخدم بتسجيل الدخول إلى الجهاز من خلال متصفح.
  • ما إذا كان مستخدم المجال محددًا أم لا. إذا لم يكن الأمر كذلك ، فلن يتم اتخاذ أي إجراء.
  • إذا كان المستخدم مستخدم مجال ، يتم التحقق من العضوية في مجموعة المسؤولين.
  • إذا لم يكن مشرفًا ، فإنه يتحقق مما إذا كان قد تم تكوين Google Authenticator. إذا لم يكن كذلك ، فسيتم إنشاء رمز الاستجابة السريعة وتسجيل خروج المستخدم.
  • إذا لم يكن هناك مسؤول وتم تكوين 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

  • نقوم بإنشاء المجموعات الضرورية ، إذا لزم الأمر ، للتحكم في الوصول بواسطة المجموعات. اسم المجموعة قيد التشغيل فورتي جيت يجب أن يتطابق مع المجموعة التي تم تمريرها السمة الخاصة بالبائع اسم مجموعة فورتينت.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • تحرير اللازم SSL-بوابات.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • إضافة مجموعات إلى السياسات.

    Freeradius + Google Authenticator + LDAP + Fortigate

مزايا هذا الحل:

  • من الممكن المصادقة عن طريق OTP على فورتي جيت حل مفتوح المصدر.
  • لا يقوم المستخدم بإدخال كلمة مرور المجال عند الاتصال عبر VPN ، مما يبسط عملية الاتصال إلى حد ما. يعد إدخال كلمة المرور المكونة من 6 أرقام أسهل من إدخال كلمة المرور التي توفرها سياسة الأمان. نتيجة لذلك ، انخفض عدد التذاكر التي تحمل الموضوع: "لا يمكنني الاتصال بشبكة VPN".

ملاحظة: نخطط لترقية هذا الحل إلى مصادقة ثنائية العوامل كاملة مع الاستجابة للتحدي.

تحديث:

كما وعدت ، قمت بتعديله إلى خيار التحدي والاستجابة.
لذلك:
في ملف / 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

إضافة تعليق