Freeradius + Google Authenticator + LDAP + Fortigate

Hva om tofaktorautentisering er både ønskelig og stikkende, men det er ingen penger til maskinvaretokens og generelt tilbyr de å holde seg i godt humør.

Denne løsningen er ikke noe superoriginalt, men snarere en blanding av ulike løsninger som finnes på Internett.

Så det er gitt

Domenenavn Active Directory.

Domenebrukere som jobber gjennom en VPN, som mange i dag.

Fungerer som en VPN-gateway Heldig.

Lagring av passordet for VPN-klienten er forbudt av sikkerhetspolicy.

Politikk Fortinet i forhold til dine egne tokens, kan du ikke kalle det mindre enn en zhlob - det er så mange som 10 gratis tokens, resten - til en svært ikke-kosher pris. Jeg vurderte ikke RSASecureID, Duo og lignende, fordi jeg vil ha åpen kildekode.

Forutsetninger: host * nix med etablerte Freeradius, ssd - inngått i domenet, kan domenebrukere enkelt autentisere seg på det.

Tilleggspakker: shellina boks, figlett, freeradius-ldap, font rebel.tlf fra depotet https://github.com/xero/figlet-fonts.

I mitt eksempel - CentOS 7.8.

Arbeidslogikken er ment å være som følger: når du kobler til en VPN, må brukeren angi en domenepålogging og en OTP i stedet for et passord.

Tjenester oppsett

В /etc/raddb/radiusd.conf bare brukeren og gruppen på vegne av starter Freeradius, siden tjenesten radiusd skal kunne lese filer i alle underkataloger /hjem/.

user = root
group = root

For å kunne bruke grupper i innstillinger Heldig, må overføres Leverandørspesifikt attributt. For å gjøre dette, i katalogen raddb/policy.d Jeg lager en fil med følgende innhold:

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

Etter installasjonen freeradius-ldap i katalogen raddb/mods-tilgjengelig filen er opprettet ldap.

Du må opprette en symbolsk lenke til katalogen raddb/mods-aktivert.

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

Jeg bringer innholdet til dette skjemaet:

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

I filer raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel i seksjon autorisere Jeg legger til navnet på policyen som skal brukes - group_authorization. Et viktig poeng - navnet på policyen bestemmes ikke av navnet på filen i katalogen policy.d, men etter et direktiv inne i filen før de krøllete klammeparentesene.
I seksjonen godkjenne i de samme filene må du fjerne kommentering av linjen pam.

I fil clients.conf spesifiser parametrene som skal kobles til Heldig:

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

Modulkonfigurasjon 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

Standard pakkeimplementeringsalternativer Freeradius с google autentisering kreve at brukeren oppgir legitimasjon i formatet: brukernavn passord+OTP.

Ved å forestille seg antall forbannelser som vil falle på hodet, i tilfelle du bruker standardbunten Freeradius с Google Authenticator, ble det besluttet å bruke modulkonfigurasjonen pam slik at bare tokenet kan kontrolleres Google Authenticator.

Når en bruker kobler til, skjer følgende:

  • Freeradius sjekker om brukeren er i domenet og i en bestemt gruppe og, hvis vellykket, sjekker OTP-tokenet.

Alt så bra nok ut til det øyeblikket jeg tenkte "Hvordan kan jeg registrere OTP for 300+ brukere?"

Brukeren må logge inn på serveren med Freeradius og fra kontoen din og start applikasjonen Googles autentisator, som vil generere en QR-kode for applikasjonen for brukeren. Det er her det kommer til unnsetning shellina boks i kombinasjon med .bash_profile.

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

Daemon-konfigurasjonsfilen er plassert på /etc/sysconfig/shellinabox.
Jeg spesifiserer port 443 der, og du kan spesifisere sertifikatet ditt.

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

Brukeren trenger bare å følge lenken, angi domenekreditt og motta en QR-kode for applikasjonen.

Algoritmen er som følger:

  • Brukeren logger på maskinen via en nettleser.
  • Om domenebrukeren er sjekket. Hvis ikke, blir det ikke gjort noe.
  • Hvis brukeren er en domenebruker, er medlemskap i Administrator-gruppen avkrysset.
  • Hvis ikke en administrator, sjekker den om Google Authenticator er konfigurert. Hvis ikke, genereres en QR-kode og brukeren logger ut.
  • Hvis ikke en administrator og Google Authenticator er konfigurert, er det bare å logge av.
  • Hvis du er administrator, sjekk Google Authenticator igjen. Hvis den ikke er konfigurert, genereres en QR-kode.

All logikk er gjort ved hjelp av /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

Fortigert oppsett:

  • Vi skaper Radius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Vi oppretter de nødvendige gruppene, om nødvendig, tilgangskontroll etter grupper. Gruppenavn på Heldig må samsvare med gruppen som sendes til Leverandørspesifikt attributt Fortinet-gruppenavn.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Redigering av nødvendig SSL-portaler.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Legger til grupper i retningslinjer.

    Freeradius + Google Authenticator + LDAP + Fortigate

Fordelene med denne løsningen:

  • Det er mulig å autentisere via OTP på Heldig åpen kildekode-løsning.
  • Brukeren skriver ikke inn et domenepassord ved tilkobling via VPN, noe som forenkler tilkoblingsprosessen. Det 6-sifrede passordet er enklere å angi enn det som er gitt av sikkerhetspolicyen. Som et resultat reduseres antall billetter med emnet: "Jeg kan ikke koble til VPN".

PS Vi planlegger å oppgradere denne løsningen til en fullverdig tofaktorautentisering med utfordringsrespons.

Oppdatering:

Som lovet oppgraderte jeg den til alternativet med utfordringssvar.
Så:
I fil /etc/raddb/sites-enabled/default seksjon autorisere er som følger:

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
}

Seksjon godkjenne ser nå slik ut:

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å er brukeren verifisert ved hjelp av følgende algoritme:

  • Brukeren legger inn domenekreditter i VPN-klienten.
  • Freeradius sjekker kontoens gyldighet og passord
  • Hvis passordet er riktig, sendes en forespørsel om et token.
  • Tokenet blir verifisert.
  • profitt).

Kilde: www.habr.com

Legg til en kommentar