Freeradius + Google Authenticator + LDAP + Fortigate

Co když je dvoufaktorová autentizace žádoucí i pichlavá, ale na hardwarové tokeny nejsou peníze a obecně nabízejí udržení dobré nálady.

Toto řešení není něco super originálního, ale spíše mix různých řešení nalezených na internetu.

Tak daný

Domén Active Directory.

Uživatelé domény pracující přes VPN, jako mnozí dnes.

Funguje jako brána VPN Opevnit se.

Uložení hesla pro klienta VPN je zakázáno zásadami zabezpečení.

Politika Fortinet ve vztahu k vašim vlastním tokenům to nemůžete nazvat méně než zhlob – existuje až 10 bezplatných tokenů, zbytek – za velmi nekošer cenu. Neuvažoval jsem o RSASecureID, Duo a podobně, protože chci open source.

Předpoklady: host * nix se zavedenými freeradius, ssd - zadáno do domény, uživatelé domény se na ní mohou snadno autentizovat.

Další balíčky: Shellina box, fílek, freeradius-ldap, písmo rebel.tlf z úložiště https://github.com/xero/figlet-fonts.

V mém příkladu - CentOS 7.8.

Logika práce má být následující: při připojení k VPN musí uživatel místo hesla zadat doménové přihlášení a OTP.

Nastavení služeb

В /etc/raddb/radiusd.conf pouze uživatel a skupina, jejichž jménem začíná freeradius, od služby rádiusd by měl být schopen číst soubory ve všech podadresářích /Domov/.

user = root
group = root

Aby bylo možné používat skupiny v nastavení Opevnit se, musí být přenášeny Specifický atribut dodavatele. Chcete-li to provést, v adresáři raddb/policy.d Vytvořím soubor s následujícím obsahem:

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

Po instalaci freeradius-ldap v adresáři raddb/mods-dostupné soubor je vytvořen LDAP.

Je třeba vytvořit symbolický odkaz na adresář povoleno raddb/mods.

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

Jeho obsah přináším do tohoto formuláře:

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

V souborech raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel v sekci povolit Přidám název zásady, která se má použít - group_authorization. Důležitý bod - název zásady není určen názvem souboru v adresáři politika.d, ale direktivou uvnitř souboru před složenými závorkami.
V sekci ověřit ve stejných souborech musíte odkomentovat řádek pam.

V souboru client.conf předepsat parametry, se kterými se bude spojovat Opevnit se:

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

Konfigurace modulu 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

Výchozí možnosti implementace balíčku freeradius с google authenticator vyžadovat, aby uživatel zadal přihlašovací údaje ve formátu: uživatelské jméno heslo+OTP.

Představením si počtu kleteb, které padnou na hlavu, v případě použití výchozího svazku freeradius с Google Authenticator, bylo rozhodnuto použít konfiguraci modulu pam aby bylo možné zkontrolovat pouze token Google Authenticator.

Když se uživatel připojí, dojde k následujícímu:

  • Freeradius zkontroluje, zda uživatel existuje v doméně a v určité skupině a v případě úspěchu zkontroluje OTP token.

Všechno vypadalo dost dobře až do okamžiku, kdy jsem si pomyslel: „Jak mohu zaregistrovat OTP pro 300+ uživatelů?

Uživatel se musí přihlásit k serveru pomocí freeradius a z vašeho účtu a spusťte aplikaci Google autentizátor, který uživateli vygeneruje QR kód aplikace. Zde přichází na řadu pomoc. Shellina box v kombinaci s .bash_profile.

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

Konfigurační soubor démona se nachází na adrese /etc/sysconfig/shellinabox.
Uvádím tam port 443 a můžete zadat svůj certifikát.

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

Uživateli stačí následovat odkaz, zadat kredity domény a získat QR kód pro aplikaci.

Algoritmus je následující:

  • Uživatel se přihlásí do stroje prostřednictvím prohlížeče.
  • Zda je zaškrtnutý uživatel domény. Pokud ne, neprovede se žádná akce.
  • Pokud je uživatel doménovým uživatelem, je zaškrtnuto členství ve skupině Administrators.
  • Pokud se nejedná o správce, zkontroluje, zda je Google Authenticator nakonfigurován. Pokud ne, vygeneruje se QR kód a odhlášení uživatele.
  • Pokud nemáte správce a je nakonfigurován Google Authenticator, stačí se odhlásit.
  • Pokud jste správcem, zkontrolujte znovu Google Authenticator. Pokud není nakonfigurován, vygeneruje se QR kód.

Veškerá logika se provádí pomocí /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

Posílené nastavení:

  • tvoříme Poloměr-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Vytvoříme potřebné skupiny, v případě potřeby řízení přístupu po skupinách. Název skupiny zapnut Opevnit se musí odpovídat skupině, která je předána Specifický atribut dodavatele Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Úprava potřebného SSL- portály.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Přidávání skupin do zásad.

    Freeradius + Google Authenticator + LDAP + Fortigate

Výhody tohoto řešení:

  • Je možné autentizovat pomocí OTP na Opevnit se open source řešení.
  • Uživatel při připojení přes VPN nezadává heslo domény, což poněkud zjednodušuje proces připojení. Zadání 6místného hesla je snazší než to, které poskytuje bezpečnostní politika. V důsledku toho klesá počet lístků s předmětem: „Nemohu se připojit k VPN“.

PS Plánujeme upgradovat toto řešení na plnohodnotnou dvoufaktorovou autentizaci s výzvou-odpověď.

aktualizace:

Jak jsem slíbil, vylepšil jsem to na možnost výzva-odpověď.
Takže:
V souboru /etc/raddb/sites-enabled/default sekce povolit je následující:

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
}

část ověřit teď to vypadá takto:

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
}

Nyní proběhne ověření uživatele podle následujícího algoritmu:

  • Uživatel zadá kredity domény v klientovi VPN.
  • Freeradius kontroluje platnost účtu a hesla
  • Pokud je heslo správné, je odeslána žádost o token.
  • Token se ověřuje.
  • zisk).

Zdroj: www.habr.com

Přidat komentář