Freeradius + Google Authenticator + LDAP + Fortigate

Kaj pa, če je dvofaktorska avtentikacija hkrati zaželena in bodeča, vendar ni denarja za strojne žetone in na splošno ponujajo, da ostanejo dobre volje.

Ta rešitev ni nekaj super izvirnega, temveč mešanica različnih rešitev, ki jih najdemo na internetu.

Tako dano

Ime domene Active Directory.

Uporabniki domene, ki delajo prek VPN-ja, kot mnogi danes.

Deluje kot prehod VPN Okrepite.

Varnostni pravilnik prepoveduje shranjevanje gesla za odjemalca VPN.

Politika Fortinet v zvezi z lastnimi žetoni ga ne morete imenovati manj kot zhlob - na voljo je kar 10 brezplačnih žetonov, ostalo - po zelo ne-košer ceni. RSASecureID, Duo in podobno nisem upošteval, ker želim odprtokodno.

Predpogoji: gostitelj * nix z uveljavljenim freeradius, ssd - vnesena v domeno, se lahko uporabniki domene enostavno avtentikirajo na njej.

Dodatni paketi: shellina škatla, fig, freeradius-ldap, pisava upornik.tlf iz repozitorija https://github.com/xero/figlet-fonts.

V mojem primeru - CentOS 7.8.

Logika dela naj bi bila naslednja: pri povezovanju v VPN mora uporabnik namesto gesla vnesti domensko prijavo in OTP.

Nastavitev storitev

В /etc/raddb/radiusd.conf samo uporabnik in skupina, v imenu katere se začne freeradius, saj storitev radiusd mora imeti možnost brati datoteke v vseh podimenikih / home /.

user = root
group = root

Da bi lahko uporabljali skupine v nastavitvah Okrepite, je treba posredovati Poseben atribut prodajalca. Če želite to narediti, v imeniku raddb/policy.d Ustvarim datoteko z naslednjo vsebino:

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

Po namestitvi freeradius-ldap v imeniku raddb/mods-na voljo datoteka je ustvarjena ldap.

Treba je ustvariti simbolično povezavo do imenika raddb/mods-enabled.

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

Njegovo vsebino prenašam v ta obrazec:

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

V datotekah raddb/sites-enabled/default и raddb/sites-enabled/notranji-tunel v razdelku odobri Dodam ime pravilnika, ki bo uporabljen - group_authorization. Pomembna točka - ime pravilnika ni določeno z imenom datoteke v imeniku politika.d, vendar z direktivo znotraj datoteke pred zavitimi oklepaji.
V razdelku preverjanje pristnosti v istih datotekah morate odkomentirati vrstico pam.

V datoteki clients.conf predpisati parametre, s katerimi se bo povezoval Okrepite:

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

Privzete možnosti implementacije svežnja freeradius с Googlov avtentikator zahtevajo, da uporabnik vnese poverilnice v obliki: uporabniško ime geslo+OTP.

S predstavljanjem števila kletvic, ki bodo padle na glavo, v primeru uporabe privzetega svežnja freeradius с Google Authenticator, je bilo odločeno, da se uporabi konfiguracija modula pam tako da je mogoče preveriti samo žeton Google Authenticator.

Ko se uporabnik poveže, se zgodi naslednje:

  • Freeradius preveri, ali je uporabnik v domeni in v določeni skupini in, če je uspešen, preveri žeton OTP.

Vse je bilo videti dovolj dobro do trenutka, ko sem pomislil "Kako lahko registriram OTP za 300+ uporabnikov?"

Uporabnik se mora prijaviti na strežnik z freeradius in pod svojim računom ter zaženite aplikacijo Google avtentikator, ki bo uporabniku ustvaril QR kodo za aplikacijo. Tukaj pride pomoč. shellina škatla v kombinaciji z .bash_profile.

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

Daemon konfiguracijska datoteka se nahaja na /etc/sysconfig/shellinabox.
Tam določim vrata 443, vi pa lahko določite svoje potrdilo.

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

Uporabnik mora le slediti povezavi, vpisati kredite domene in prejeti kodo QR za aplikacijo.

Algoritem je naslednji:

  • Uporabnik se v stroj prijavi prek brskalnika.
  • Ali je uporabnik domene preverjen. Če ne, se ne ukrepa.
  • Če je uporabnik uporabnik domene, se preveri članstvo v skupini Administratorji.
  • Če ni skrbnik, preveri, ali je Google Authenticator konfiguriran. Če ne, se ustvari koda QR in odjava uporabnika.
  • Če niste skrbnik in je Google Authenticator konfiguriran, se preprosto odjavite.
  • Če ste skrbnik, znova preverite Google Authenticator. Če ni konfiguriran, se ustvari koda QR.

Vsa logika se izvede z uporabo /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

Nastavitev Fortigate:

  • Mi ustvarjamo Radius-strežnik

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Ustvarimo potrebne skupine, po potrebi nadzor dostopa po skupinah. Ime skupine vklopljeno Okrepite mora ustrezati skupini, ki je posredovana Poseben atribut prodajalca Ime-skupine Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Urejanje potrebnega SSL-portali.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Dodajanje skupin pravilnikom.

    Freeradius + Google Authenticator + LDAP + Fortigate

Prednosti te rešitve:

  • Možno je preverjanje pristnosti z OTP na Okrepite odprtokodna rešitev.
  • Uporabnik pri povezovanju prek VPN ne vnese gesla domene, kar nekoliko poenostavi postopek povezave. 6-mestno geslo je lažje vnesti kot tisto, ki ga zagotavlja varnostna politika. Posledično se zmanjša število vstopnic z zadevo: "Ne morem se povezati z VPN".

PS To rešitev nameravamo nadgraditi na popolno dvofaktorsko avtentikacijo z odzivom na izziv.

Posodobitev:

Kot sem obljubil, sem ga prilagodil na možnost izziv-odgovor.
Torej:
V datoteki /etc/raddb/sites-enabled/default razdelek odobri je naslednji:

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
}

Oddelek preverjanje pristnosti zdaj izgleda takole:

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
}

Zdaj se preverjanje uporabnika izvaja po naslednjem algoritmu:

  • Uporabnik v odjemalec VPN vnese kredite domene.
  • Freeradius preveri veljavnost računa in gesla
  • Če je geslo pravilno, se pošlje zahteva za žeton.
  • Žeton se preverja.
  • dobiček).

Vir: www.habr.com

Dodaj komentar