Freeradius + Google Authenticator + LDAP + Fortigate

Хоёр хүчин зүйлийн баталгаажуулалт нь зүйтэй бөгөөд өргөстэй боловч техник хангамжийн жетонд мөнгө байхгүй бөгөөд ерөнхийдөө сайхан сэтгэлтэй байхыг санал болговол яах вэ.

Энэ шийдэл нь супер анхны зүйл биш, харин Интернетээс олдсон янз бүрийн шийдлүүдийн холимог юм.

Тиймээс өгсөн

Домэйн нэр Идэвхтэй лавлах.

Домэйн хэрэглэгчид өнөөдөр олон хүний ​​адил VPN-ээр ажилладаг.

VPN гарцын үүрэг гүйцэтгэдэг Бэхжүүлэх.

VPN үйлчлүүлэгчийн нууц үгийг хадгалахыг аюулгүй байдлын бодлогоор хориглодог.

Улс төр Fortinet Өөрийнхөө жетонтой холбоотойгоор та үүнийг zhlob-ээс бага гэж нэрлэж болохгүй - 10 хүртэл үнэгүй жетон байдаг, үлдсэн нь маш хямд үнээр байдаг. Би нээлттэй эх сурвалжийг хүсч байгаа тул RSASecureID, Duo гэх мэтийг авч үзээгүй.

Урьдчилсан нөхцөл: хост * nix тогтсон чөлөөт радиус, SSSD - домэйнд нэвтэрсэн тохиолдолд домэйн хэрэглэгчид үүнийг хялбархан баталгаажуулах боломжтой.

Нэмэлт багцууд: shellina хайрцаг, фитлет, чөлөөт радиус-лдап, фонт 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
        }
}

Суулгасны дараа чөлөөт радиус-лдап лавлах дотор raddb/mods-боломжтой файл үүсгэгдсэн лдап.

Лавлах руу симбол холбоос үүсгэх хэрэгтэй 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/sites-enabled/inner-tunnel хэсэгт зөвшөөрөх Би ашиглах бодлогын нэрийг нэмнэ - group_authorization. Нэг чухал зүйл бол бодлогын нэр нь лавлах дахь файлын нэрээр тодорхойлогддоггүй бодлого.d, гэхдээ буржгар хаалтны өмнөх файл доторх удирдамжаар.
хэсэгт authenticate ижил файлд та мөрийн тайлбарыг арилгах хэрэгтэй Шах.

Файлд 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 Хэрэглэгчээс итгэмжлэлийг дараах форматаар оруулахыг шаардах: Хэрэглэгчийн нэр Нууц үг+OTP.

Анхдагч багцыг ашигласан тохиолдолд толгой дээр унах хараалын тоог төсөөлөх замаар чөлөөт радиус с Google Гэрчлэгч, модулийн тохиргоог ашиглахаар шийдсэн Шах Ингэснээр зөвхөн жетон шалгаж болно Google Гэрчлэгч.

Хэрэглэгч холбогдох үед дараахь зүйл тохиолддог.

  • Freeradius нь хэрэглэгч домэйн болон тодорхой бүлэгт байгаа эсэхийг шалгаж, амжилттай бол OTP жетоныг шалгадаг.

“Би яаж 300+ хэрэглэгчдэд OTP бүртгүүлэх вэ?” гэж бодох хүртэл бүх зүйл хангалттай сайхан харагдаж байсан.

Хэрэглэгч сервер рүү нэвтрэх ёстой чөлөөт радиус болон өөрийн дансны доороос програмыг ажиллуулна уу Google гэрчлэгч, энэ нь хэрэглэгчдэд зориулсан програмын QR кодыг үүсгэх болно. Эндээс тусламж орж ирдэг. shellina хайрцаг -тэй хослуулан .bash_profile.

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

Демоны тохиргооны файл нь дараах хаягаар байрладаг /etc/sysconfig/shellinabox.
Би тэнд 443 портыг зааж өгсөн бөгөөд та гэрчилгээгээ зааж өгч болно.

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

Хэрэглэгч зөвхөн холбоосыг дагаж, домэйн кредитээ оруулаад програмын QR кодыг авах шаардлагатай.

Алгоритм дараах байдалтай байна.

  • Хэрэглэгч хөтчөөр дамжуулан машинд нэвтэрдэг.
  • Домэйн хэрэглэгчийг шалгасан эсэх. Үгүй бол ямар ч арга хэмжээ авахгүй.
  • Хэрэв хэрэглэгч нь домэйн хэрэглэгч бол Администраторуудын бүлгийн гишүүнчлэлийг шалгана.
  • Хэрэв админ биш бол Google Authenticator тохируулагдсан эсэхийг шалгана. Үгүй бол QR код болон хэрэглэгчийг гаргана.
  • Хэрэв админ биш бөгөөд Google Authenticator тохируулагдсан бол зүгээр л гарна уу.
  • Хэрэв админ бол Google Authenticator-г дахин шалгана уу. Хэрэв тохируулаагүй бол QR код үүсгэгдэнэ.

Бүх логикийг ашиглан хийдэг /etc/skel/.bash_profile.

муур /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-д холбогдож чадахгүй байна" гэсэн гарчигтай тасалбарын тоо буурч байна.

Жич Бид энэ шийдлийг сорилт хариу үйлдэл бүхий хоёр хүчин зүйлийн баталгаажуулалт болгон сайжруулахаар төлөвлөж байна.

мэдээ:

Амласан ёсоороо би үүнийг сорилт-хариултын сонголт болгон өөрчилсөн.
Тиймээс:
Файлд /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 одоо иймэрхүү харагдаж байна:

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

сэтгэгдэл нэмэх