Freeradius + Google Autheticator + LDAP + Fortigate

Kuidas käituda, kui kahefaktoriline autentimine on vajalik, kuid raha riistvaralistest tokenitest pole ja pakutakse lihtsalt heatahtlikku meeleolu hoidmist.

See lahendus ei ole midagi ülioriginaalset, pigem segu erinevatest lahendustest, mis leitud internetiavarustest.

Nii et, antud

Domeen Active Directory.

Domeeni kasutajad, kes töötavad VPN-i kaudu, nagu paljud tänapäeval.

VPN-i värava rollis on Fortigate.

Parooli salvestamine VPN-i kliendi jaoks on keelatud turvapoliitika tõttu.

Poliitika Fortinet oma tokenite suhtes ei saa nimetada vähem kui ahneks — tasuta tokeneid on tervelt 10, ülejäänud aga väga ebaausate hindadega. RSASecureID, Duo ja neile sarnastele ei vaadanud, kuna eelistan avatud lähtekoodi.

Eeltingimused: host *nix paigaldatuga freeradius, sssd — on domeeni sisse viidud ja domeeni kasutajad saavad sellega rahulikult autentida.

Lisapakid: shellinabox, figlet, freeeradius-ldap, font rebel.tlf hoidlast https://github.com/xero/figlet-fonts.

Minu näites — CentOS 7.8.

Töölogika eeldab järgmist: VPN-iga ühendudes peab kasutaja sisestama domeenilogini ja OTP parooli asemel.

Teenuste seadistamine

V /etc/raddb/radiusd.conf muutuvad ainult kasutaja ja grupp, kelle nimel käivitatakse freeradius, kuna teenus radiusd peab suutma lugeda faile kõigist alamkaustadest /home/.

user = root
group = root

Kuna gruppe tuleb seadistustes kasutada Fortigate, tuleb edastada Müüja Spetsiifiline Atribuut. Sel eesmärgil kaustas raddb/policy.d loodan faili järgmise sisuga:

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 := "Tere tulemast, administraator"
                }
        }
    else {
        update reply {
        &Reply-Message := "Ei ole volitatud vpn kasutamiseks"
            }
        reject
        }
}

Pärast installimist freeradius-ldap kaustas raddb/mods-available loodakse fail ldap.

Peab looma sümboolse lingi katalooge raddb/mods-enabled.

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

Muudan selle sisu selliseks:

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

Failides raddb/sites-enabled/default ja raddb/sites-enabled/inner-tunnel jaotises authorize lisame grupi autoriseerimise määramine — group_authorization. Oluline detail — määramine süsivesiku nime järgi, mitte kausta nime järgi policy.d, aga direktiiviga failis enne sulgude avamist.
jaotises authenticate nendes failides tuleb kommenteerida välja rida pam.

Failis clients.conf defineerime parameetrid, millega ühendust luuakse Fortigate:

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

Mooduli konfiguratsioon 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

Vaikesed ühendamisvõimalused freeradius koos google authenticator eeldavad kasutaja sisestamist andmeid järgmisel kujul: kasutajanimi/parool+OTP.

Kui palju needuse peaks pähe sadama, kui kasutada vaikeühendust, freeradius koos Google Authenticator, siis otsustati kasutada mooduli konfiguratsiooni pam nii, et kontrollitakse ainult märki Google Authenticator.

Kasutaja ühendamisel toimub järgmist:

  • Freeradius kontrollib, kas kasutaja asub domeenis ja kindlas grupis ning, kui see õnnestub, toimub OTP-märgi kontroll.

Kõik näis üsna hästi minevat, kuni ma ei hakanud mõtlema: "Kuidas registreerida OTP 300+ kasutaja jaoks?"

Kasutaja peab serverisse sisse logima freeradius oma kontolt ja käivitama rakenduse Google authenticator, mis genereerib kasutajale rakenduse QR-koodi. Siin tuleb appi shellinabox koos .bash_profile.

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

Demonite konfiguratsioonifail asub /etc/sysconfig/shellinabox.
Määran port 443 ja saan lisada oma sertifikaadi.

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

Kasutajale jääb vaid linki minna, domeeni mandaate sisestada ja rakenduse QR-kood saada.

Algrütm on järgmine:

  • Kasutaja logib masina kaudu brauseriga sisse.
  • Kontrollitakse, kas kasutaja on domeeniline. Kui ei, siis ei tehta mingeid samme.
  • Kui kasutaja on domeeniline, kontrollitakse, kas ta kuulub administraatorite gruppi.
  • Kui ei ole administraator, kontrollitakse, kas Google Autheticator on seadistatud. Kui ei, genereeritakse QR-kood ja kasutaja logitakse välja.
  • Kui ei ole administraator ja Google Authenticator on seadistatud, logitakse lihtsalt välja.
  • Kui on administraator, siis kontrollitakse taas Google Authenticatorit. Kui see ei ole seadistatud, genereeritakse QR-kood.

Kõik loogika teostatakse kasutades /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 seadistus:

  • Loome Raadius-server

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Loome vajalikud grupid, vajadusel juurdepääsu rikkaunistamiseks. Grupi nimi Fortigate peab vastama grupile, mis edastatakse Müüja Spetsiifiline Atribuut Fortinet-Group-Name.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Redigeerime vajalikud SSL-portaalid.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Lisame grupid poliitikatesse.

    Freeradius + Google Autheticator + LDAP + Fortigate

Selle lahenduse eelised:

  • On võimalik autentida OTP kaudu Fortigate avatud lähtekoodiga lahendusele.
  • Domeeniparooli sisenemine kasutaja poolt VPN-i ühendamisel on välistatud, mis lihtsustab ühenduse loomise protsessi. 6-kohaline parool on lihtsam sisestada kui see, mis on ette nähtud turvapoliitikas. Seetõttu väheneb piletite arv teemaga: „Ei saa VPN-iga ühendust”.

P.S. Plaanides on see lahendus täiendada täieliku kahefaasilise autentimisega challenge-response meetodiga.

Uuendus:

Nagu lubatud, täiendasin siiski versiooni challenge-response meetodiga.
Nii et:
Failis /etc/raddb/sites-enabled/default sektsioon authorize see näeb välja järgmine:

authorize {
    filter_username
    preprocess
    auth_log
    chap
    mschap
    suffix
    eap {
        ok = return
    }
    files
    -sql
    #-ldap
    expiration
    logintime
    if (!State) {
        if (&User-Password) {
            # Kui !State ja User-Password (PAP), siis sunni LDAP:
            update control {
                Ldap-UserDN := "%{User-Name}"
                Auth-Type := LDAP
            }
        }
        else {
            reject
        }
    }
    else {
        # Kui State on olemas, siis proksi päring:
        group_authorization
    }
pap
}

Sektsioon authenticate on nüüd järgmine:

authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        digest
        # Proovi autentimist otsese LDAP sidumisega:
        Auth-Type LDAP {
        ldap
        if (ok) {
            update reply {
                # Loo juhuslik State atribuut:
                State := "%{randstr:aaaaaaaaaaaaaaaa}"
                Reply-Message := "Palun sisestage OTP"
                }
            # Tagasta Access-Challenge:
            challenge
            }
        }
        pam
        eap
}

Nüüd toimub kasutaja kontroll järgmise algoritmi järgi:

  • Kasutaja sisestab domeeni mandaadid VPN-kliendis.
  • Freeradius kontrollib konto ja parooli kehtivust.
  • Kui parool on õige, saadetakse päring token'i kohta.
  • Tokeni kontrollimine on käimas.
  • Tulu).

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster