Freeradius + Google Authenticator + LDAP + Fortigate

Wat as twee-faktor-verifikasie beide wenslik en stekelrig is, maar daar is geen geld vir hardeware-tokens nie en hulle bied in die algemeen aan om in 'n goeie bui te bly.

Hierdie oplossing is nie iets super oorspronklik nie, maar eerder 'n mengsel van verskillende oplossings wat op die internet gevind word.

So gegee

Домен Active Directory.

Domeingebruikers wat deur 'n VPN werk, soos baie vandag.

Dien as 'n VPN-poort Forteer.

Die stoor van die wagwoord vir die VPN-kliënt word deur sekuriteitsbeleid verbied.

Politiek Fortinet met betrekking tot jou eie tokens, kan jy dit nie minder as 'n zhlob noem nie - daar is soveel as 10 gratis tokens, die res - teen 'n baie nie-kosher prys. Ek het nie RSASecureID, Duo en dies meer oorweeg nie, want ek wil oopbron hê.

Voorvereistes: gasheer * nix met gevestigde vrye radius, ssd - ingeskryf in die domein, kan domeingebruikers maklik daarop verifieer.

Bykomende pakkette: shellina boks, vyetjie, freeradius-ldap, font rebel.tlf uit die bewaarplek https://github.com/xero/figlet-fonts.

In my voorbeeld - CentOS 7.8.

Die logika van werk is veronderstel om soos volg te wees: wanneer die gebruiker aan 'n VPN koppel, moet die gebruiker 'n domeinaanmelding en OTP in plaas van 'n wagwoord invoer.

Dienste opstelling

В /etc/raddb/radiusd.conf slegs die gebruiker en groep namens wie begin vrye radius, sedert die diens radiusd behoort lêers in alle subgidse te kan lees / Huis /.

user = root
group = root

Om groepe in instellings te kan gebruik Forteer, moet oorgedra word Verkoper spesifieke kenmerk. Om dit te doen, in die gids raddb/beleid.d Ek skep 'n lêer met die volgende inhoud:

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

Na die installasie freeradius-ldap in die gids raddb/mods-beskikbaar lêer geskep word ldap.

Moet 'n simboliese skakel na die gids skep raddb/mods-geaktiveer.

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

Ek bring die inhoud na hierdie vorm:

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

In lêers raddb/sites-enabled/default и raddb/sites-enabled/inner-tonnel in afdeling magtig Ek voeg die naam by van die beleid wat gebruik gaan word - group_authorization. 'n Belangrike punt - die naam van die beleid word nie bepaal deur die naam van die lêer in die gids nie beleid.d, maar deur 'n aanwysing binne die lêer voor die krulhakies.
In die afdeling authentic in dieselfde lêers wat jy nodig het om die reël te verwyder PAM.

In lêer clients.conf skryf die parameters voor waarmee dit sal verbind Forteer:

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

Module -opset 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

Verstek bundel implementering opsies vrye radius с Google-verifikasie vereis dat die gebruiker geloofsbriewe in die formaat invoer: gebruikersnaam wagwoord+OTP.

Deur die aantal vloeke te verbeel wat op die kop sal val, in die geval van die gebruik van die verstekbundel vrye radius с Google Authenticator, is besluit om die modulekonfigurasie te gebruik PAM sodat slegs die teken nagegaan kan word Google Authenticator.

Wanneer 'n gebruiker koppel, gebeur die volgende:

  • Freeradius kontroleer of die gebruiker in die domein en in 'n sekere groep is en, indien suksesvol, kontroleer die OTP-token.

Alles het goed genoeg gelyk tot die oomblik toe ek gedink het "Hoe kan ek OTP vir 300+ gebruikers registreer?"

Die gebruiker moet by die bediener aanmeld met vrye radius en van onder jou rekening en hardloop die toepassing Google Authenticator, wat 'n QR-kode vir die toepassing vir die gebruiker sal genereer. Dit is waar hulp inkom. shellina boks in kombinasie met .bash_profiel.

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

Die daemon-konfigurasielêer is geleë by /etc/sysconfig/shellinabox.
Ek spesifiseer poort 443 daar en jy kan jou sertifikaat spesifiseer.

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

Die gebruiker hoef slegs die skakel te volg, domeinkrediete in te voer en 'n QR-kode vir die toepassing te ontvang.

Die algoritme is soos volg:

  • Die gebruiker meld by die masjien aan deur 'n blaaier.
  • Of die domeingebruiker gekontroleer is. Indien nie, word geen aksie geneem nie.
  • As die gebruiker 'n domeingebruiker is, word lidmaatskap in die Administrateursgroep nagegaan.
  • Indien nie 'n administrateur nie, kyk dit of Google Authenticator opgestel is. Indien nie, word 'n QR-kode en gebruikeruitmelding gegenereer.
  • As nie 'n administrateur en Google Authenticator opgestel is nie, teken dan net af.
  • As admin, gaan dan weer na Google Authenticator. As dit nie gekonfigureer is nie, word 'n QR-kode gegenereer.

Alle logika word gedoen met behulp van /etc/skel/.bash_profile.

kat /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 opstelling:

  • Ons skep radius-bediener

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Ons skep die nodige groepe, indien nodig, toegangsbeheer deur groepe. Groepnaam aan Forteer moet ooreenstem met die groep wat deurgegee word Verkoper spesifieke kenmerk Fortinet-groepnaam.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Redigeer die nodige SSL-portale.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Voeg groepe by beleide.

    Freeradius + Google Authenticator + LDAP + Fortigate

Die voordele van hierdie oplossing:

  • Dit is moontlik om te verifieer deur OTP aan Forteer oopbron oplossing.
  • Die gebruiker voer nie 'n domeinwagwoord in wanneer hy via VPN koppel nie, wat die verbindingsproses ietwat vergemaklik. Die 6-syfer wagwoord is makliker om in te voer as die een wat deur die sekuriteitsbeleid verskaf word. Gevolglik verminder die aantal kaartjies met die onderwerp: "Ek kan nie aan die VPN koppel nie".

NS Ons beplan om hierdie oplossing op te gradeer na 'n volwaardige twee-faktor-verifikasie met uitdaging-reaksie.

Update:

Soos belowe, het ek dit aangepas na die uitdaging-reaksie-opsie.
Dus:
In lêer /etc/raddb/sites-enabled/default afdeling magtig is soos volg:

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
}

Afdeling authentic lyk nou so:

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
}

Nou vind gebruikerverifikasie plaas volgens die volgende algoritme:

  • Die gebruiker voer domeinkrediete in die VPN-kliënt in.
  • Freeradius kontroleer die geldigheid van die rekening en wagwoord
  • As die wagwoord korrek is, word 'n versoek vir 'n teken gestuur.
  • Die teken word geverifieer.
  • wins).

Bron: will.com

Voeg 'n opmerking