Freeradius + Google Authenticator + LDAP + Fortigate

Po sikur vërtetimi me dy faktorë të jetë i dëshirueshëm dhe me gjemba, por nuk ka para për argumentet e harduerit dhe në përgjithësi ato ofrojnë të qëndrojnë në humor të mirë.

Kjo zgjidhje nuk është diçka super origjinale, por më tepër një përzierje e zgjidhjeve të ndryshme që gjenden në internet.

Kështu e dhënë

Домен Active Directory.

Përdoruesit e domenit që punojnë përmes një VPN, si shumë sot.

Vepron si një portë VPN Fortigati.

Ruajtja e fjalëkalimit për klientin VPN është e ndaluar nga politika e sigurisë.

Politika Fortinet në lidhje me argumentet tuaja, nuk mund ta quani më pak se një zhlob - ka deri në 10 argumente falas, pjesa tjetër - me një çmim shumë jo-kosher. Unë nuk e konsiderova RSASecureID, Duo dhe të ngjashme, sepse dua burim të hapur.

Kushtet paraprake: mikpritës * nix me themeluar rreze e lirë, ssd - të futura në domen, përdoruesit e domenit mund të vërtetojnë lehtësisht në të.

Paketa shtesë: kuti shellina, fileto, freeradius-ldap, font rebel.tlf nga depoja https://github.com/xero/figlet-fonts.

Në shembullin tim - CentOS 7.8.

Logjika e punës supozohet të jetë si më poshtë: kur lidhet me një VPN, përdoruesi duhet të vendosë një hyrje në domen dhe OTP në vend të një fjalëkalimi.

Konfigurimi i shërbimeve

В /etc/raddb/radiusd.conf vetëm përdoruesi dhe grupi në emër të të cilit fillon rreze e lirë, që nga shërbimi radiusd duhet të jetë në gjendje të lexojë skedarë në të gjitha nëndrejtoritë / Home /.

user = root
group = root

Për të qenë në gjendje të përdorni grupet në cilësimet Fortigati, duhet të transmetohet Atributi specifik i shitësit. Për ta bërë këtë, në drejtori raddb/policy.d Unë krijoj një skedar me përmbajtjen e mëposhtme:

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

Pas instalimit freeradius-ldap në drejtori raddb/mods-disponohet skedari është krijuar ldap.

Duhet të krijohet një lidhje simbolike në drejtori raddb/mods-aktivizuar.

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

Unë e sjell përmbajtjen e tij në këtë 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'
        }
}

Në skedarë raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel në seksion Autorizoj Shtoj emrin e politikës që do të përdoret - group_autorization. Një pikë e rëndësishme - emri i politikës nuk përcaktohet nga emri i skedarit në drejtori politika.d, por nga një direktivë brenda skedarit përpara kllapave kaçurrelë.
Në seksionin vërtetoj në të njëjtat skedarë duhet të çkomentoni rreshtin Pam.

Në dosje klientët.conf përshkruani parametrat me të cilët do të lidhet Fortigati:

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

Konfigurimi i modulit 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

Opsionet e parazgjedhura të zbatimit të paketës rreze e lirë с autentifikues google kërkojnë që përdoruesi të fusë kredencialet në formatin: Fjalekalimi i perdoruesit+OTP.

Duke imagjinuar numrin e mallkimeve që do të bien mbi kokë, në rastin e përdorimit të paketës së paracaktuar rreze e lirë с Autentifikuesi i Google, u vendos që të përdoret konfigurimi i modulit Pam në mënyrë që të mund të kontrollohet vetëm token Autentifikuesi i Google.

Kur një përdorues lidhet, ndodh si më poshtë:

  • Freeradius kontrollon nëse përdoruesi është në domen dhe në një grup të caktuar dhe, nëse është i suksesshëm, kontrollon tokenin OTP.

Gjithçka dukej mjaft mirë deri në momentin kur mendova "Si mund të regjistroj OTP për 300+ përdorues?"

Përdoruesi duhet të identifikohet në server me rreze e lirë dhe nga nën llogarinë tuaj dhe ekzekutoni aplikacionin Vërtetuesi i Google, i cili do të gjenerojë një kod QR për aplikacionin për përdoruesin. Këtu vjen ndihma. kuti shellina në kombinim me .bash_profili.

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

Skedari i konfigurimit të demonit ndodhet në /etc/sysconfig/shellinabox.
Unë specifikoj portin 443 atje dhe ju mund të specifikoni certifikatën tuaj.

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

Përdoruesi duhet vetëm të ndjekë lidhjen, të fusë kreditet e domenit dhe të marrë një kod QR për aplikacionin.

Algoritmi është si më poshtë:

  • Përdoruesi hyn në makinë përmes një shfletuesi.
  • Nëse përdoruesi i domenit është i kontrolluar. Nëse jo, atëherë nuk ndërmerret asnjë veprim.
  • Nëse përdoruesi është përdorues domeni, kontrollohet anëtarësimi në grupin e Administratorëve.
  • Nëse nuk është një administrator, ai kontrollon nëse Google Authenticator është konfiguruar. Nëse jo, atëherë krijohet një kod QR dhe një dalje e përdoruesit.
  • Nëse nuk është një administrator dhe Google Authenticator është konfiguruar, atëherë thjesht dilni.
  • Nëse administratori, atëherë kontrolloni përsëri Google Authenticator. Nëse nuk konfigurohet, krijohet një kod QR.

E gjithë logjika bëhet duke përdorur /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

Konfigurimi i Fortigate:

  • Ne krijojmë rreze-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Ne krijojmë grupet e nevojshme, nëse është e nevojshme, kontrollin e aksesit sipas grupeve. Emri i grupit është aktiv Fortigati duhet të përputhet me grupin që kalohet Atributi specifik i shitësit Fortinet-Grupi-Emri.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Redaktimi i të nevojshmeve SSL-portale.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Shtimi i grupeve në politika.

    Freeradius + Google Authenticator + LDAP + Fortigate

Përparësitë e kësaj zgjidhjeje:

  • Është e mundur që të vërtetohet duke aktivizuar OTP Fortigati zgjidhje me burim të hapur.
  • Përdoruesi nuk fut një fjalëkalim domeni kur lidhet me VPN, gjë që thjeshton disi procesin e lidhjes. Fjalëkalimi 6-shifror është më i lehtë për t'u futur sesa ai i parashikuar nga politika e sigurisë. Si rezultat, numri i biletave me temën: "Nuk mund të lidhem me VPN" zvogëlohet.

PS Ne planifikojmë ta përmirësojmë këtë zgjidhje në një vërtetim të plotë me dy faktorë me përgjigje sfiduese.

Update:

Siç u premtova, e ndryshova atë në opsionin sfidë-përgjigje.
Pra:
Në dosje /etc/raddb/sites-enabled/default seksioni Autorizoj duket si kjo:

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
}

Seksioni vërtetoj tani duket kështu:

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
}

Tani verifikimi i përdoruesit ndodh sipas algoritmit të mëposhtëm:

  • Përdoruesi fut kreditë e domenit në klientin VPN.
  • Freeradius kontrollon vlefshmërinë e llogarisë dhe fjalëkalimin
  • Nëse fjalëkalimi është i saktë, atëherë dërgohet një kërkesë për një shenjë.
  • Shenja është duke u verifikuar.
  • fitimi).

Burimi: www.habr.com

Shto një koment