Freeradius + Google Authenticator + LDAP + Fortigate

Ko darīt, ja divu faktoru autentifikācija ir gan vēlama, gan dzeloņaina, bet aparatūras žetoniem naudas nav un kopumā tie piedāvā uzturēt labu garastāvokli.

Šis risinājums nav kaut kas super oriģināls, bet gan dažādu internetā atrodamu risinājumu sajaukums.

Tātad dots

Domēna vārds Active Directory.

Domēna lietotāji, kas strādā, izmantojot VPN, tāpat kā daudzi mūsdienās.

Darbojas kā VPN vārteja Stiprināt.

Paroles saglabāšanu VPN klientam aizliedz drošības politika.

Politika Fortinet attiecībā uz jūsu pašu žetoniem jūs to nevarat saukt mazāk par zhlob - ir pat 10 bezmaksas žetoni, pārējie - par ļoti nekošera cenu. Es neuzskatīju par RSASecureID, Duo un tamlīdzīgi, jo es gribu atvērto avotu.

Priekšnosacījumi: uzņēmēja * niks ar izveidoto freeradius, ssd - ievadīts domēnā, domēna lietotāji var viegli autentificēties tajā.

Papildu paketes: shellina kaste, figūriņa, freeradius-ldap, fonts dumpinieks.tlf no krātuves https://github.com/xero/figlet-fonts.

Manā piemērā - CentOS 7.8.

Darba loģika it kā ir šāda: pieslēdzoties VPN, lietotājam paroles vietā jāievada domēna pieteikšanās un OTP.

Pakalpojumu iestatīšana

В /etc/raddb/radiusd.conf tikai lietotājs un grupa, kuras vārdā startē freeradius, kopš pakalpojuma rādiuss jāspēj nolasīt failus visos apakšdirektorijos /mājas/.

user = root
group = root

Lai iestatījumos varētu izmantot grupas Stiprināt, ir jāpārraida Pārdevēja specifiskais atribūts. Lai to izdarītu, direktorijā raddb/policy.d Es izveidoju failu ar šādu saturu:

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

Pēc instalēšanas freeradius-ldap direktorijā raddb/mods-pieejams fails ir izveidots ldap.

Jāizveido simboliska saite uz direktoriju Raddb/mods iespējots.

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

Es ievietoju tās saturu šajā veidlapā:

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

Failos raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel sadaļā autorizēt Pievienoju izmantojamās politikas nosaukumu - group_authorization. Svarīgs moments – politikas nosaukumu nenosaka direktorijā esošā faila nosaukums politika.d, bet ar direktīvu failā pirms krokainajām lencēm.
Sadaļā apliecināt tajos pašos failos ir jāatceļ rindiņas komentāri pam.

Failā clients.conf norādiet parametrus, ar kuriem tas savienosies Stiprināt:

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

Moduļa konfigurācija 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

Noklusējuma komplekta ieviešanas opcijas freeradius с google autentifikators pieprasīt lietotājam ievadīt akreditācijas datus šādā formātā: Lietotājvārds Parole+OTP.

Iedomājoties lāstu skaitu, kas kritīs uz galvas, ja tiek izmantots noklusējuma komplekts freeradius с Google autentifikators, tika nolemts izmantot moduļa konfigurāciju pam lai varētu pārbaudīt tikai marķieri Google autentifikators.

Kad lietotājs izveido savienojumu, notiek tālāk norādītais.

  • Freeradius pārbauda, ​​vai lietotājs atrodas domēnā un noteiktā grupā, un, ja tas izdodas, pārbauda OTP marķieri.

Viss izskatījās pietiekami labi līdz brīdim, kad es domāju "Kā es varu reģistrēt OTP 300+ lietotājiem?"

Lietotājam ir jāpiesakās serverī ar freeradius un no sava konta un palaidiet lietojumprogrammu Google autentifikators, kas lietotājam ģenerēs lietojumprogrammas QR kodu. Šeit nāk palīdzība. shellina kaste kombinācijā ar .bash_profile.

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

Dēmona konfigurācijas fails atrodas vietnē /etc/sysconfig/shellinabox.
Es tur norādīju portu 443, un jūs varat norādīt savu sertifikātu.

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

Lietotājam atliek tikai sekot saitei, ievadīt domēna kredītus un saņemt aplikācijas QR kodu.

Algoritms ir šāds:

  • Lietotājs piesakās iekārtā, izmantojot pārlūkprogrammu.
  • Vai domēna lietotājs ir pārbaudīts. Ja nē, tad nekādas darbības netiek veiktas.
  • Ja lietotājs ir domēna lietotājs, tiek atzīmēta dalība administratoru grupā.
  • Ja tas nav administrators, tas pārbauda, ​​vai Google autentifikators ir konfigurēts. Ja nē, tiek ģenerēts QR kods un lietotāja atteikšanās.
  • Ja nav konfigurēts administrators un Google autentifikators, vienkārši atsakieties.
  • Ja administrators, tad vēlreiz pārbaudiet Google autentifikatoru. Ja tas nav konfigurēts, tiek ģenerēts QR kods.

Visa loģika tiek veikta, izmantojot /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

Stiprināt iestatīšanu:

  • Mēs radām rādiuss- serveris

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Veidojam nepieciešamās grupas, nepieciešamības gadījumā piekļuves kontroli pa grupām. Grupas nosaukums ieslēgts Stiprināt jāatbilst grupai, kas ir nodota Pārdevēja specifiskais atribūts Fortinet-grupas nosaukums.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Rediģēt nepieciešamo SSL- portāli.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Grupu pievienošana politikām.

    Freeradius + Google Authenticator + LDAP + Fortigate

Šī risinājuma priekšrocības:

  • Ir iespējams autentificēt, izmantojot OTP Stiprināt atvērtā pirmkoda risinājums.
  • Lietotājs neievada domēna paroli, veidojot savienojumu, izmantojot VPN, kas nedaudz vienkāršo savienojuma procesu. 6 ciparu paroli ir vieglāk ievadīt nekā drošības politikā paredzēto. Tā rezultātā samazinās biļešu skaits ar tēmu: “Es nevaru izveidot savienojumu ar VPN”.

PS Mēs plānojam jaunināt šo risinājumu uz pilnvērtīgu divu faktoru autentifikāciju ar izaicinājumu-atbildi.

Update:

Kā solīts, es to pielāgoju izaicinājuma-atbildes opcijai.
Tātad:
Failā /etc/raddb/sites-enabled/default sadaļā autorizēt ir šāds:

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
}

Sadaļa apliecināt tagad izskatās šādi:

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
}

Tagad lietotāja verifikācija notiek saskaņā ar šādu algoritmu:

  • Lietotājs VPN klientā ievada domēna kredītus.
  • Freeradius pārbauda konta un paroles derīgumu
  • Ja parole ir pareiza, tiek nosūtīts marķiera pieprasījums.
  • Tokens tiek pārbaudīts.
  • peļņa).

Avots: www.habr.com

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster