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

Në /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 zgjidhje me kod burim tĂ« hapur.
  • 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

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster