Freeradius + Google Authenticator + LDAP + Fortigate

Егер екі факторлы аутентификация қажет болса да, тікенді болса да, аппараттық таңбалауыштарға ақша жоқ болса және олар жақсы көңіл-күйде болуды ұсынса ше.

Бұл шешім өте түпнұсқа емес, Интернетте табылған әртүрлі шешімдердің қоспасы.

Сонымен берілді

Домен атауы Active Directory.

Бүгінгі көптеген сияқты VPN арқылы жұмыс істейтін домен пайдаланушылары.

VPN шлюзі ретінде әрекет етеді Бекініс.

VPN клиенті үшін құпия сөзді сақтауға қауіпсіздік саясаты тыйым салады.

Саясат Фортинет өзіңіздің жеке таңбалауыштарыңызға қатысты сіз оны zhlob деп атай алмайсыз - 10 тегін таңбалауыш бар, қалғандары - өте кошер емес бағамен. Мен RSASecureID, Duo және т.б. қарастырмадым, өйткені мен ашық бастапқы кодты қалаймын.

Алғышарттар: хост * nix орнатылған еркін радиус, SSSD - доменге енгізілген, домен пайдаланушылары оны оңай аутентификациялай алады.

Қосымша пакеттер: шеллин қорабы, фиглет, еркін радиус-лдап, шрифт rebel.tlf репозиторийден https://github.com/xero/figlet-fonts.

Менің мысалда - CentOS 7.8.

Жұмыс логикасы келесідей болуы керек: VPN желісіне қосылу кезінде пайдаланушы құпия сөздің орнына домен логинін және OTP енгізуі керек.

Қызметтерді орнату

В /etc/raddb/radiusd.conf тек атынан басталатын пайдаланушы мен топ еркін радиус, қызметтен бері радиус барлық ішкі каталогтардағы файлдарды оқи алуы керек / home /.

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-қосылған/әдепкі и raddb/sites-enabled/inner-tunnel бөлімінде рұқсат ету Мен қолданылатын саясаттың атын қосамын - group_authorization. Маңызды сәт - саясаттың атауы каталогтағы файлдың атымен анықталмайды саясат.d, бірақ бұйра жақшалардан бұрын файл ішіндегі директива арқылы.
Бөлімде аутентификациялау сол файлдарда жолды алып тастау керек Пам.

Файлда 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 аутентификаторы пайдаланушыдан тіркелгі деректерін келесі форматта енгізуді талап етеді: пайдаланушы аты/пароль+OTP.

Әдепкі байламды пайдаланған жағдайда, басына түсетін қарғыстардың санын елестету арқылы еркін радиус с Google Authenticator, модуль конфигурациясын пайдалану туралы шешім қабылданды Пам тек токенді тексеруге болады Google Authenticator.

Пайдаланушы қосылған кезде келесілер орын алады:

  • Freeradius пайдаланушының доменде және белгілі бір топта екенін тексереді және сәтті болса, OTP таңбалауышын тексереді.

Мен «300+ пайдаланушы үшін OTP қалай тіркеуге болады?» Деген сәтке дейін бәрі жақсы көрінді.

Пайдаланушы серверге кіруі керек еркін радиус және тіркелгіңіздің астынан қолданбаны іске қосыңыз Google аутентификаторы, ол пайдаланушыға арналған қолданба үшін QR кодын жасайды. Бұл жерде көмек келеді. шеллин қорабы бірге .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.

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

  • Біз қажетті топтарды жасаймыз, қажет болған жағдайда топтар бойынша қол жеткізуді басқару. Топ атауы қосулы Бекініс берілген топқа сәйкес келуі керек Жеткізушіге тән төлсипат Fortinet тобының атауы.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Қажетті өңдеу SSL-порталдар.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Топтарды саясаттарға қосу.

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

пікір қалдыру