Freeradius + Google Authenticator + LDAP + Fortigate

Ką daryti, jei dviejų veiksnių autentifikavimas yra ir pageidautinas, ir dygliuotas, tačiau aparatūros žetonams pinigų nėra ir apskritai jie siūlo palaikyti gerą nuotaiką.

Šis sprendimas nėra kažkas itin originalaus, o greičiau įvairių internete rastų sprendimų mišinys.

Taigi duota

Домен "Active Directory".

Domeno vartotojai, dirbantys per VPN, kaip ir daugelis šiandien.

Veikia kaip VPN vartai Stiprinti.

Išsaugoti VPN kliento slaptažodį draudžia saugos politika.

Politika Fortinetas Kalbant apie savo žetonus, jūs negalite to pavadinti mažiau nei zhlob - yra net 10 nemokamų žetonų, likusieji - už labai nekošerinę kainą. Negalvojau apie RSASecureID, Duo ir panašiai, nes noriu atviro kodo.

Būtinos sąlygos: priimančioji * nix su nustatyta freeradius, ssd - įvesta į domeną, domeno vartotojai gali lengvai jame autentifikuoti.

Papildomi paketai: shellina dėžutė, figūrėlė, freeradius-ldap, šriftas maištininkas.tlf iš saugyklos https://github.com/xero/figlet-fonts.

Mano pavyzdyje - CentOS 7.8.

Darbo logika turėtų būti tokia: prisijungdamas prie VPN vartotojas turi įvesti domeno prisijungimą ir OTP, o ne slaptažodį.

Paslaugų nustatymas

В /etc/raddb/radiusd.conf tik vartotojas ir grupė, kurios vardu pradeda veikti freeradius, nuo paslaugos spindulys turėtų turėti galimybę skaityti failus visuose pakatalogiuose /namai/.

user = root
group = root

Kad nustatymuose būtų galima naudoti grupes Stiprinti, turi būti perduotas Pardavėjo specifinis atributas. Norėdami tai padaryti, kataloge raddb/policy.d Sukuriu failą su tokiu turiniu:

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

Po įdiegimo freeradius-ldap kataloge raddb/mods-pasiekiama sukurtas failas ldap.

Reikia sukurti simbolinę nuorodą į katalogą Raddb/mods įjungtas.

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

Pateikiu jos turinį į šią 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'
        }
}

Failuose raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel skyriuje leisti Pridedu naudotinos politikos pavadinimą - group_authorization. Svarbus momentas – politikos pavadinimas nėra nustatomas pagal failo pavadinimą kataloge politika.d, bet pagal direktyvą failo viduje prieš riestinius skliaustus.
Skyriuje autentifikuoti tuose pačiuose failuose reikia atšaukti eilutę PAM.

Byloje clients.conf nurodykite parametrus, su kuriais jis prisijungs Stiprinti:

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

Modulio konfigūracija 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

Numatytosios paketo diegimo parinktys freeradius с google autentifikatorius reikalauti, kad vartotojas įvestų kredencialus tokiu formatu: vartotojo vardas Slaptažodis+OTP.

Įsivaizduodami prakeikimų, kurie kris ant galvos, skaičių, jei naudojamas numatytasis paketas freeradius с "Google" autentifikavimo, buvo nuspręsta naudoti modulio konfigūraciją PAM kad būtų galima patikrinti tik žetoną "Google" autentifikavimo.

Kai vartotojas prisijungia, nutinka:

  • „Freeradius“ patikrina, ar vartotojas yra domene ir tam tikroje grupėje, ir, jei pavyks, patikrina OTP prieigos raktą.

Viskas atrodė pakankamai gerai iki to momento, kai pagalvojau „Kaip užregistruoti OTP 300 ir daugiau vartotojų?

Vartotojas turi prisijungti prie serverio su freeradius ir iš savo paskyros ir paleiskite programą „Google“ autentifikavimo priemonė, kuris vartotojui sugeneruos programos QR kodą. Čia ateina pagalba. shellina dėžutė kartu su .bash_profile.

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

Demono konfigūracijos failas yra adresu /etc/sysconfig/shellinabox.
Ten nurodau 443 prievadą ir galite nurodyti savo sertifikatą.

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

Vartotojui tereikia sekti nuorodą, įvesti domeno kreditus ir gauti programos QR kodą.

Algoritmas yra toks:

  • Vartotojas prisijungia prie įrenginio per naršyklę.
  • Ar domeno vartotojas yra patikrintas. Jei ne, tada jokių veiksmų nesiimama.
  • Jei vartotojas yra domeno vartotojas, pažymėta narystė administratorių grupėje.
  • Jei ne administratorius, jis patikrina, ar „Google“ autentifikavimo priemonė sukonfigūruota. Jei ne, sugeneruojamas QR kodas ir vartotojo atsijungimas.
  • Jei sukonfigūruotas ne administratorius ir „Google“ autentifikavimo priemonė, tiesiog atsijunkite.
  • Jei administratorius, dar kartą patikrinkite „Google Authenticator“. Jei nesukonfigūruotas, sugeneruojamas QR kodas.

Visa logika daroma naudojant /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

Sustiprinti sąranką:

  • Mes kuriame spindulys- serveris

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Sukuriame reikiamas grupes, esant poreikiui, prieigos valdymą grupėmis. Grupės pavadinimas įjungtas Stiprinti turi atitikti įtrauktą grupę Pardavėjo specifinis atributas Fortinet-Grupės-Pavadinimas.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Reikalingo redagavimo SSL- portalai.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Grupių įtraukimas į politiką.

    Freeradius + Google Authenticator + LDAP + Fortigate

Šio sprendimo privalumai:

  • Galima autentifikuoti naudojant OTP Stiprinti atvirojo kodo sprendimas.
  • Prisijungdamas per VPN vartotojas neįveda domeno slaptažodžio, o tai kiek supaprastina prisijungimo procesą. 6 skaitmenų slaptažodį įvesti yra lengviau nei tą, kuris nurodytas saugumo politikoje. Dėl to mažėja bilietų su tema: „Negaliu prisijungti prie VPN“ skaičius.

PS Planuojame atnaujinti šį sprendimą į visavertį dviejų veiksnių autentifikavimą su iššūkiu-atsakymu.

Paskutinis atnaujinimas:

Kaip ir žadėjau, pakeičiau jį į iššūkio-atsakymo parinktį.
Taigi:
Byloje /etc/raddb/sites-enabled/default skyrius leisti yra toks:

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
}

skyrius autentifikuoti dabar atrodo taip:

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
}

Dabar vartotojo patvirtinimas vyksta pagal šį algoritmą:

  • Vartotojas įveda domeno kreditus VPN kliente.
  • Freeradius patikrina paskyros ir slaptažodžio galiojimą
  • Jei slaptažodis teisingas, siunčiama užklausa dėl žetono.
  • Žetonas tikrinamas.
  • pelnas).

Šaltinis: www.habr.com

Добавить комментарий