Freeradius + Google Authenticator + LDAP + Fortigate

Ger hûn erêkirina du-faktorî dixwazin û dudil in, hûn çi bikin, lê ji bo nîşaneyên hardware drav tune û bi gelemperî ew pêşniyar dikin ku meriv li ser hestek baş bisekinin.

Ev çareserî ne tiştek super orjînal e, lê ji bilî tevliheviyek çareseriyên cihêreng ên ku li ser Înternetê têne dîtin.

Ji ber vê yekê dayîn

Dîrok Dîra Active Active.

Bikarhênerên domainê bi VPN-ê dixebitin, mîna gelek îro.

VPN wekî dergehek tevdigere Fortigate.

Tomarkirina şîfreya ji bo xerîdar VPN ji hêla polîtîkaya ewlehiyê ve qedexe ye.

Sîyaset Fortinet li gorî nîşaneyên xwe, hûn nekarin jê re ji redneck kêmtir bibêjin - bi qasî 10 yekîneyên nîşaneyên belaş hene, yên mayî bi bihayek pir ne-koşer in. Min RSASecureID, Duo û yên wekî wan nedît, ji ber ku ez çavkaniyek vekirî dixwazim.

Pêwîst: mazûban * nix bi damezrandin freeradius, ssd - ketin nav domainê, bikarhênerên domainê dikarin bi hêsanî li ser wê rast bikin.

Pakêtên zêde: box shellina, hêjîr, freeradius-ldap, font serhildêr.tlf ji depoyê https://github.com/xero/figlet-fonts.

Di mînaka min de, CentOS 7.8.

Mantiqa xebitandinê wiha ye: dema ku bi VPN ve tê girêdan, divê bikarhêner li şûna şîfreyek têketinek domainê û OTP binivîse.

Sazkirina xizmetên

В /etc/raddb/radiusd.conf tenê bikarhêner û koma ku bi navê wan dest pê dike diguhere freeradius, ji ber ku xizmetê radiusd divê karibe pelan di hemî binerdekrêtan de bixwîne /xane/.

user = root
group = root

Ji bo ku hûn di mîhengan de koman bikar bînin Fortigate, pêdivî ye ku were veguheztin Taybetmendiya Taybet a Vendor. Ji bo vê yekê, di pelrêça raddb/polîtîka.d Ez pelek bi naveroka jêrîn diafirînim:

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

Piştî sazkirinê freeradius-ldap di pelrêça raddb / mods-berdest pel tê çêkirin ldap.

Pêdivî ye ku hûn ji pelrêçê re girêdanek sembolîk biafirînin raddb / mods-çalak.

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

Ez naveroka wê bi vê formê bînim ziman:

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

Di pelan de raddb/sites-çalakkirin/default и raddb / sites-enabled / hundir-tunel di beşa ercdan Ez navê polîtîkaya ku dê were bikar anîn zêde dikim - group_autorization. Xalek girîng - navê polîtîkayê bi navê pelê di pelrêçê de nayê destnîşankirin polîtîka.d, lê bi dîrektîfek di hundurê pelê de berî kulîlkên kulîlk.
Di beşa tesdîqkirin di heman pelan de hûn hewce ne ku rêzê şîrove bikin pam.

Di pelê de xerîdar.conf Parametreyên ku ew ê pê ve girêbide destnîşan bike Fortigate:

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

Veavakirina Module 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

Vebijarkên xwerû yên ji bo pêkanîna pakêtê freeradius с nirxandin google ji bikarhêner hewce dike ku pêbaweriyên di formatê de binivîse: navê bikarhêner / şîfre+OTP.

Heke hûn kopula xwerû bikar bînin, hejmara nifirên ku dê bi serê we de bikevin bifikirin freeradius с Google Authenticator, biryar hate girtin ku veavakirina modulê bikar bînin pam da ku tenê token dikare were kontrol kirin Google Authenticator.

Dema ku bikarhênerek tê girêdan, jêrîn diqewime:

  • Freeradius kontrol dike ka bikarhêner di domanê de û di komekê de heye û, heke serketî be, token OTP tê kontrol kirin.

Her tişt têra xwe baş xuya dikir heya dema ku min fikirîn "Ez çawa dikarim OTP ji 300+ bikarhêneran re tomar bikim?"

Bikarhêner divê bi serverê re têkeve freeradius û ji binê hesabê xwe û serîlêdanê bimeşînin google authenticator, ku dê kodek QR-ê ji bo serîlêdanê ji bo bikarhêner çêbikin. Ev e ku ew ji bo rizgariyê tê box shellina bi kombînasyona bi .bash_profile.

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

Pelê veavakirina daemon tê de ye /etc/sysconfig/shellinabox.
Ez li wir porta 443 diyar dikim û hûn dikarin sertîfîkaya xwe diyar bikin.

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

Bikarhêner tenê pêdivî ye ku zencîreyê bişopîne, krediyên domainê bike û ji bo serîlêdanê kodek QR bistîne.

Algorîtmaya jêrîn ev e:

  • Bikarhêner bi rêya gerokekê têkeve makîneyê.
  • Ma bikarhêner bikarhênerek domainê ye, tê kontrol kirin. Ger ne wisa be, wê gavê gav nayê avêtin.
  • Ger bikarhêner bikarhênerek domainê be, endamtiya di koma rêveberan de tê kontrol kirin.
  • Ger ne rêveberek be, ew kontrol dike ka Google Authenticator hatî mîheng kirin. Heke ne, wê hingê kodek QR û derketina bikarhêner tê çêkirin.
  • Ger ne rêveberek û Google Authenticator were mîheng kirin, wê hingê tenê jê derkeve.
  • Ger rêvebir, wê hingê dîsa Google Authenticator kontrol bikin. Heke neyê mîheng kirin, kodek QR tê çêkirin.

Hemî mantiq bi kar tê kirin /etc/skel/.bash_profile.

pisîk /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

Sazkirina Fortigate:

  • Em diafirînin Çap-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Em komên pêwîst diafirînin, ger hewce be ku gihîştina bi komê ji hev cuda bikin. Navê komê li ser Fortigate divê koma ku jê re tê şandin li hev bikin Taybetmendiya Taybet a Vendor Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Guherandinên pêwîst SSL-portal.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Koman li polîtîkayan zêde dikin.

    Freeradius + Google Authenticator + LDAP + Fortigate

Avantajên vê çareseriyê:

  • Li ser OTP-ê verastkirin gengaz e Fortigate çareseriya çavkaniya vekirî.
  • Bikarhêner ne hewce ye ku şîfreyek domainê têkeve dema ku bi VPN ve tê girêdan, ku hinekî pêvajoya girêdanê hêsan dike. Şîfreya 6-hejmarî ji ya ku ji hêla polîtîkaya ewlehiyê ve hatî peyda kirin hêsantir e. Di encamê de, hejmara bilêtên bi mijara: "Ez nikarim bi VPN-ê ve girêbidim" kêm dibe.

PS Plan hene ku vê çareseriyê bi erêkirina du-faktorî ya bi dijwarî-bersiv re nûve bikin.

update:

Wekî ku soz dabû, min ew li ser vebijarka dijwar-bersivê tweak kir.
Ji ber vê yekê
Di pelê de /etc/raddb/sites-enabled/default liq ercdan vî rengî dibîne:

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
}

Liq tesdîqkirin niha wiha xuya dike:

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
}

Naha verastkirina bikarhêner li gorî algorîtmaya jêrîn pêk tê:

  • Bikarhêner di muwekîlê VPN de pêbaweriyên domainê dike.
  • Freeradius rastdariya hesab û şîfreyê kontrol dike
  • Ger şîfre rast be, wê hingê daxwaznameyek nîşanek tê şandin.
  • Token tê verast kirin.
  • birin).

Source: www.habr.com

Add a comment