Фреерадиус + Гоогле Аутхентицатор + ЛДАП + Фортигате

Шта да радите ако желите двофакторску аутентификацију и двоумите се, али нема новца за хардверске токене и генерално предлажу да се држите доброг расположења.

Ово решење није нешто супер оригинално, већ мешавина различитих решења која се налазе на интернету.

Дакле, дато је

Домаин active Дирецтори.

Корисници домена који раде преко ВПН-а, као и многи данас.

ВПН делује као капија Фортигате.

Чување лозинке за ВПН клијент је забрањено безбедносном политиком.

политика Fortinet у односу на сопствене токене, не можете то назвати мање од реднецк - има чак 10 јединица бесплатних токена, остали су по веома не-кошер цени. Нисам разматрао РСАСецуреИД, Дуо и слично, јер желим отворени код.

Предуслови: хост * ник са инсталираним фреерадиус, сссд — унети у домен, корисници домена могу лако да се аутентификују на њему.

Додатни пакети: схеллинабок, фиглет, фреерадиус-лдап, фонт ребел.тлф из спремишта https://github.com/xero/figlet-fonts.

У мом примеру, ЦентОС 7.8.

Логика рада је следећа: када се повезује на ВПН, корисник мора да унесе пријаву на домен и ОТП уместо лозинке.

Постављање услуга

В /етц/раддб/радиусд.цонф мењају се само корисник и група под чијим именом почиње фреерадиус, од службе радиусд мора бити у стању да чита датотеке у свим поддиректоријумима /кућа/.

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
        }
}

Након инсталације фреерадиус-лдап у именику раддб/модс-аваилабле датотека је креирана лдап.

Морате да направите симболичку везу до директоријума раддб/модс-енаблед.

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'
        }
}

У фајловима раддб/ситес-енаблед/дефаулт и раддб/ситес-енаблед/иннер-туннел у одељку ауторизирати Додајем назив политике која ће се користити – гроуп_аутхоризатион. Важна тачка - назив политике није одређен именом датотеке у директоријуму политика.д, али директива унутар датотеке испред витичастих заграда.
У одељку аутентичност у истим датотекама треба да декоментирате ред pam.

У фајлу цлиентс.цонф наведите параметре са којима ћете се повезати Фортигате:

client fortigate {
    ipaddr = 192.168.1.200
    secret = testing123
    require_message_authenticator = no
    nas_type = other
}

Конфигурација модула пам.д/радиусд:

#%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

Подразумеване опције за имплементацију пакета фреерадиус с гоогле аутентицатор захтевају од корисника да унесе акредитиве у формату: корисничко име Лозинка+Тужилаштво.

Замислите број клетви које ће вам пасти на главу ако користите подразумевану копулу фреерадиус с Гоогле Аутхентицатор, одлучено је да се користи конфигурација модула pam тако да се проверава само токен Гоогле Аутхентицатор.

Када се корисник повеже, дешава се следеће:

  • Фреерадиус проверава да ли је корисник у домену и у одређеној групи и, ако успе, проверава ОТП токен.

Све је изгледало прилично успешно док нисам помислио: „Како да региструјем ОТП за 300+ корисника?“

Корисник се мора пријавити на сервер са фреерадиус и са свог налога и покрените апликацију гоогле аутентификатор, који ће генерисати КР код за апликацију за корисника. Ту долази у помоћ схеллинабок у комбинацији са .басх_профиле.

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

Конфигурациона датотека демона се налази у /етц/сисцонфиг/схеллинабок.
Наводим порт 443 тамо и можете одредити свој сертификат.

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

Корисник може само да прати везу, унесе акредитиве домена и добије КР код за апликацију.

Алгоритам је следећи:

  • Корисник се пријављује на машину преко претраживача.
  • Проверава се да ли је корисник корисник домена. Ако не, онда се ништа не предузима.
  • Ако је корисник корисник домена, проверава се чланство у групи администратора.
  • Ако није администратор, проверава да ли је Гоогле Аутхетицатор конфигурисан. Ако није, онда се генерише КР код и корисник се одјављује.
  • Ако нисте администратор и Гоогле Аутхентицатор је конфигурисан, само се одјавите.
  • Ако сте администратор, поново проверите Гоогле Аутхентицатор. Ако није конфигурисан, генерише се КР код.

Сва логика се врши помоћу /етц/скел/.басх_профиле.

мачка /етц/скел/.басх_профиле

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

Учврстите подешавање:

  • Ми стварамо полупречник-сервер

    Фреерадиус + Гоогле Аутхентицатор + ЛДАП + Фортигате

  • Правимо потребне групе, ако је потребно разликовати приступ по групама. Име групе укључено Фортигате мора одговарати групи којој се шаље Атрибут специфичан за добављача Фортинет-Гроуп-Наме.

    Фреерадиус + Гоогле Аутхентицатор + ЛДАП + Фортигате

  • Уређивање потребних ССЛ-портали.

    Фреерадиус + Гоогле Аутхентицатор + ЛДАП + Фортигате

  • Додавање група политикама.

    Фреерадиус + Гоогле Аутхентицатор + ЛДАП + Фортигате

Предности овог решења:

  • Могуће је аутентификовати преко ОТП-а Фортигате решење отвореног кода.
  • Корисник не мора да уноси лозинку за домен приликом повезивања преко ВПН-а, што донекле поједностављује процес повезивања. Шестоцифрену лозинку је лакше унети него ону коју предвиђа безбедносна политика. Као резултат тога, смањује се број тикета са темом: „Не могу да се повежем на ВПН“.

ПС Постоје планови да се ово решење надогради на пуну двофакторску аутентификацију са изазов-одговор.

Упдате:

Као што сам обећао, надоградио сам га на опцију са изазов-одговор.
Дакле:
У фајлу /етц/раддб/ситес-енаблед/дефаулт одељак ауторизирати изгледа овако:

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
}

Сада је корисник верификован коришћењем следећег алгоритма:

  • Корисник уноси акредитиве домена у ВПН клијент.
  • Фреерадиус проверава валидност налога и лозинку
  • Ако је лозинка исправна, шаље се захтев за токен.
  • Токен се верификује.
  • Профит).

Извор: ввв.хабр.цом

Додај коментар