Freeradius + Google Authenticator + LDAP + Fortigate

Əgər iki faktorlu autentifikasiya həm arzuolunan, həm də qəlizdirsə, amma aparat nişanları üçün pul yoxdursa və ümumiyyətlə, yaxşı əhval-ruhiyyədə qalmağı təklif edirlər.

Bu həll super orijinal bir şey deyil, əksinə İnternetdə tapılan müxtəlif həllərin qarışığıdır.

Beləliklə verildi

Domain Adı Active Directory.

Bu gün bir çoxları kimi VPN vasitəsilə işləyən domen istifadəçiləri.

VPN şluz kimi fəaliyyət göstərir Qüvvət etmək.

VPN müştərisi üçün parolun saxlanması təhlükəsizlik siyasəti ilə qadağandır.

Siyasət Fortinet öz tokenlərinizlə əlaqədar olaraq, onu bir zhlobdan daha az adlandıra bilməzsiniz - 10-a qədər pulsuz token var, qalanları - çox qeyri-kosher qiymətə. RSASecureID, Duo və bu kimiləri nəzərə almadım, çünki açıq mənbə istəyirəm.

İlkin şərtlər: ev sahibi * nix quraşdırılmış sərbəst radius, SSD - domenə daxil olduqda, domen istifadəçiləri orada asanlıqla autentifikasiya edə bilərlər.

Əlavə paketlər: shellina qutusu, fiqur, freeradius-ldap, şrift rebel.tlf anbardan https://github.com/xero/figlet-fonts.

Mənim nümunəmdə - CentOS 7.8.

İşin məntiqi belə olmalıdır: VPN-ə qoşulduqda istifadəçi parol əvəzinə domen loqini və OTP daxil etməlidir.

Xidmətlərin qurulması

В /etc/raddb/radiusd.conf yalnız adından başlayan istifadəçi və qrup sərbəst radius, xidmətdən bəri radiusd bütün alt kataloqlardakı faylları oxumağı bacarmalıdır /ev/.

user = root
group = root

Parametrlərdə qruplardan istifadə etmək Qüvvət etmək, ötürülməlidir Satıcı Xüsusi Atribut. Bunu etmək üçün kataloqda raddb/policy.d Aşağıdakı məzmunlu bir fayl yaradıram:

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

Quraşdırıldıqdan sonra freeradius-ldap kataloqda raddb/mods-mövcuddur fayl yaradılır ldap.

Kataloq üçün simvolik bir keçid yaratmaq lazımdır raddb/mods aktivdir.

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

Onun məzmununu bu formaya gətirirəm:

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

Fayllarda raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel bölməsində icazə vermək İstifadə olunacaq siyasətin adını əlavə edirəm - group_authorization. Əhəmiyyətli bir məqam - siyasətin adı kataloqdakı faylın adı ilə müəyyən edilmir siyasət.d, lakin buruq mötərizələrdən əvvəl fayl daxilində bir direktivlə.
Bölmədə təsdiq etmək eyni fayllarda xəttin şərhini silməlisiniz pam.

Faylda clients.conf onun qoşulacağı parametrləri təyin edin Qüvvət etmək:

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

Modul konfiqurasiyası 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

Defolt paketin həyata keçirilməsi seçimləri sərbəst radius с google identifikatoru istifadəçidən etimadnamələrini aşağıdakı formatda daxil etməyi tələb edin: istifadəçi adı və şifrə+OTP.

Varsayılan paketdən istifadə edildiyi halda, başına düşəcək lənətlərin sayını təsəvvür etməklə sərbəst radius с Google Authenticator, modul konfiqurasiyasından istifadə etmək qərara alındı pam belə ki, yalnız token yoxlanıla bilər Google Authenticator.

İstifadəçi qoşulduqda aşağıdakılar baş verir:

  • Freeradius istifadəçinin domendə və müəyyən qrupda olub-olmadığını yoxlayır və uğurlu olarsa, OTP işarəsini yoxlayır.

“300+ istifadəçi üçün OTP-ni necə qeydiyyatdan keçirə bilərəm?” deyə düşünənə qədər hər şey kifayət qədər yaxşı görünürdü.

İstifadəçi serverə daxil olmalıdır sərbəst radius və hesabınızın altından tətbiqi işə salın Google identifikatoru, istifadəçi üçün tətbiq üçün QR kodu yaradacaq. Yardımın gəldiyi yer budur. shellina qutusu ilə birlikdə .bash_profile.

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

Daemon konfiqurasiya faylı burada yerləşir /etc/sysconfig/shellinabox.
Mən orada 443 portunu təyin edirəm və siz sertifikatınızı təyin edə bilərsiniz.

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

İstifadəçi yalnız linki izləməli, domen kreditlərini daxil etməlidir və tətbiq üçün QR kodu almalıdır.

Alqoritm aşağıdakı kimidir:

  • İstifadəçi brauzer vasitəsilə maşına daxil olur.
  • Domen istifadəçisinin yoxlanılıb-yoxlanılmaması. Yoxdursa, heç bir tədbir görülmür.
  • Əgər istifadəçi domen istifadəçisidirsə, Administrators qrupuna üzvlük yoxlanılır.
  • Admin deyilsə, o, Google Authenticator-un konfiqurasiya edilib-edilmədiyini yoxlayır. Əks halda, QR kodu və istifadəçi çıxışı yaradılır.
  • Əgər admin deyilsə və Google Authenticator konfiqurasiya edilibsə, sadəcə çıxış edin.
  • Adminsinizsə, Google Authenticator-u yenidən yoxlayın. Konfiqurasiya edilmədikdə, QR kodu yaradılır.

Bütün məntiq istifadə edilir /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

Fortigate quraşdırma:

  • Biz yaradırıq Radius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Lazımi qrupları yaradırıq, lazım gələrsə, qruplar tərəfindən girişə nəzarət edirik. Qrup adı aktivdir Qüvvət etmək daxil olan qrupa uyğun olmalıdır Satıcı Xüsusi Atribut Fortinet Qrupunun Adı.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Lazım olanların redaktə edilməsi SSL-portallar.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Qrupların siyasətlərə əlavə edilməsi.

    Freeradius + Google Authenticator + LDAP + Fortigate

Bu həllin üstünlükləri:

  • OTP ilə autentifikasiya etmək mümkündür Qüvvət etmək açıq mənbə həlli.
  • İstifadəçi VPN vasitəsilə qoşulduqda domen parolunu daxil etmir, bu da əlaqə prosesini bir qədər asanlaşdırır. 6 rəqəmli parolu daxil etmək təhlükəsizlik siyasətinin təmin etdiyi paroldan daha asandır. Nəticədə “VPN-ə qoşula bilmirəm” mövzusu olan biletlərin sayı azalır.

PS Bu həlli problem-cavab ilə tam hüquqlu iki faktorlu autentifikasiyaya təkmilləşdirməyi planlaşdırırıq.

Update:

Söz verdiyim kimi, onu çağırış-cavab seçiminə uyğunlaşdırdım.
Belə ki:
Faylda /etc/raddb/sites-enabled/default bölmə icazə vermək belə görünür:

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
}

Bölmə təsdiq etmək indi belə görünür:

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
}

İndi istifadəçi yoxlaması aşağıdakı alqoritmə uyğun olaraq baş verir:

  • İstifadəçi VPN müştərisində domen kreditlərini daxil edir.
  • Freeradius hesabın və parolun etibarlılığını yoxlayır
  • Şifrə düzgündürsə, token üçün sorğu göndərilir.
  • Token yoxlanılır.
  • mənfəət).

Mənbə: www.habr.com

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