Freeradius + Google Authenticator + LDAP + Fortigate

Čo ak je dvojfaktorová autentifikácia žiaduca aj pichľavá, no nie sú peniaze na hardvérové ​​tokeny a vo všeobecnosti ponúkajú dobrú náladu.

Toto riešenie nie je niečo super originálne, ale skôr mix rôznych riešení nájdených na internete.

Tak dané

Домен Active Directory.

Používatelia domény pracujúci prostredníctvom VPN, ako mnohí dnes.

Funguje ako brána VPN Fortigate.

Bezpečnostná politika zakazuje ukladanie hesla pre klienta VPN.

politika Fortinet v súvislosti s vašimi vlastnými tokenmi to nemôžete nazvať menej ako zhlob - existuje až 10 bezplatných tokenov, zvyšok - za veľmi nekóšer cenu. Neuvažoval som nad RSASecureID, Duo a podobne, pretože chcem open source.

Predpoklady: hostiteľ * nix so zavedeným freeradius, ssd - zadané do domény, používatelia domény sa na nej môžu jednoducho autentifikovať.

Dodatočné balíčky: škatuľka shellina, fígeľ, freeradius-ldap, písmo rebel.tlf z úložiska https://github.com/xero/figlet-fonts.

V mojom príklade - CentOS 7.8.

Logika práce má byť nasledovná: pri pripájaní k VPN musí používateľ namiesto hesla zadať prihlasovacie meno domény a OTP.

Nastavenie služieb

В /etc/raddb/radiusd.conf iba používateľ a skupina, v mene ktorej začína freeradius, od služby polomer by mal byť schopný čítať súbory vo všetkých podadresároch /Domov/.

user = root
group = root

Aby ste mohli používať skupiny v nastaveniach Fortigate, musí byť prenesená Špecifický atribút dodávateľa. Ak to chcete urobiť, v adresári raddb/policy.d Vytvorím súbor s nasledujúcim obsahom:

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 inštalácii freeradius-ldap v adresári raddb/mods-dostupné súbor je vytvorený ldap.

Je potrebné vytvoriť symbolický odkaz na adresár povolený raddb/mods.

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

Jeho obsah prinášam do tohto formulára:

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 súboroch raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel v sekcii povoliť Pridávam názov politiky, ktorá sa má použiť - group_authorization. Dôležitý bod - názov politiky nie je určený názvom súboru v adresári politika.d, ale direktívou vo vnútri súboru pred zloženými zátvorkami.
V sekcii overiť v rovnakých súboroch musíte odkomentovať riadok pam.

V súbore klienti.conf predpísať parametre, s ktorými sa bude spájať Fortigate:

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

Konfigurácia 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

Predvolené možnosti implementácie balíka freeradius с autentifikátor Google vyžadovať, aby používateľ zadal prihlasovacie údaje vo formáte: užívateľské meno/heslo+OTP.

Predstavením si množstva kliatieb, ktoré padnú na hlavu, v prípade použitia predvoleného zväzku freeradius с Google Authenticator, bolo rozhodnuté použiť konfiguráciu modulu pam aby bolo možné skontrolovať iba token Google Authenticator.

Keď sa používateľ pripojí, stane sa toto:

  • Freeradius skontroluje, či je používateľ v doméne a v určitej skupine a v prípade úspechu skontroluje OTP token.

Všetko vyzeralo dosť dobre až do momentu, keď som si pomyslel: „Ako môžem zaregistrovať jednorazové heslo pre viac ako 300 používateľov?

Používateľ sa musí prihlásiť na server pomocou freeradius a zo svojho účtu a spustite aplikáciu Google autentifikátor, ktorý používateľovi vygeneruje QR kód aplikácie. Tu prichádza na rad pomoc. škatuľka shellina v kombinácii s .bash_profile.

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

Konfiguračný súbor démona sa nachádza na adrese /etc/sysconfig/shellinabox.
Uvádzam tam port 443 a môžete zadať svoj certifikát.

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

Používateľovi stačí nasledovať odkaz, zadať kredity domény a získať QR kód pre aplikáciu.

Algoritmus je nasledujúci:

  • Používateľ sa prihlási do stroja cez prehliadač.
  • Či je začiarknutý používateľ domény. Ak nie, nepodniknú sa žiadne kroky.
  • Ak je používateľ doménovým používateľom, je začiarknuté členstvo v skupine Administrators.
  • Ak nie je správcom, skontroluje, či je Google Authenticator nakonfigurovaný. Ak nie, vygeneruje sa QR kód a odhlásenie používateľa.
  • Ak nemáte správcu a je nakonfigurovaný Google Authenticator, stačí sa odhlásiť.
  • Ak ste správcom, znova skontrolujte aplikáciu Google Authenticator. Ak nie je nakonfigurovaný, vygeneruje sa QR kód.

Celá logika sa vykonáva pomocou /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

Posilňujúce nastavenie:

  • tvoríme Polomer-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Vytvárame potrebné skupiny, v prípade potreby riadenie prístupu podľa skupín. Názov skupiny je zapnutý Fortigate musí zodpovedať skupine, do ktorej je odovzdaná Špecifický atribút dodávateľa Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Úprava potrebného SSL- portály.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Pridávanie skupín do politík.

    Freeradius + Google Authenticator + LDAP + Fortigate

Výhody tohto riešenia:

  • Autentifikácia pomocou OTP je možná zapnutá Fortigate open source riešenie.
  • Používateľ pri pripájaní cez VPN nezadáva heslo domény, čo trochu zjednodušuje proces pripojenia. 6-miestne heslo sa zadáva jednoduchšie ako heslo, ktoré poskytuje bezpečnostná politika. V dôsledku toho klesá počet lístkov s predmetom: „Nemôžem sa pripojiť k VPN“.

PS Plánujeme upgradovať toto riešenie na plnohodnotnú dvojfaktorovú autentifikáciu s výzvou-odpoveď.

Update:

Ako som sľúbil, vylepšil som to na možnosť výzva-reakcia.
Takže:
V súbore /etc/raddb/sites-enabled/default oddiele povoliť je nasledovné:

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
}

časť overiť teraz to vyzerá 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
}

Teraz sa overenie používateľa uskutoční podľa nasledujúceho algoritmu:

  • Používateľ zadá kredity domény v klientovi VPN.
  • Freeradius kontroluje platnosť účtu a hesla
  • Ak je heslo správne, odošle sa žiadosť o token.
  • Token sa overuje.
  • zisk).

Zdroj: hab.com

Pridať komentár