Freeradius + Google Autheticator + LDAP + Fortigate

İki faktorlu doğrulama olursa, ne yapmalı, hem yapıldığı hem de para olmadığı halde, donanım jetonları almak için düşündüğünüzde, ruh halinizi iyi tutun.

Bu çözüm, tamamen orijinal bir şey değil; daha çok, internette bulunan çeşitli çözümlerin bir karışımı.

İşte burada

Alan adı Active Directory.

VPN üzerinden çalışan alan kullanıcıları, günümüzde birçok kişi gibi.

VPN geçidi olarak görev yapan Fortigate.

VPN istemcisi için şifre kaydetmek güvenlik politikası tarafından yasaklanmıştır.

Politika Fortinet kendi jetonları konusunda oldukça cömert söylemek zor — toplam 10 ücretsiz jeton var, diğerleri ise oldukça pahalı. RSASecureID, Duo gibi seçenekleri düşünmedim çünkü açık kaynak istemekteyim.

Ön gereksinimler: sunucu *nix kurulu freeradius, sssd — alanın içine alınmış, alan kullanıcıları bunun üzerinde rahatça kimlik doğrulayabilir.

Ek paketler: shellinabox, figlet, freeradius-ldap, yazı tipi rebel.tlf deposundan https://github.com/xero/figlet-fonts.

Örneğimde — CentOS 7.8.

Çalışma mantığı şu şekilde: VPN'e bağlandığında kullanıcı, şifre yerine alan kimliğini ve OTP'yi girmelidir.

Hizmetlerin yapılandırılması

İ /etc/raddb/radiusd.conf sadece kullanıcı ve grup, başlangıçta çalışan isim değiştirilir freeradius, çünkü hizmetin radiusd tüm alt dizinlerde dosyaları okuyabilmesi gerekiyor. /home/.

user = root
group = root

Grupların ayarlarda kullanılabilmesi için Fortigate, şu değerleri iletmek gerekir: Vendor Specific Attribute. Bunun için raddb/policy.d bu içerikle yeni bir dosya oluşturuyorum:

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 := "Hoş geldiniz Admin"
                }
        }
    else {
        update reply {
        &Reply-Message := "VPN için yetkilendirilmedi"
            }
        reject
        }
}

freeradius-ldap yüklendikten sonra raddb/mods-available dizini içinde bir dosya oluşturur ldap raddb/mods-enabled.

bünyesinde sembolik bir bağlantı oluşturmamız gerekiyor. ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap.

İçeriğini şöyle düzenliyorum:

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

raddb/sites-enabled/default

raddb/sites-enabled/inner-tunnel dosyasında daauthorize bölümüne kullanılacak politika adını ekliyorum — group_authorization. Önemli bir nokta — politika adı, dizin içindeki dosya adı ile değil, dosya içerisindeki süslü parantezlerden önceki direktif ile belirlenir. authenticate bu dosyalarda de pamsatırını aktif hale getirmek gerekiyor.
clients.conf authenticate в этих же файлах нужно раскомментировать строку pam.

Faylda clients.conf bağlantı qurulacaq parametrləri qeyd edirik Fortigate:

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 tətbiq variantları freeradius c google authenticator istifadəçi tərəfindən daxil edilməsini nəzərdə tutur: istifadəçi_adı/parol+OTP.

Defolt kombinasiya istifadə edildikdə başına yağacaq lənətlərin sayını düşündüm freeradius c Google Authenticator, modul konfiqurasiyasını istifadə etməyə qərar verildi pam sadəcə tokeni yoxlamaq üçün Google Authenticator.

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

  • Freeradius, istifadəçinin domen içində olub olmadığını yoxlayır və uğur qazandığı halda OTP tokenini yoxlayır.

Hər şey çox yaxşı görünürdü, ta ki «300+ istifadəçini OTP qeydiyyatdan necə keçirəcəyimi düşünməyə başlayana qədər»

İstifadəçi serverə qoşulmalıdır freeradius və öz hesabından Google authenticator proqramını açmalıdır , bu da istifadəçi üçün QR-kod yaradacaq. Buradakombinasiyası köməyə gəlir shellinabox .bash_profile [root@freeradius ~]# yum install -y shellinabox.

Demonun konfiqurasiya faylı

oradakı portu 443 göstərirəm və şəxsi sertifikatınızı da göstərə bilərsiniz. /etc/sysconfig/shellinabox.
[root@freeradius ~]#systemctl enable --now shellinaboxd

İstifadəçi sadəcə linkə daxil olmalı, domen kredensiallarını daxil etməli və proqram üçün QR-kod almalıdır.

Alqoritm aşağıdakı kimidir:

İstifadəçi brauzer vasitəsilə maşına daxil olur.

  • İstifadəçinin domen olub-olmadığı yoxlanılır. Əgər yoxdursa, heç bir əməl görülmür.
  • İstifadəçi domenidirsə, administrator qrupuna aid olub-olmadığı yoxlanılır.
  • Əgər administrator deyilsə, Google Authenticator-un qurulması yoxlanılır. Əgər yoxdursa, QR-kod yaradılır və istifadəçi çıxarılır.
  • Əgər administrator deyilərsə və Google Authenticator qurulubsa, sadəcə çıxarılır.
  • Əgər administratordırlarsa, yenidən Google Authenticator yoxlanılır. Əgər qurulmamışdırsa, QR-kod yaradılır.
  • Bütün məntiq

cat /etc/skel/.bash_profile /etc/skel/.bash_profile.

Fortigate konfiqurasiyası:

# .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

Radius

  • yaradırıq -serverTələb olunduqda qruplara girişin ayrılması üçün zəruri qrupları yaradırıq. Qrup adı

    Freeradius + Google Autheticator + LDAP + Fortigate

  • Fortinet-Group-Name Fortigate -ə uyğun olmalıdır Vendor Specific Attribute Zəruri.

    Freeradius + Google Autheticator + LDAP + Fortigate

  • -portalını tənzimləyirik. SSLQrupları siyasətlərə əlavə edirik.

    Freeradius + Google Autheticator + LDAP + Fortigate

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

    Freeradius + Google Autheticator + LDAP + Fortigate

OTP autentikasiyası imkanı var

  • açıq mənbə həlli ilə. Fortigate VPN ilə qoşulma zamanı istifadəçinin domen parolunu daxil etməsini istisna edir, bu da qoşulma prosesini sadələşdirir. 6-rəqəmli parol daxil etmək, təhlükəsizlik siyasəti ilə nəzərdə tutulmuş olandan daha asandır. Nəticədə, «VPN-ə qoşula bilmirəm» mövzusunda bilet sayı azalır.
  • P.S. Bu həllin tam iki faktorlu təsdiqləmə ilə challenge-response variantına gətirmək planlayıram.

Yenilik:

Söylədiyim kimi, challenge-response variantına keçidi tamamladım.

seksiya
Beləliklə:
Faylda /etc/raddb/sites-enabled/default aşağıdakı kimi görünür: authenticate aşağıdakı kimi 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ə authenticate indi aşağıdakı formada:

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 := "Lütfən OTP daxil edin"
                }
            # Return Access-Challenge:
            challenge
            }
        }
        pam
        eap
}

İndi istifadəçi yoxlaması aşağıdakı alqoritm ilə həyata keçirilir:

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

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster