Freeradius + Google Authenticator + LDAP + Fortigate

Mis siis, et kahefaktoriline autentimine on ühtaegu ihaldusväärne ja torkiv, aga riistvaraliste žetoonide jaoks raha pole ja üldiselt pakuvad need hea tuju hoidmist.

See lahendus pole midagi ülioriginaalset, vaid pigem segu erinevatest internetist leitud lahendustest.

Nii antud

Domeeninimi Active Directory.

VPN-i kaudu töötavad domeenikasutajad, nagu paljud tänapäeval.

Toimib VPN-lüüsina Tugevdada.

VPN-kliendi parooli salvestamine on turvapoliitikaga keelatud.

Poliitika Fortinet seoses oma žetoonidega ei saa te seda nimetada vähemaks kui zhlob - tasuta žetoone on tervelt 10, ülejäänud - väga mitte-kosher hinnaga. Ma ei arvestanud RSASecureID, Duo ja muu sarnasega, kuna tahan avatud lähtekoodiga.

Eeltingimused: võõrustaja * nix koos väljakujunenud freeradius, ssd - sisestatud domeeni, domeeni kasutajad saavad sellel hõlpsalt autentida.

Lisapaketid: shellina karp, figuur, freeradius-ldap, font mässaja.tlf hoidlast https://github.com/xero/figlet-fonts.

Minu näites - CentOS 7.8.

Töö loogika peaks olema järgmine: VPN-iga ühenduse loomisel peab kasutaja sisestama parooli asemel domeeni sisselogimise ja OTP.

Teenuste seadistamine

В /etc/raddb/radiusd.conf ainult kasutaja ja grupp, kelle nimel alustab freeradius, alates teenusest raadius peaks suutma lugeda faile kõigis alamkataloogides /Kodu/.

user = root
group = root

Et saaks seadetes gruppe kasutada Tugevdada, tuleb edastada Tarnija spetsiifiline atribuut. Selleks kataloogis raddb/policy.d Loon järgmise sisuga faili:

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

Pärast paigaldamist freeradius-ldap kataloogis raddb/mods-saadaval fail luuakse ldap.

Peate looma sümboolse lingi kataloogi raddb/mods-enabled.

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

Toon selle sisu sellele vormile:

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 и raddb/sites-enabled/inner-tunnel jaotises volitada Lisan kasutatava poliitika nimetuse - group_authorization. Oluline punkt - poliitika nime ei määra kataloogis oleva faili nimi poliitika.d, kuid käskkirjaga faili sees enne lokkis sulgusid.
Jaotises autentida samades failides peate rea kommentaarid tühistama pam.

Failis clients.conf määrake parameetrid, millega see ühendatakse Tugevdada:

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

Vaikimisi kogumi juurutamise valikud freeradius с google autentimistarkvara nõuda kasutajalt mandaatide sisestamist vormingus: kasutajanimi Parool+OTP.

Kujutades ette vaikekimbu kasutamise korral pähe langevate needuste arvu freeradius с Google Authenticator, otsustati kasutada mooduli konfiguratsiooni pam et saaks kontrollida ainult märgi Google Authenticator.

Kui kasutaja ühenduse loob, juhtub järgmine:

  • Freeradius kontrollib, kas kasutaja on domeenis ja teatud grupis olemas ning kui see õnnestub, siis kontrollitakse OTP-märki.

Kõik tundus piisavalt hea kuni hetkeni, mil mõtlesin "Kuidas saan registreerida OTP-d 300+ kasutajale?"

Kasutaja peab serverisse sisse logima, kasutades freeradius ja oma konto alt ning käivitage rakendus Google'i autentija, mis genereerib kasutajale rakenduse jaoks QR-koodi. Siit tulebki abi. shellina karp koos .bash_profile.

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

Deemoni konfiguratsioonifail asub aadressil /etc/sysconfig/shellinabox.
Määran seal pordi 443 ja saate määrata oma sertifikaadi.

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

Kasutajal on vaja ainult linki jälgida, domeeni krediiti sisestada ja rakenduse jaoks saada QR-kood.

Algoritm on järgmine:

  • Kasutaja logib masinasse sisse brauseri kaudu.
  • Kas domeeni kasutaja on kontrollitud. Kui ei, siis meetmeid ei võeta.
  • Kui kasutaja on domeeni kasutaja, on administraatorite grupi liikmelisus märgitud.
  • Kui see pole administraator, kontrollib see, kas Google Authenticator on konfigureeritud. Kui ei, siis genereeritakse QR-kood ja kasutaja väljalogimine.
  • Kui pole administraatorit ja Google Authenticator on konfigureeritud, logige lihtsalt välja.
  • Kui olete administraator, kontrollige uuesti Google Authenticatorit. Kui see pole konfigureeritud, luuakse QR-kood.

Kogu loogika on tehtud kasutades /etc/skel/.bash_profile.

kass /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

Tugevdage seadistust:

  • Meie loome raadius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Loome vajalikud rühmad, vajadusel juurdepääsukontrolli gruppide kaupa. Grupi nimi sisse lülitatud Tugevdada peab vastama edasipääsetavale grupile Tarnija spetsiifiline atribuut Fortinet-rühma nimi.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Vajaliku toimetamine SSL- portaalid.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Rühmade lisamine poliitikasse.

    Freeradius + Google Authenticator + LDAP + Fortigate

Selle lahenduse eelised:

  • On võimalik autentida OTP kaudu Tugevdada avatud lähtekoodiga lahendus.
  • Kasutaja ei sisesta VPN-i kaudu ühenduse loomisel domeeni parooli, mis mõnevõrra lihtsustab ühendusprotsessi. 6-kohalist parooli on lihtsam sisestada kui turvapoliitikas pakutavat. Selle tulemusel väheneb piletite arv teemaga "Ma ei saa VPN-iga ühendust".

PS Plaanime selle lahenduse uuendada täisväärtuslikuks kahefaktoriliseks autentimiseks väljakutse-vastusega.

Värskenda:

Nagu lubatud, kohandasin selle väljakutse-vastuse valikule.
Nii et:
Failis /etc/raddb/sites-enabled/default osa volitada on järgmine:

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
}

Jagu autentida nüüd näeb välja selline:

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
}

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

  • Kasutaja sisestab VPN-kliendi domeenikrediiti.
  • Freeradius kontrollib konto ja parooli kehtivust
  • Kui parool on õige, saadetakse taotlus loa saamiseks.
  • Token on kontrollimisel.
  • kasum).

Allikas: www.habr.com

Lisa kommentaar