Freeradius + Google Authenticator + LDAP + Fortigate

Wat te dwaan as jo twa-faktor autentikaasje wolle en wifkjend binne, mar d'r is gjin jild foar hardware-tokens en yn 't algemien suggerearje se in goede stimming te hâlden.

Dizze oplossing is net wat super orizjineel, mar in miks fan ferskate oplossingen fûn op it ynternet.

Dus it is jûn

Domein Active Directory.

Domein brûkers wurkje fia VPN, lykas in protte hjoed.

De VPN fungearret as in poarte Fortigate.

It bewarjen fan it wachtwurd foar de VPN-kliïnt is ferbean troch feiligensbelied.

Polityk Fortinet yn relaasje ta syn eigen tokens, do kinst net neame it minder as redneck - der binne safolle as 10 ienheden fan frije tokens, de rest binne op in hiel net-kosher priis. Ik haw RSASecureID, Duo en sa net beskôge, om't ik iepen boarne wol.

Betingsten: host * nix mei de fêststelde freeradius, ssd - ynfierd yn it domein, domein brûkers kinne maklik ferifiearje op it.

Oanfoljende pakketten: shellinabox, figlett, freeradius-ldap, lettertype rebel.tlf út de repository https://github.com/xero/figlet-fonts.

Yn myn foarbyld, CentOS 7.8.

De bestjoeringslogika is as folget: by it ferbinen mei in VPN moat de brûker in domeinoanmelding en OTP ynfiere ynstee fan in wachtwurd.

It opsetten fan tsjinsten

В /etc/raddb/radiusd.conf allinich de brûker en groep ûnder waans namme it begjint feroaret freeradius, sûnt de tsjinst radiusd moat triemmen yn alle submappen lêze kinne /thús/.

user = root
group = root

Om groepen te brûken yn ynstellings Fortigate, moatte wurde oerdroegen Ferkeaper spesifyk attribút. Om dit te dwaan yn 'e map raddb/policy.d Ik meitsje in bestân mei de folgjende ynhâld:

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

Nei ynstallaasje freeradius-ldap yn de map raddb/mods-beskikber triem wurdt oanmakke ldap.

Jo moatte in symboalyske keppeling oanmeitsje nei de map raddb/mods-ynskeakele.

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

Ik presintearje de ynhâld as folget:

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

Yn triemmen raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel yn seksje autorisearje Ik foegje de namme ta fan it belied dat sil wurde brûkt - group_authorization. In wichtich punt - de namme fan it belied wurdt net bepaald troch de namme fan it bestân yn 'e map belied.d, mar in rjochtline binnen de triem foar de krullende beugels.
Yn de seksje ferifiearje yn deselde triemmen jo moatte uncomment de line pam.

Yn triem clients.conf spesifisearje de parameters wêrmei te ferbinen Fortigate:

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

Modulkonfiguraasje 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

Standert opsjes foar it útfieren fan de bondel freeradius с google authenticator fereaskje dat de brûker referinsjes yn it formaat ynfiere: Brûkersnamme Wachtwurd+OTP.

Stel jo it oantal flokken foar dat op jo holle sil falle as jo de standertkopula brûke freeradius с Google Authenticator, waard besletten om de module konfiguraasje te brûken pam sadat allinnich de token wurdt kontrolearre Google Authenticator.

As in brûker ferbynt, bart it folgjende:

  • Freeradius kontrolearret oft de brûker yn it domein en yn in spesifike groep is en, as suksesfol, kontrolearret it OTP-token.

Alles seach frij suksesfol oant ik tocht, "Hoe kin ik OTP registrearje foar 300+ brûkers?"

De brûker moat ynlogge op de tsjinner mei freeradius en fan jo akkount en starte de applikaasje Google autentikaasje, dy't in QR-koade sil generearje foar de applikaasje foar de brûker. Dit is wêr't it komt ta de rêding shellinabox yn kombinaasje mei .bash_profile.

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

It daemon-konfiguraasjetriem sit yn /etc/sysconfig/shellinabox.
Ik spesifisearje poarte 443 dêr en jo kinne oantsjutte jo sertifikaat.

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

De brûker kin allinich de keppeling folgje, domeingegevens ynfiere en in QR-koade ûntfange foar de applikaasje.

It algoritme is as folgjend:

  • De brûker logt yn 'e masine fia in browser.
  • Oft de brûker in domeinbrûker is, wurdt kontrolearre. Sa net, dan wurdt gjin aksje ûndernommen.
  • As de brûker in domeinbrûker is, wurdt lidmaatskip yn 'e beheardersgroep kontrolearre.
  • As net in admin, kontrolearret it oft Google Authenticator is ynsteld. As net, dan wurdt in QR-koade oanmakke en de brûker logt út.
  • As jo ​​​​gjin admin binne en Google Authenticator is ynsteld, log dan gewoan út.
  • As in admin, kontrolearje dan Google Authenticator nochris. As net ynsteld, wurdt in QR-koade oanmakke.

Alle logika wurdt dien mei help /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 opset:

  • Wy meitsje Straal-tsjinner

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Wy meitsje de nedige groepen, as it nedich is om te ûnderskieden tagong troch groep. Groep namme op Fortigate moat oerienkomme mei de groep wêrnei't stjoerd wurdt Ferkeaper spesifyk attribút Fortinet-Groep-Namme.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Bewurkje de nedige SSL- portalen.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • It tafoegjen fan groepen oan belied.

    Freeradius + Google Authenticator + LDAP + Fortigate

De foardielen fan dizze oplossing:

  • It is mooglik om te ferifiearjen fia OTP op Fortigate iepen boarne oplossing.
  • De brûker hoecht gjin domeinwachtwurd yn te fieren by it ferbinen fia VPN, wat it ferbiningsproses wat simplifies. It 6-sifers wachtwurd is makliker yn te fieren dan it befeiligingsbelied. Dêrtroch nimt it oantal kaartsjes mei it ûnderwerp: "Ik kin gjin ferbining meitsje mei de VPN" ôf.

PS D'r binne plannen om dizze oplossing te upgrade nei folsleine twa-faktor-ferifikaasje mei útdaging-antwurd.

update:

Lykas tasein, haw ik it opwurdearre nei de opsje mei útdaging-antwurd.
Dus:
Yn triem /etc/raddb/sites-enabled/default ôfdieling autorisearje sjocht dit sa:

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
}

Ôfdieling ferifiearje sjocht der no sa út:

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
}

No wurdt de brûker ferifiearre mei it folgjende algoritme:

  • De brûker fiert domeingegevens yn 'e VPN-kliïnt.
  • Freeradius kontrolearret de jildigens en wachtwurd fan akkount
  • As it wachtwurd goed is, dan wurdt in fersyk foar in token stjoerd.
  • It token wurdt ferifiearre.
  • Winst).

Boarne: www.habr.com

Add a comment