Freeradius + Google Authenticator + LDAP + Fortigate

Wat als tweefactorauthenticatie zowel wenselijk als prikkelbaar is, maar er geen geld is voor hardwaretokens en ze in het algemeen aanbieden om in een goed humeur te blijven.

Deze oplossing is niet iets superorigineels, maar eerder een mix van verschillende oplossingen die op internet te vinden zijn.

Zo gegeven

domein Active Directory.

Domeingebruikers die via een VPN werken, zoals velen tegenwoordig.

Fungeert als een VPN-gateway versterken.

Het opslaan van het wachtwoord voor de VPN-client is verboden door het beveiligingsbeleid.

Politiek Fortinet met betrekking tot je eigen tokens kun je het niet minder dan een zhlob noemen - er zijn maar liefst 10 gratis tokens, de rest - tegen een zeer niet-koosjere prijs. Ik heb RSASecureID, Duo en dergelijke niet overwogen, omdat ik open source wil.

Vereisten: gastheer * nix met vastgesteld FreeRADIUS, ssd - ingevoerd in het domein, domeingebruikers kunnen zich er eenvoudig op authenticeren.

Aanvullende pakketten: shellina doos, figletje, freeradius-ldap, lettertype rebel.tlf uit het archief https://github.com/xero/figlet-fonts.

In mijn voorbeeld - CentOS 7.8.

De logica van het werk zou als volgt moeten zijn: bij het verbinden met een VPN moet de gebruiker een domeinlogin en OTP invoeren in plaats van een wachtwoord.

Diensten instellen

В /etc/raddb/radiusd.conf alleen de gebruiker en groep namens wie start FreeRADIUS, sinds de dienst radius zou bestanden in alle submappen moeten kunnen lezen /huis/.

user = root
group = root

Groepen kunnen gebruiken in instellingen versterken, moet worden doorgegeven Leveranciersspecifiek kenmerk. Om dit te doen, in de directory raddb/beleid.d Ik maak een bestand aan met de volgende inhoud:

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

Na installatie freeradius-ldap in de map raddb/mods-beschikbaar bestand wordt aangemaakt ldap.

Noodzaak om een ​​symbolische link naar de directory te maken raddb/mods ingeschakeld.

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

Ik breng de inhoud ervan naar deze vorm:

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

In bestanden raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel in sectie toestemming geven Ik voeg de naam toe van het te gebruiken beleid - group_authorization. Een belangrijk punt - de naam van het beleid wordt niet bepaald door de naam van het bestand in de map beleid.d, maar door een richtlijn in het bestand vóór de accolades.
In de sectie waarmerken in dezelfde bestanden moet u de regel ongedaan maken pam.

In bestand klanten.conf de parameters voorschrijven waarmee het verbinding zal maken versterken:

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

Moduleconfiguratie pam.d/straal:

#%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

Standaard opties voor bundelimplementatie FreeRADIUS с google authenticator vereisen dat de gebruiker inloggegevens invoert in de indeling: gebruikersnaam wachtwoord+OTP.

Door je het aantal vloeken voor te stellen dat op het hoofd zal vallen, in het geval van het gebruik van de standaardbundel FreeRADIUS с Google Authenticator, werd besloten om de moduleconfiguratie te gebruiken pam zodat alleen het token kan worden gecontroleerd Google Authenticator.

Wanneer een gebruiker verbinding maakt, gebeurt het volgende:

  • Freeradius controleert of de gebruiker zich in het domein en in een bepaalde groep bevindt en, indien succesvol, het OTP-token.

Alles zag er goed uit tot het moment dat ik dacht "Hoe kan ik OTP registreren voor 300+ gebruikers?"

De gebruiker moet inloggen op de server met FreeRADIUS en van onder uw account en voer de applicatie uit Google authenticator, die een QR-code voor de applicatie voor de gebruiker zal genereren. Dit is waar hulp binnenkomt. shellina doos in combinatie met .bash_profiel.

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

Het daemon-configuratiebestand bevindt zich op /etc/sysconfig/shellinabox.
Ik specificeer daar poort 443 en u kunt uw certificaat specificeren.

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

De gebruiker hoeft alleen de link te volgen, domeincredits in te voeren en een QR-code te ontvangen voor de toepassing.

Het algoritme is als volgt:

  • De gebruiker logt via een browser in op de machine.
  • Of de domeingebruiker is aangevinkt. Zo niet, dan wordt er geen actie ondernomen.
  • Als de gebruiker een domeingebruiker is, is het lidmaatschap van de groep Administrators aangevinkt.
  • Als het geen beheerder is, controleert het of Google Authenticator is geconfigureerd. Zo niet, dan wordt een QR-code gegenereerd en logt de gebruiker uit.
  • Als er geen beheerder en Google Authenticator is geconfigureerd, logt u gewoon uit.
  • Als beheerder, vink dan Google Authenticator opnieuw aan. Indien niet geconfigureerd, wordt een QR-code gegenereerd.

Alle logica wordt gedaan met behulp van /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-opstelling:

  • We creëren Straal-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • We maken de nodige groepen aan, eventueel toegangscontrole per groep. Groepsnaam op versterken moet overeenkomen met de groep die wordt doorgegeven Leveranciersspecifiek kenmerk Fortinet-groepsnaam.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Het nodige bewerken SSL-portalen.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Groepen toevoegen aan beleid.

    Freeradius + Google Authenticator + LDAP + Fortigate

De voordelen van deze oplossing:

  • Het is mogelijk om via OTP te authenticeren versterken open source-oplossing.
  • De gebruiker voert geen domeinwachtwoord in bij het verbinden via VPN, wat het verbindingsproces enigszins vereenvoudigt. Het 6-cijferige wachtwoord is gemakkelijker in te voeren dan het wachtwoord dat wordt verstrekt door het beveiligingsbeleid. Hierdoor neemt het aantal tickets met als onderwerp: “Ik kan geen verbinding maken met de VPN” af.

PS We zijn van plan deze oplossing te upgraden naar een volwaardige tweefactorauthenticatie met challenge-response.

update:

Zoals beloofd, heb ik het aangepast naar de uitdaging-antwoordoptie.
Dus:
In bestand /etc/raddb/sites-enabled/default sectie toestemming geven ziet er zo uit:

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
}

Секция waarmerken ziet er nu zo uit:

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
}

Nu vindt gebruikersverificatie plaats volgens het volgende algoritme:

  • De gebruiker voert domeincredits in de VPN-client in.
  • Freeradius controleert de geldigheid van het account en wachtwoord
  • Als het wachtwoord correct is, wordt er een verzoek om een ​​token verzonden.
  • Het token wordt geverifieerd.
  • winst).

Bron: www.habr.com

Voeg een reactie