Freeradius + Google Authenticator + LDAP + Fortigate

Hvað ef tveggja þátta auðkenning er bæði æskileg og stingandi, en það eru engir peningar fyrir vélbúnaðartákn og almennt bjóða þeir upp á að vera í góðu skapi.

Þessi lausn er ekki eitthvað ofurfrumlegt, heldur blanda af mismunandi lausnum sem finnast á netinu.

Svo gefið

Домен Active Directory.

Lénsnotendur sem vinna í gegnum VPN, eins og margir í dag.

Virkar sem VPN gátt Duglegur.

Það er bannað samkvæmt öryggisstefnu að vista lykilorðið fyrir VPN biðlarann.

Stjórnmál Fortinet í tengslum við eigin tákn, þá geturðu ekki kallað það minna en zhlob - það eru allt að 10 ókeypis tákn, restin - á mjög ókosher verði. Ég taldi ekki RSASecureID, Duo og þess háttar, vegna þess að ég vil opinn uppspretta.

Forkröfur: gestgjafi * nix með staðfestu fríradíus, ssd - slegið inn á lénið geta notendur léns auðveldlega auðkennt á því.

Viðbótarpakkar: shellina kassi, fíkill, freeradius-ldap, leturgerð rebel.tlf úr geymslunni https://github.com/xero/figlet-fonts.

Í dæminu mínu - CentOS 7.8.

Rökfræði vinnunnar á að vera sem hér segir: þegar hann er tengdur við VPN verður notandinn að slá inn innskráningu léns og OTP í stað lykilorðs.

Uppsetning þjónustu

В /etc/raddb/radiusd.conf aðeins notandinn og hópurinn fyrir hönd sem byrjar fríradíus, frá þjónustunni radíusd ætti að geta lesið skrár í öllum undirmöppum /heim/.

user = root
group = root

Til að geta notað hópa í stillingum Duglegur, verður að senda Seljandi sérstakur eiginleiki. Til að gera þetta, í möppunni raddb/policy.d Ég bý til skrá með eftirfarandi efni:

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

Eftir uppsetningu freeradius-ldap í skránni raddb/mods-available skrá er búin til ldap.

Þarftu að búa til táknrænan hlekk á möppuna raddb/mods-virkt.

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

Ég færi innihald þess á þetta 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'
        }
}

Í skrám raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel í kafla heimila Ég bæti við nafni stefnunnar sem á að nota - group_authorization. Mikilvægt atriði - heiti stefnunnar ræðst ekki af nafni skráarinnar í möppunni stefna.d, en með tilskipun inni í skránni á undan hrokknu axlaböndunum.
Í kaflanum auðkenna í sömu skrám þarftu að afskrifa línuna Pam.

Í skrá clients.conf mælt fyrir um breytur sem það mun tengjast Duglegur:

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

Stilling einingar 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

Sjálfgefin útfærsluvalkostir fyrir búnt fríradíus с Google Authenticator krefjast þess að notandinn slær inn skilríki á sniðinu: notendanafn Lykilorð+OTP.

Með því að ímynda sér fjölda bölvuna sem munu falla á höfuðið, ef um er að ræða að nota sjálfgefið búnt fríradíus с Google Authenticator, var ákveðið að nota einingastillinguna Pam þannig að aðeins sé hægt að athuga táknið Google Authenticator.

Þegar notandi tengist gerist eftirfarandi:

  • Freeradius athugar hvort notandinn sé á léninu og í ákveðnum hópi og, ef vel tekst til, athugar OTP táknið.

Allt leit nógu vel út þar til ég hugsaði „Hvernig get ég skráð OTP fyrir 300+ notendur?“

Notandinn verður að skrá sig inn á netþjóninn með fríradíus og undir reikningnum þínum og keyrðu forritið Sannvottari frá Google, sem mun búa til QR kóða fyrir forritið fyrir notandann. Þetta er þar sem hjálp kemur inn. shellina kassi ásamt .bash_profile.

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

Stillingarskrá púkans er staðsett á /etc/sysconfig/shellinabox.
Ég tilgreini port 443 þar og þú getur tilgreint vottorðið þitt.

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

Notandinn þarf aðeins að fylgja hlekknum, slá inn lénseiningar og fá QR kóða fyrir forritið.

Reikniritið er sem hér segir:

  • Notandinn skráir sig inn á vélina í gegnum vafra.
  • Hvort lénsnotandinn sé merktur. Ef ekki, þá er ekkert gert.
  • Ef notandinn er lénsnotandi er hakað við aðild að Administrators hópnum.
  • Ef hann er ekki stjórnandi, athugar hann hvort Google Authenticator sé stillt. Ef ekki, þá myndast QR kóða og útskráning notanda.
  • Ef ekki er stjórnandi og Google Authenticator stilltur, þá er bara að skrá þig út.
  • Ef stjórnandi, athugaðu Google Authenticator aftur. Ef hann er ekki stilltur er QR kóða búinn til.

Öll rökfræði er gerð með því að nota /etc/skel/.bash_profile.

köttur /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

Fortigate uppsetning:

  • Við sköpum radíus-þjónn

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Við búum til nauðsynlega hópa, ef þörf krefur, aðgangsstýring eftir hópum. Hópnafn á Duglegur verður að passa við hópinn sem er sendur inn Seljandi sérstakur eiginleiki Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Breyta nauðsynlegum SSL-gáttir.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Bætir hópum við stefnur.

    Freeradius + Google Authenticator + LDAP + Fortigate

Kostir þessarar lausnar:

  • Það er hægt að auðkenna með OTP á Duglegur opinn uppspretta lausn.
  • Notandinn slær ekki inn lykilorð léns þegar hann tengist í gegnum VPN, sem einfaldar tengingarferlið nokkuð. Auðveldara er að slá inn 6 stafa lykilorðinu en það sem öryggisstefnan gefur upp. Fyrir vikið minnkar fjöldi miða með efninu: „Ég get ekki tengst VPN“.

PS Við ætlum að uppfæra þessa lausn í fullgilda tvíþætta auðkenningu með áskorun-viðbrögðum.

Update:

Eins og lofað var, breytti ég því í valmöguleikann áskorun-viðbrögð.
Svo:
Í skrá /etc/raddb/sites-enabled/default kafla heimila lítur svona út:

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
}

Kafli auðkenna lítur nú svona út:

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
}

Nú fer staðfesting notenda fram samkvæmt eftirfarandi reiknirit:

  • Notandinn slær inn lénseiningar í VPN biðlaranum.
  • Freeradius athugar gildi reikningsins og lykilorðsins
  • Ef lykilorðið er rétt er beiðni um tákn send.
  • Verið er að staðfesta táknið.
  • hagnaði).

Heimild: www.habr.com

Bæta við athugasemd