Freeradius + Google Authenticator + LDAP + Fortigate

Hvad nu hvis to-faktor autentificering er både ønskværdig og stikkende, men der ikke er penge til hardware-tokens og generelt tilbyder de at blive i godt humør.

Denne løsning er ikke noget super originalt, men derimod en blanding af forskellige løsninger fundet på internettet.

Så givet

Domænenavn Active Directory.

Domænebrugere, der arbejder gennem en VPN, som mange i dag.

Fungerer som en VPN-gateway FortiGate.

Det er forbudt at gemme adgangskoden til VPN-klienten i henhold til sikkerhedspolitikken.

Politik Fortinet i forhold til dine egne tokens, kan du ikke kalde det mindre end en zhlob - der er hele 10 gratis poletter, resten - til en meget ikke-kosher pris. Jeg overvejede ikke RSASecureID, Duo og lignende, fordi jeg vil have open source.

Forudsætninger: vært * nix med etablerede FreeRADIUS, ssd - indtastet i domænet, kan domænebrugere nemt autentificere på det.

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

I mit eksempel - CentOS 7.8.

Arbejdets logik formodes at være som følger: Når brugeren opretter forbindelse til en VPN, skal brugeren indtaste et domænelogin og OTP i stedet for en adgangskode.

Tjenester opsætning

В /etc/raddb/radiusd.conf kun brugeren og gruppen på vegne af starter FreeRADIUS, siden tjenesten radiusd skal kunne læse filer i alle undermapper /hjem/.

user = root
group = root

For at kunne bruge grupper i indstillinger FortiGate, skal sendes Leverandørspecifik egenskab. For at gøre dette, i mappen raddb/policy.d Jeg opretter en fil med følgende indhold:

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

Efter installationen freeradius-ldap i mappen raddb/mods-tilgængelig fil oprettes ldap.

Skal oprette et symbolsk link til mappen raddb/mods-aktiveret.

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

Jeg bringer dens indhold til denne form:

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 afsnit bemyndige Jeg tilføjer navnet på den politik, der skal bruges - group_authorization. Et vigtigt punkt - navnet på politikken er ikke bestemt af navnet på filen i mappen politik.d, men ved et direktiv inde i filen før de krøllede bøjler.
I afsnittet autentificere i de samme filer skal du fjerne kommentering af linjen pam.

I fil clients.conf foreskrive de parametre, som den vil forbinde med FortiGate:

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

Modulkonfiguration 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 bundtimplementeringsmuligheder FreeRADIUS с google autentificering kræve, at brugeren indtaster legitimationsoplysninger i formatet: brugernavn Kodeord+OTP.

Ved at forestille sig antallet af forbandelser, der vil falde på hovedet, i tilfælde af at bruge standardbundtet FreeRADIUS с Google Autentificering, blev det besluttet at bruge modulkonfigurationen pam så kun tokenet kan kontrolleres Google Autentificering.

Når en bruger opretter forbindelse, sker følgende:

  • Freeradius tjekker, om brugeren er i domænet og i en bestemt gruppe, og, hvis det lykkes, tjekker OTP-tokenet.

Alt så godt nok ud indtil det øjeblik, hvor jeg tænkte "Hvordan kan jeg registrere OTP for 300+ brugere?"

Brugeren skal logge ind på serveren med FreeRADIUS og fra under din konto og kør applikationen Googles autentificering, som vil generere en QR-kode til applikationen til brugeren. Det er her, hjælpen kommer ind. shellina boks i kombination med .bash_profile.

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

Dæmon-konfigurationsfilen er placeret på /etc/sysconfig/shellinabox.
Jeg angiver port 443 der, og du kan angive dit certifikat.

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

Brugeren behøver kun at følge linket, indtaste domænekreditter og modtage en QR-kode til applikationen.

Algoritmen er følgende:

  • Brugeren logger ind på maskinen via en browser.
  • Om domænebrugeren er markeret. Hvis ikke, bliver der ikke foretaget noget.
  • Hvis brugeren er en domænebruger, er medlemskab i gruppen Administratorer markeret.
  • Hvis den ikke er administrator, tjekker den, om Google Authenticator er konfigureret. Hvis ikke, så genereres en QR-kode og brugerlogout.
  • Hvis ikke en administrator og Google Authenticator er konfigureret, skal du bare logge ud.
  • Hvis du er administrator, så tjek Google Authenticator igen. Hvis den ikke er konfigureret, genereres en QR-kode.

Al logik er udført vha /etc/skel/.bash_profile.

kat /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 opsætning:

  • Vi skaber Radius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Vi opretter de nødvendige grupper, om nødvendigt adgangskontrol efter grupper. Gruppenavn på FortiGate skal matche den gruppe, der sendes ind Leverandørspecifik egenskab Fortinet-Gruppe-navn.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Redigering af det nødvendige SSL-portaler.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Tilføjelse af grupper til politikker.

    Freeradius + Google Authenticator + LDAP + Fortigate

Fordelene ved denne løsning:

  • Det er muligt at godkende ved OTP på FortiGate open source løsning.
  • Brugeren indtaster ikke et domæneadgangskode ved tilslutning via VPN, hvilket forenkler forbindelsesprocessen noget. Den 6-cifrede adgangskode er nemmere at indtaste end den, der er angivet i sikkerhedspolitikken. Som et resultat falder antallet af billetter med emnet: "Jeg kan ikke oprette forbindelse til VPN".

PS Vi planlægger at opgradere denne løsning til en fuldgyldig to-faktor-godkendelse med udfordring-respons.

Update:

Som lovet tilpassede jeg det til udfordring-svar-indstillingen.
So:
I fil /etc/raddb/sites-enabled/default afsnit bemyndige 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
}

Afsnit autentificere ser nu sådan ud:

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 sker brugerbekræftelse i henhold til følgende algoritme:

  • Brugeren indtaster domænekreditter i VPN-klienten.
  • Freeradius kontrollerer gyldigheden af ​​kontoen og adgangskoden
  • Hvis adgangskoden er korrekt, sendes en anmodning om et token.
  • Tokenet er ved at blive verificeret.
  • profit).

Kilde: www.habr.com

Tilføj en kommentar