Freeradius + Google Authenticator + LDAP + Fortigate

Paano kung ang dalawang-factor na pagpapatotoo ay parehong kanais-nais at matinik, ngunit walang pera para sa mga token ng hardware at sa pangkalahatan ay nag-aalok sila upang manatili sa isang magandang kalagayan.

Ang solusyon na ito ay hindi isang bagay na sobrang orihinal, ngunit isang halo ng iba't ibang mga solusyon na matatagpuan sa Internet.

Kaya binigay

Домен Active Directory.

Ang mga gumagamit ng domain na nagtatrabaho sa pamamagitan ng isang VPN, tulad ng marami ngayon.

Nagsisilbing VPN gateway Pabigla.

Ang pag-save ng password para sa VPN client ay ipinagbabawal ng patakaran sa seguridad.

Pulitika Fortinet kaugnay ng sarili mong mga token, hindi mo ito matatawag na mas mababa sa isang zhlob - mayroong kasing dami ng 10 libreng token, ang iba pa - sa isang napaka hindi kosher na presyo. Hindi ko isinasaalang-alang ang RSASecureID, Duo at iba pa, dahil gusto ko ng open source.

Mga kinakailangan: host * nix na may itinatag freeradius, ssd - ipinasok sa domain, madaling mapatunayan ng mga gumagamit ng domain dito.

Mga karagdagang pakete: kahon ng shellina, bukol, freeradius-ldap, font rebelde.tlf mula sa imbakan https://github.com/xero/figlet-fonts.

Sa aking halimbawa - CentOS 7.8.

Ang lohika ng trabaho ay dapat na ang mga sumusunod: kapag kumokonekta sa isang VPN, ang user ay dapat magpasok ng isang domain login at OTP sa halip na isang password.

Pag-setup ng mga serbisyo

В /etc/raddb/radiusd.conf tanging ang gumagamit at pangkat sa ngalan kung saan magsisimula freeradius, mula noong serbisyo radiusd ay dapat na makapagbasa ng mga file sa lahat ng mga subdirectory / home /.

user = root
group = root

Upang magamit ang mga pangkat sa mga setting Pabigla, ay dapat maipadala Partikular na Katangian ng Vendor. Upang gawin ito, sa direktoryo raddb/patakaran.d Lumilikha ako ng isang file na may sumusunod na nilalaman:

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

Pagkatapos ng pag-install freeradius-ldap sa direktoryo raddb/mods-available file ay nilikha ldap.

Kailangang lumikha ng simbolikong link sa direktoryo raddb/mods-enabled.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Dinadala ko ang mga nilalaman nito sa form na ito:

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

Sa mga file raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel sa seksyon pinapahintulutan Idinaragdag ko ang pangalan ng patakarang gagamitin - group_authorization. Isang mahalagang punto - ang pangalan ng patakaran ay hindi tinutukoy ng pangalan ng file sa direktoryo patakaran.d, ngunit sa pamamagitan ng isang direktiba sa loob ng file bago ang curly braces.
Sa seksyon patunayan sa parehong mga file kailangan mong i-uncomment ang linya Pam.

Nasa file mga kliyente.conf magreseta ng mga parameter kung saan ito makakonekta Pabigla:

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

Pag-configure ng module 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

Default na mga opsyon sa pagpapatupad ng bundle freeradius с google authenticator hilingin sa user na magpasok ng mga kredensyal sa format: username/password+OTP.

Sa pamamagitan ng pag-iisip sa bilang ng mga sumpa na babagsak sa ulo, sa kaso ng paggamit ng default na bundle freeradius с Google Authenticator, napagpasyahan na gamitin ang pagsasaayos ng module Pam para masuri lang ang token Google Authenticator.

Kapag kumonekta ang isang user, nangyayari ang sumusunod:

  • Sinusuri ng Freeradius kung ang user ay nasa domain at nasa isang partikular na grupo at, kung matagumpay, sinusuri ang OTP token.

Ang lahat ay mukhang sapat hanggang sa sandaling naisip ko na "Paano ako makakapagrehistro ng OTP para sa 300+ na mga gumagamit?"

Ang user ay dapat mag-log in sa server gamit ang freeradius at mula sa ilalim ng iyong account at patakbuhin ang application google authenticator, na bubuo ng QR code para sa application para sa user. Dito pumapasok ang tulong. kahon ng shellina kasama ng .bash_profile.

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

Ang file ng pagsasaayos ng daemon ay matatagpuan sa /etc/sysconfig/shellinabox.
Tinukoy ko ang port 443 doon at maaari mong tukuyin ang iyong sertipiko.

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

Kailangan lang sundin ng user ang link, magpasok ng mga domain credit at tumanggap ng QR code para sa application.

Ang algorithm ay ang mga sumusunod:

  • Nagla-log in ang user sa makina sa pamamagitan ng browser.
  • Kung ang gumagamit ng domain ay nasuri. Kung hindi, walang aksyon na gagawin.
  • Kung ang user ay isang domain user, ang membership sa Administrators group ay susuriin.
  • Kung hindi isang admin, tinitingnan nito kung naka-configure ang Google Authenticator. Kung hindi, magkakaroon ng QR code at logout ng user.
  • Kung hindi isang admin at Google Authenticator ang naka-configure, mag-logout lang.
  • Kung admin, suriin muli ang Google Authenticator. Kung hindi na-configure, bubuo ng QR code.

Ang lahat ng lohika ay tapos na gamit /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 setup:

  • Lumilikha kami radius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Lumilikha kami ng mga kinakailangang pangkat, kung kinakailangan, ang kontrol sa pag-access ayon sa mga pangkat. Naka-on ang pangalan ng grupo Pabigla dapat tumugma sa pangkat na ipinasa Partikular na Katangian ng Vendor Fortinet-Group-Pangalan.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Pag-edit ng kailangan SSL-mga portal.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Pagdaragdag ng mga pangkat sa mga patakaran.

    Freeradius + Google Authenticator + LDAP + Fortigate

Ang mga bentahe ng solusyon na ito:

  • Posibleng mag-authenticate sa pamamagitan ng OTP sa Pabigla open source na solusyon.
  • Ang user ay hindi naglalagay ng password ng domain kapag kumokonekta sa pamamagitan ng VPN, na medyo nagpapadali sa proseso ng koneksyon. Ang 6-digit na password ay mas madaling ipasok kaysa sa ibinigay ng patakaran sa seguridad. Bilang resulta, ang bilang ng mga tiket na may paksang: "Hindi ako makakonekta sa VPN" ay bumababa.

PS Plano naming i-upgrade ang solusyon na ito sa isang ganap na two-factor authentication na may challenge-response.

I-update:

Gaya ng ipinangako, binago ko ito sa pagpipiliang pagtugon sa hamon.
Kaya:
Nasa file /etc/raddb/sites-enabled/default seksyon pinapahintulutan ganito ang hitsura nito:

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
}

Seksyon patunayan ngayon ay ganito ang hitsura:

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
}

Ngayon ang pag-verify ng user ay nangyayari ayon sa sumusunod na algorithm:

  • Ang gumagamit ay nagpasok ng mga kredito ng domain sa kliyente ng VPN.
  • Sinusuri ng Freeradius ang bisa ng account at password
  • Kung tama ang password, ipapadala ang isang kahilingan para sa isang token.
  • Bine-verify ang token.
  • tubo).

Pinagmulan: www.habr.com

Magdagdag ng komento