Freeradius + Google Autheticator + LDAP + Fortigate

Kuidas käituda, kui kahefaktoriline autentimine on vajalik, aga raha riistvara tokenite jaoks ei ole ning soovitatakse lihtsalt üritada head tuju hoida.

See lahendus ei ole midagi superoriginaalset, pigem on see segu erinevatest lahendustest, mida on internetist leitud.

Nii et on antud

Domeen Active Directory.

Domeeni kasutajad, kes töötavad VPN-i kaudu, nagu paljud praegu.

VPN-i väravana toimib Fortigate.

VPN- kliendi jaoks parooli salvestamine on turvapoliitika järgi keelatud.

Poliitika Fortinet oma tokenite osas ei ole vähem kui ahne — tasuta tokeneid on lausa 10 tükki, ülejäänud on väga kahtlase hinnaga. RSASecureID, Duo ja sarnaseid ma ei kaalunud, kuna soovin avatud lähtekoodiga lahendust.

Eeltingimused: host *nix installeeritud freeradius, sssd — on domeeni lisatud, domeeni kasutajad saavad seda probleemideta autentida.

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

Minu näites — CentOS 7.8.

Töö loogika on selline: VPN-i ühendamisel peab kasutaja sisestama domeeni sisselogimisnime ja OTP koos parooliga.

Teenuste seadistamine

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

user = root
group = root

Kuna gruppe tuleb seadetesse kasutada Fortigate, tuleb edastada Vendor Specific Attribute. Selleks loon kataloogis raddb/policy.d faili järgnevate sisudega:

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, Admin"
                }
        }
    else {
        update reply {
        &Reply-Message := "VPN kasutamiseks ei ole õigusi"
            }
        reject
        }
}

Pärast installeerimist freeradius-ldap kaustas raddb/mods-available luuakse fail ldap.

Tuleb luua sümboolne link katalooge raddb/mods-enabled.

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

Viin 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 autoriseerida lisame poliitika nime, mida kasutatakse — group_authorization. Oluline punkt — poliitika nimi määratakse mitte faili nimega kaustas policy.d, vaid direktiiviga faili sees enne kõverate sulgude.
Jaotises autentimine nendes samades failides tuleb kommenteerimisrida eemaldada pam.

Failis clients.conf märkime parameetrid, millega otsitakse ühendust Fortigate:

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

Moodi 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

Vaikimisi valikud freeradius jot google authenticator eeldavad, et kasutaja sisestab mandaadi järgmises formaadis: kasutajanimi/parool+OTP.

Kuna pean ette kujutama hulga needusi, mis mus silmaringi tuleb, kui kasutada vaikimisi seoseid freeradius jot Google Authenticator, siis otsustatakse kasutada mooduli konfiguratsiooni pam niimoodi, et kontrollitakse ainult tokeni olemasolu Google Authenticator.

Kasutaja ühendused toimuvad järgmiselt:

  • Freeradius kontrollib kasutaja olemasolu domeenis ja kindlas grupis ning, kui see õnnestub, toimub OTP tokeni kontroll.

Kõik nägi piisavalt head välja, kuni ma ei mõelnud: "Kuidas registreerida OTP üle 300 kasutaja jaoks?"

Kasutaja peab sisenema serverisse freeradius ja oma kasutajakonto alt ja käivitama rakenduse Google authenticator, mis genereerib kasutaja jaoks QR-koodi rakenduse jaoks. Siin tuleb appi shellinabox koos .bash_profile.

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

Demon konfiguratsioonifail asub /etc/sysconfig/shellinabox.
Määran seal pordi 443 ja saan määrata oma sertifikaadi.

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

Kasutajal jääb ainult minna lingile, sisestada domeeni mandaadid ja saada QR-kood rakenduse jaoks.

Algoritm on järgmine:

  • Kasutaja siseneb masinasse brauseri kaudu.
  • Kontrollitakse, kas kasutaja on domeenikasutaja. Kui ei, siis ei tehta mingeid toiminguid.
  • Kui kasutaja on domeenikasutaja, kontrollitakse liikmelisust administraatorigruppidesse.
  • Kui ei ole administraator, kontrollitakse, kas Google Autheticator on seadistatud. Kui ei, siis genereeritakse QR-kood ja kasutaja visatakse välja.
  • Kui ei ole administraator ja Google Authenticator on seadistatud, siis lihtsalt logitakse välja.
  • Kui on administraator, kontrollitakse uuesti Google Authenticatorit. Kui ei ole seadistatud, genereeritakse QR-kood.

Kogu loogika täidetakse 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 seadistamine:

  • Loome Radius-server

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Loome vajalikud grupid, kui on vajalik juurdepääsugruppide eristamine. Grupinimi Fortigate peab vastama grupile, mis edastatakse Vendor Specific Attribute Fortinet-Group-Name.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Redigeerime vajalikud SSL-portaalid.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Lisame grupid poliitikutesse.

    Freeradius + Google Autheticator + LDAP + Fortigate

Selle lahenduse eelised:

  • On võimalus autentida OTP kaudu Fortigate avatud lähtekoodiga lahendusega.
  • Kasutaja domeeniparooli sisestamine VPN-iga ühendamisel välistatakse, mis lihtsustab ühendamise protsessi. 6-kohaline parool on lihtsam sisestada kui see, mis on ette nähtud turvapoliitikas. Selle tulemusena väheneb juhtumite arv teemaga: „Ei saa VPN-iga ühendust saada“.

P.S. Plaanis on seda lahendust täiustada täisväärtuslikuks kahe teguri autentimiseks koos challenge-response süsteemiga.

Uuendus:

Nagu lubatud, täiustasin selle challenge-response variandiks.
Nii:
Failis /etc/raddb/sites-enabled/default sektsioon autoriseerida on järgmisel kujul:

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, siis proksi päring:
        group_authorization
    }
pap
}

Jaotis autentimine on nüüd järgmine välimus:

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

Kasutaja kontrollimine toimub nüüd järgmise algoritmi järgi:

  • Kasutaja sisestab domeeni mandaadid VPN-klientis.
  • Freeradius kontrollib kontot ja parooli kehtivust
  • Kui parool on õige, saadetakse token'i päring.
  • Toimub token'i kontrollimine.
  • Kasum).

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster