Freeradius + Google Authenticator + LDAP + Fortigate

Эгерде сиз эки фактордук аутентификацияны кааласаңыз жана олку-солку болсоңуз, эмне кылуу керек, бирок аппараттык токендер үчүн акча жок жана жалпысынан алар жакшы маанайда кармап турууну сунуштайт.

Бул чечим супер оригиналдуу нерсе эмес, тескерисинче, Интернетте табылган ар кандай чечимдердин аралашмасы.

Ошентип, берилген

домен Active Directory.

Бүгүнкү күндө көптөгөн домен колдонуучулары сыяктуу VPN аркылуу иштешет.

VPN шлюз катары иштейт Fortigate.

VPN кардары үчүн сырсөздү сактоо коопсуздук саясаты тарабынан тыюу салынган.

Саясат Fortinet өзүнүн энбелгилерине карата, сиз аны реднектен кем деп атай албайсыз - 10 бирдик акысыз токендер бар, калгандары өтө кошер эмес баада. Мен RSASecureID, Duo жана ушул сыяктууларды эске алган жокмун, анткени мен ачык булакты каалайм.

Алдын ала шарттар: кожоюн * Орозгул топтому эркин радиус, ssd — доменге киргенде, домендин колдонуучулары аны оңой эле текшере алышат.

Кошумча пакеттер: shellinabox, фиглет, эркин радиус-лдап, шрифт rebel.tlf репозиторийден https://github.com/xero/figlet-fonts.

Менин мисалымда, CentOS 7.8.

Иштөө логикасы төмөнкүдөй: VPNге туташуу учурунда колдонуучу сырсөздүн ордуна домендик логин жана OTP киргизиши керек.

Кызматтарды орнотуу

В /etc/raddb/radiusd.conf аты менен баштаган колдонуучу жана топ гана өзгөрөт эркин радиус, кызматтан бери радиусд бардык подкаталогдордогу файлдарды окуй билиши керек / Башкы бет /.

user = root
group = root

Жөндөөлөрдөгү топторду колдоно билүү Fortigate, которуу керек Сатуучунун өзгөчө атрибуту. Бул үчүн каталогдо 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. Маанилүү жагдай - саясаттын аталышы каталогдогу файлдын аты менен аныкталбайт саясат.д, бирок тармал кашаалардан мурун файлдын ичиндеги директива.
Бөлүмдө аныктыгын текшерүү ошол эле файлдарда сиз сапты түшүндүрүшүңүз керек Pam.

Файлда clients.conf туташтыра турган параметрлерди белгилеңиз Fortigate:

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 аныктыгын колдонуучудан эсептик дайындарды форматта киргизүүнү талап кылуу: Колдонуучунун аты Сыр сөз+OTP.

Демейки копуланы колдонсоңуз, башыңызга канча каргыш келерин элестетиңиз эркин радиус с Google Аныктыгын, модулдун конфигурациясын колдонуу чечими кабыл алынды Pam токен гана текшерилет Google Аныктыгын.

Колдонуучу туташканда, төмөнкүлөр болот:

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

Мен "300+ колдонуучу үчүн OTPди кантип каттасам болот?" деп ойлогонго чейин баары ийгиликтүү көрүндү.

Колдонуучу серверге кирүү керек эркин радиус жана каттоо эсебиңизден жана колдонмону ишке киргизиңиз Google Authenticator, ал колдонуучу үчүн колдонмо үчүн QR кодун жаратат. Бул жерде ал жардамга келет shellinabox менен айкалышта .bash_profile.

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

Демон конфигурация файлы жайгашкан /etc/sysconfig/shellinabox.
Мен ал жерде 443-портту көрсөтөм жана сиз өз сертификатыңызды көрсөтө аласыз.

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

Колдонуучу шилтеме боюнча гана өтүп, домендин эсептик дайындарын киргизип, колдонмо үчүн QR кодун ала алат.

Алгоритм төмөнкүчө:

  • Колдонуучу машинага браузер аркылуу кирет.
  • Колдонуучунун домен колдонуучусубу же жокпу текшерилет. Болбосо, анда эч кандай чара көрүлбөйт.
  • Эгер колдонуучу домен колдонуучусу болсо, администраторлор тобуна мүчөлүк текшерилет.
  • Эгер администратор болбосо, ал Google Auttheticator конфигурацияланганын текшерет. Болбосо, 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

Fortigate орнотуу:

  • Биз түзөбүз радиус-сервер

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Топ боюнча кирүүнү дифференциялоо керек болсо, керектүү топторду түзөбүз. Топтун аталышы күйүк Fortigate жөнөтүлгөн топко дал келиши керек Сатуучунун өзгөчө атрибуту Fortinet-Группа-Аты.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Керектүү түзөтүү SSL-порталдар.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Саясаттарга топторду кошуу.

    Freeradius + Google Authenticator + LDAP + Fortigate

Бул чечимдин артыкчылыктары:

  • Бул күйүк OTP аркылуу аутентификациялоо мүмкүн Fortigate ачык булак чечим.
  • 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 эсептин жарактуулугун жана сырсөзүн текшерет
  • Эгер сырсөз туура болсо, анда токенге суроо-талап жөнөтүлөт.
  • Токен текшерилүүдө.
  • Пайда).

Source: www.habr.com

Комментарий кошуу