Freeradius + Google Autheticator + LDAP + Fortigate

Çfarë të bëjmë nëse dy faktorët e autentikimit janë të nevojshëm, por nuk ka para për tokena harduerikë dhe përgjithësisht ofrohet që të mbështetesh dhe të kesh humor të mirë.

Ky zgjidhje nuk është asgjë superorigjinale, përkundrazi — një mix i zgjidhjeve të ndryshme të gjetura në hapësirat e internetit.

Pra, është dhënë

Domeni Active Directory.

Përdoruesit e domainit që punojnë përmes VPN-së, siç është rasti me shumë sot.

Si një portë VPN vepron Fortigate.

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

Politika Fortinet për tokenat e tyre nuk është aspak bujare — ka deri në 10 tokena falas, të tjerët me një çmim shumë të shtrenjtë. Nuk shqyrtova RSASecureID, Duo dhe të ngjashme, pasi dëshiroj burim të hapur.

Kërkesat paraprake: host *nix i instaluar freeradius, sssd — i futur në domain, përdoruesit e domainit mund të autentifikohen rehat.

Paketa shtesë: shellinabox, figlet, freeeradius-ldap, shkronja rebel.tlf nga repositori https://github.com/xero/figlet-fonts.

Në shembullin tim — CentOS 7.8.

Logjika e punës parashikohet të jetë kështu: kur lidhet me VPN, përdoruesi duhet të vendosë emrin e domainit dhe OTP-në në vend të fjalëkalimit.

Konfigurimi i shërbimeve

/etc/raddb/radiusd.conf ndryshohet vetëm përdoruesi dhe grupi, në emër të cilit fillon freeradius, pasi shërbimi radiusd duhet të jetë në gjendje të lexojë skedarët në të gjitha nën-direktoritë /home/.

përdoruesi = root
grupi = root

Për të mundësuar përdorimin e grupeve në cilësime Fortigate, nevojitet dërgimi i Vendor Specific Attribute. Për këtë, në direktorinë raddb/policy.d krijoj një skedar me përmbajtjen e mëposhtme:

grup_autorizimi {
    nëse (&LDAP-Group[*] == "CN=vpn_admins,OU=vpn-groups,DC=domain,DC=local") {
            përditëso përgjigjen {
                &Fortinet-Group-Name = "vpn_admins" }
            përditëso kontrollin {
                &Auth-Type := PAM
                &Reply-Message := "Mirë se erdhët Admin"
                }
        }
    ndryshe {
        përditëso përgjigjen {
        &Reply-Message := "Nuk jeni të autorizuar për vpn"
            }
        refuzo
        }
}

Pas instalimit freeradius-ldap në direktorinë raddb/mods-available krijohet një skedar ldap.

Duhet të krijoni një lidhje simbole në katalogun raddb/mods-enabled.

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

E përkthej 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ët raddb/sites-enabled/default dhe raddb/sites-enabled/inner-tunnel në seksionin autorizo duke shtuar emrin e politikës që do të përdoret — group_authorization. Një pikë e rëndësishme — emri i politikës përcaktohet nga direktiva brenda skedarit përpara kllapave gris. policy.d, dhe nga direktiva brenda skedarit përpara kllapave gris.
Në seksionin autentifikoj në këto skedarë duhet të çaktivizoni rreshtin pam.

Në skedar clients.conf vendosim parametrat me të cilët do të lidhet Fortigate:

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 paracaktuara për implementimin e lidhjes freeradius me google authenticator parashikojnë futjen nga ana e përdoruesit të të dhënave në formatin: emri/pasword+OTP.

Duke pasqyrën e numrit të mallkimeve që do të bien mbi kokën, në rastin e përdorimit të skemës standarde freeradius me Google Authenticator, u mor vendimi për të përdorur konfigurimin e modulit pam në mënyrë që të kontrollohet vetëm tokeni Google Authenticator.

Kur përdoruesi lidhet ndodhin këto:

  • Freeradius kontrollon nëse përdoruesi është në domen dhe në një grup të caktuar dhe, në rast suksesi, kryhet kontrolli i OTP tokenit.

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

Përdoruesi duhet të hyjë në server freeradius nën llogarinë e tij dhe të nisë aplikacionin Google authenticator, i cili do të gjenerojë për përdoruesin një kod QR për aplikacionin. Këtu vjen në ndihmë shellinabox në kombinim me .bash_profile.

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

Skedari i konfigurimit të demoni ndodhet në /etc/sysconfig/shellinabox.
Atje specifikoj portin 443 dhe mund të tregoj certifikatën time.

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

Përdoruesit i mbetet vetëm të hyjë në lidhje, të futë kredencialet e domenit dhe të marrë kodin QR për aplikacionin.

Algoritmi është si më poshtë:

  • Përdoruesi hyn në makinë përmes shfletuesit.
  • Kontrollohet nëse përdoruesi është domen. Nëse jo, nuk merren masa.
  • Nëse përdoruesi është domen, kontrollohet përfshirja në grupin e administratorëve.
  • Nëse nuk është admin, kontrollohet nëse është konfigurimi i Google Authenticator. Nëse jo, krijohet një kod QR dhe përdoruesi del jashtë.
  • Nëse nuk është admin dhe Google Authenticator është i konfigururar, thjesht del jashtë.
  • Nëse është admin, përsëri kontrollohet Google Authenticator. Nëse nuk është i konfigururar, krijohet një kod QR.

Të gjitha logjikat kryhen 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 Fortigate:

  • Krijojmë Radius-server

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Krijojmë grupet e nevojshme, në rast se është e nevojshme të ndahen qasje sipas grupeve. Emri i grupit në Fortigate duhet të përputhet me grupin që dërgohet në Vendor Specific Attribute Fortinet-Group-Name.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Redaktojmë portalet e nevojshme. SSLShtojmë grupet në politikat.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Pikat pozitive të këtij zgjidhjeje:

    Freeradius + Google Autheticator + LDAP + Fortigate

Ka mundësi autentifikimi me OTP në

  • zgjidhjen open source. Fortigate опенсорс решением.
  • Përdoruesi nuk ka nevojë të fusë fjalëkalimin e domain-it gjatë lidhjes përmes VPN, duke e thjeshtësuar kështu procesin e lidhjes. Është më e lehtë të futet një fjalëkalim 6-cifror sesa ai që parashikohet nga politika e sigurisë. Si pasojë, numri i biletave me temën: «Nuk mund të lidhem me VPN» është reduktuar.

P.S. Në planet është përmirësimi i kësaj zgjidhjeje në një autentifikim të plotë me dy faktorë me challenge-response.

Përditësim:

Siç premtova, e përmirësova në një opsion me challenge-response.
Pra:
Në skedar /etc/raddb/sites-enabled/default seksioni autorizo duket si më poshtë:

authorize {
    filter_username
    preprocess
    auth_log
    chap
    mschap
    suffix
    eap {
        ok = return
    }
    files
    -sql
    #-ldap
    expiration
    logintime
    if (!State) {
        if (&User-Password) {
            # Nëse !State dhe User-Password (PAP), atëherë detyro LDAP:
            update control {
                Ldap-UserDN := "%{User-Name}"
                Auth-Type := LDAP
            }
        }
        else {
            reject
        }
    }
    else {
        # Nëse State, atëherë kërkesë proxy:
        group_authorization
    }
pap
}

Sekcioni autentifikoj tani ka formën e mëposhtme:

autentiko {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        mschap
        digest
        # Provoni autentikimin me një lidhje të drejtpërdrejtë LDAP:
        Auth-Type LDAP {
        ldap
        if (ok) {
            update reply {
                # Krijo një atribut State rastësor:
                State := "%{randstr:aaaaaaaaaaaaaaaa}"
                Reply-Message := "Ju lutemi futni OTP"
                }
            # Kthe Access-Challenge:
            challenge
            }
        }
        pam
        eap
}

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

  • Përdoruesi përshkruan kredencialet e domainit në klientin VPN.
  • Freeradius verifikon vlefshmërinë e llogarisë dhe fjalëkalimin.
  • Nëse fjalëkalimi është i saktë, dërgohet një kërkesë për token.
  • Kryhet verifikimi i tokenit.
  • Profit).

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster