Freeradius + Google Authenticator + LDAP + Fortigate

Entä jos kaksivaiheinen todennus on sekä toivottavaa että piikikäs, mutta laitteistotokeneihin ei ole rahaa ja yleensä ne tarjoavat hyvällä tuulella pysymistä.

Tämä ratkaisu ei ole mikään superalkuperäinen, vaan pikemminkin sekoitus erilaisia ​​Internetistä löytyviä ratkaisuja.

Niin annettu

Verkkotunnuksen nimi Active Directory.

VPN:n kautta työskentelevät verkkotunnuksen käyttäjät, kuten monet nykyään.

Toimii VPN-yhdyskäytävänä FortiGate.

VPN-asiakkaan salasanan tallentaminen on kielletty suojauskäytännöissä.

Politiikka Fortinet suhteessa omiin rahakkeihisi, et voi kutsua sitä vähemmäksi kuin zhlob - ilmaisia ​​tokeneita on jopa 10, loput - erittäin ei-kosher-hintaan. En ajatellut RSASecureID:tä, Duoa ja vastaavia, koska haluan avoimen lähdekoodin.

Edellytykset: isäntä * nix vakiintuneen kanssa FreeRADIUS, ssd - syötetty verkkotunnukseen, verkkotunnuksen käyttäjät voivat helposti todentaa sen.

Lisäpaketit: shellina laatikko, hahmo, freeradius-ldap, fontti kapinallinen.tlf arkistosta https://github.com/xero/figlet-fonts.

Esimerkissäni CentOS 7.8.

Työn logiikan oletetaan olevan seuraava: VPN-yhteyttä muodostettaessa käyttäjän on syötettävä verkkotunnuksen sisäänkirjautuminen ja OTP salasanan sijaan.

Palvelujen asennus

В /etc/raddb/radiusd.conf vain käyttäjä ja ryhmä, jonka puolesta aloittaa FreeRADIUS, palvelusta lähtien säde pitäisi pystyä lukemaan tiedostoja kaikissa alihakemistoissa /Koti/.

user = root
group = root

Jotta ryhmiä voidaan käyttää asetuksissa FortiGate, on lähetettävä Toimittajakohtainen ominaisuus. Voit tehdä tämän hakemistossa raddb/policy.d Luon seuraavan sisällön sisältävän tiedoston:

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

Kun olet asentanut freeradius-ldap hakemistossa raddb/mods-saatavilla tiedosto luodaan ldap.

Sinun on luotava symbolinen linkki hakemistoon raddb/mods-käytössä.

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

Tuon sen sisällön tähän lomakkeeseen:

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

Tiedostoissa raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel osiossa valtuuttaa Lisään käytettävän käytännön nimen - group_authorization. Tärkeä kohta - käytännön nimeä ei määritä hakemistossa olevan tiedoston nimi politiikka.d, mutta käskyllä ​​tiedoston sisällä ennen kiharoita.
osiossa todentaa samoissa tiedostoissa sinun on poistettava rivin kommentti pam.

Tiedostossa clients.conf määritä parametrit, joihin se yhdistetään FortiGate:

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

Moduulin kokoonpano 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

Paketin oletustoteutusvaihtoehdot FreeRADIUS с google todentaja vaatia käyttäjää antamaan valtuustiedot muodossa: Käyttäjänimi Salasana+OTP.

Kuvittelemalla päähän osuvien kirousten lukumäärän, jos käytetään oletuspakettia FreeRADIUS с Google Authenticator, päätettiin käyttää moduulikokoonpanoa pam niin, että vain merkki voidaan tarkistaa Google Authenticator.

Kun käyttäjä muodostaa yhteyden, tapahtuu seuraavaa:

  • Freeradius tarkistaa, onko käyttäjä toimialueella ja tietyssä ryhmässä, ja onnistuessaan OTP-tunnus tarkistetaan.

Kaikki näytti riittävän hyvältä, kunnes ajattelin "Kuinka voin rekisteröidä OTP:n yli 300 käyttäjälle?"

Käyttäjän tulee kirjautua sisään palvelimelle tunnuksella FreeRADIUS ja tilisi alta ja suorita sovellus Google autentikaattori, joka luo käyttäjälle QR-koodin sovellukselle. Tässä tulee apua. shellina laatikko yhdessä .bash_profile.

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

Daemon-määritystiedosto sijaitsee osoitteessa /etc/sysconfig/shellinabox.
Määritän siellä portin 443 ja voit määrittää varmenteen.

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

Käyttäjän tarvitsee vain seurata linkkiä, syöttää verkkotunnuksen krediittejä ja saada QR-koodi sovellukseen.

Algoritmi on seuraava:

  • Käyttäjä kirjautuu sisään koneelle selaimen kautta.
  • Onko verkkotunnuksen käyttäjä tarkistettu. Jos ei, toimenpiteisiin ei ryhdytä.
  • Jos käyttäjä on toimialueen käyttäjä, jäsenyys Järjestelmänvalvojat-ryhmässä on valittu.
  • Jos ei ole järjestelmänvalvoja, se tarkistaa, onko Google Authenticator määritetty. Jos ei, luodaan QR-koodi ja käyttäjä kirjautuu ulos.
  • Jos järjestelmänvalvojaa ja Google Authenticatoria ei ole määritetty, kirjaudu ulos.
  • Jos järjestelmänvalvoja, tarkista Google Authenticator uudelleen. Jos sitä ei ole määritetty, QR-koodi luodaan.

Kaikki logiikka tehdään käyttämällä /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

Vahvista asetukset:

  • Me luomme Säde-palvelin

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Luomme tarvittavat ryhmät, tarvittaessa kulunvalvonta ryhmittäin. Ryhmän nimi käytössä FortiGate on vastattava hyväksyttyä ryhmää Toimittajakohtainen ominaisuus Fortinet-ryhmän nimi.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Tarvittavan muokkaaminen SSL-portaalit.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Ryhmien lisääminen käytäntöihin.

    Freeradius + Google Authenticator + LDAP + Fortigate

Tämän ratkaisun edut:

  • On mahdollista todentaa OTP:llä FortiGate avoimen lähdekoodin ratkaisu.
  • Käyttäjä ei syötä verkkotunnuksen salasanaa muodostaessaan yhteyden VPN:n kautta, mikä yksinkertaistaa jonkin verran yhteysprosessia. 6-numeroinen salasana on helpompi syöttää kuin suojauskäytännön antama. Tämän seurauksena lippujen määrä, joiden aihe on: "En voi muodostaa yhteyttä VPN-verkkoon", vähenee.

PS Aiomme päivittää tämän ratkaisun täysimittaiseksi kaksivaiheiseksi todennukseksi haaste-vastauksella.

Päivitys:

Kuten lupasin, muokkasin sen haaste-vastaus -vaihtoehdoksi.
Joten:
Tiedostossa /etc/raddb/sites-enabled/default jakso valtuuttaa on seuraava:

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
}

Jakso todentaa nyt näyttää tältä:

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
}

Nyt käyttäjän vahvistus tapahtuu seuraavan algoritmin mukaan:

  • Käyttäjä syöttää verkkotunnuksen krediittejä VPN-asiakkaaseen.
  • Freeradius tarkistaa tilin ja salasanan oikeellisuuden
  • Jos salasana on oikea, lähetetään tunnuspyyntö.
  • Tunnusta tarkistetaan.
  • voitto).

Lähde: will.com

Lisää kommentti