Freeradius + Google Authenticator + LDAP + Fortigate

Šta ako je dvofaktorska autentifikacija i poželjna i bodljikava, ali nema novca za hardverske tokene i općenito nude da ostanete dobro raspoloženi.

Ovo rješenje nije nešto super originalno, već mješavina različitih rješenja koja se nalaze na internetu.

Tako dato

Ime domena Aktivni direktorij.

Korisnici domena koji rade preko VPN-a, kao i mnogi danas.

Djeluje kao VPN gateway Fortigate.

Pohranjivanje lozinke za VPN klijenta zabranjeno je sigurnosnom politikom.

Politika Fortinet u odnosu na vlastite tokene, ne možete to nazvati manje od zhloba - ima čak 10 besplatnih tokena, ostalo - po vrlo nekošer cijeni. Nisam razmatrao RSASecureID, Duo i slično, jer želim open source.

Preduvjeti: host * nix sa utvrđenim freeradius, ssd - unesene u domenu, korisnici domene mogu lako da se autentifikuju na njemu.

Dodatni paketi: shellina box, figlett, freeradius-ldap, font rebel.tlf iz spremišta https://github.com/xero/figlet-fonts.

U mom primjeru, CentOS 7.8.

Logika rada bi trebala biti sljedeća: prilikom povezivanja na VPN, korisnik mora umjesto lozinke unijeti login na domenu i OTP.

Podešavanje usluga

В /etc/raddb/radiusd.conf samo korisnik i grupa u čije ime počinje freeradius, od službe radiusd trebao bi moći čitati datoteke u svim poddirektorijumima /Dom/.

user = root
group = root

Da biste mogli koristiti grupe u postavkama Fortigate, mora se prenijeti Specifičan atribut dobavljača. Da biste to učinili, u imeniku raddb/policy.d Pravim fajl sa sledećim sadržajem:

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

Nakon instalacije freeradius-ldap u imeniku raddb/mods-available fajl je kreiran ldap.

Potrebno je kreirati simboličku vezu do direktorija raddb/mods-enabled.

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

Njegov sadržaj donosim u ovaj oblik:

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

U fajlovima raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel u sekciji ovlastiti Dodajem naziv politike koja će se koristiti - group_authorization. Važna stvar - naziv politike nije određen imenom datoteke u direktoriju politika.d, ali putem direktive unutar datoteke prije vitičastih zagrada.
U sekciji potvrditi identitet u istim datotekama trebate dekomentirati red Pam.

U fajlu clients.conf propisati parametre sa kojima će se povezati Fortigate:

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

Konfiguracija modula 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

Zadane opcije implementacije paketa freeradius с google autenticator zahtijevaju od korisnika da unese vjerodajnice u formatu: korisnicko ime lozinka+OTP.

Zamišljajući broj psovki koje će pasti na glavu, u slučaju korištenja zadanog paketa freeradius с Google Authenticator, odlučeno je da se koristi konfiguracija modula Pam tako da se samo token može provjeriti Google Authenticator.

Kada se korisnik poveže, dešava se sljedeće:

  • Freeradius provjerava da li je korisnik u domeni i u određenoj grupi i, ako je uspješan, provjerava OTP token.

Sve je izgledalo dovoljno dobro do trenutka kada sam pomislio “Kako da registrujem OTP za 300+ korisnika?”

Korisnik se mora prijaviti na server sa freeradius i ispod vašeg naloga i pokrenite aplikaciju Google autentifikator, koji će generirati QR kod za aplikaciju za korisnika. Tu dolazi pomoć. shellina box u kombinaciji sa .bash_profile.

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

Daemon config file se nalazi na /etc/sysconfig/shellinabox.
Navodim port 443 tamo i možete odrediti svoj certifikat.

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

Korisnik samo treba da prati link, unese kredite za domenu i dobije QR kod za aplikaciju.

Algoritam je sljedeći:

  • Korisnik se prijavljuje na mašinu preko pretraživača.
  • Da li je korisnik domene označen. Ako ne, onda se ništa ne preduzima.
  • Ako je korisnik korisnik domene, provjerava se članstvo u grupi administratora.
  • Ako nije administrator, provjerava da li je Google Authenticator konfiguriran. Ako nije, onda se generira QR kod i korisnik se odjavljuje.
  • Ako nije administrator i konfiguriran je Google Authenticator, samo se odjavite.
  • Ako je administrator, provjerite ponovo Google Authenticator. Ako nije konfigurisan, generira se QR kod.

Sva logika se radi pomoću /etc/skel/.bash_profile.

mačka /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:

  • Mi stvaramo poluprečnik-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Kreiramo potrebne grupe, po potrebi kontrolu pristupa po grupama. Ime grupe uključeno Fortigate mora odgovarati grupi koja je proslijeđena Specifičan atribut dobavljača Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Uređivanje potrebnog SSL-portali.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Dodavanje grupa politikama.

    Freeradius + Google Authenticator + LDAP + Fortigate

Prednosti ovog rješenja:

  • Moguće je autentifikovati putem OTP-a Fortigate rješenje otvorenog koda.
  • Korisnik ne unosi lozinku domene prilikom povezivanja putem VPN-a, što donekle pojednostavljuje proces povezivanja. Šestocifrenu lozinku je lakše unijeti od one koju predviđa sigurnosna politika. Kao rezultat toga, smanjuje se broj tiketa s temom: "Ne mogu se povezati s VPN-om".

PS Planiramo nadograditi ovo rješenje na potpunu dvofaktorsku autentifikaciju sa izazov-odgovor.

update:

Kao što sam obećao, podesio sam ga na opciju izazov-odgovor.
Dakle:
U fajlu /etc/raddb/sites-enabled/default odjeljak ovlastiti je sledeći:

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
}

Odjeljak potvrditi identitet sada izgleda ovako:

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
}

Sada se provjera korisnika odvija prema sljedećem algoritmu:

  • Korisnik unosi kredite domene u VPN klijentu.
  • Freeradius provjerava valjanost naloga i lozinke
  • Ako je lozinka ispravna, šalje se zahtjev za token.
  • Token se provjerava.
  • profit).

izvor: www.habr.com

Dodajte komentar