Freeradius + Google Authenticator + LDAP + Fortigate

Ya iki faktörlü kimlik doğrulama hem arzu edilir hem de zahmetliyse, ancak donanım belirteçleri için para yoksa ve genel olarak iyi bir ruh halinde kalmayı teklif ediyorlarsa?

Bu çözüm, süper orijinal bir şey değil, İnternette bulunan farklı çözümlerin bir karışımıdır.

yani verildi

Alan Adı Active Directory.

Günümüzde pek çok kişi gibi, bir VPN aracılığıyla çalışan etki alanı kullanıcıları.

VPN ağ geçidi görevi görür güçlendirmek.

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

Siyaset Fortinet kendi jetonlarınızla ilgili olarak, buna bir zhlob'tan daha az diyemezsiniz - 10 kadar ücretsiz jeton vardır, geri kalanı - koşer olmayan bir fiyata. Açık kaynak istediğim için RSASecureID, Duo ve benzerlerini düşünmedim.

Önkoşullar: evsahibi * nix kurulan ile FreeRADIUS'un, ssd - etki alanına girildiğinde, etki alanı kullanıcıları üzerinde kolayca kimlik doğrulaması yapabilir.

Ek paketler: çöp kutusu, balık, freeradius-ldap, yazı tipi asi.tlf depodan https://github.com/xero/figlet-fonts.

Benim örneğimde - CentOS 7.8.

Çalışma mantığının şu şekilde olması gerekiyor: Bir VPN'e bağlanırken, kullanıcının şifre yerine bir etki alanı girişi ve OTP girmesi gerekir.

servis kurulumu

В /etc/raddb/radiusd.conf sadece adına başlayan kullanıcı ve grup FreeRADIUS'un, çünkü hizmet yarıçaplı tüm alt dizinlerdeki dosyaları okuyabilmelidir /ev/.

user = root
group = root

Ayarlarda grupları kullanabilmek için güçlendirmek, iletilmelidir Satıcıya Özgü Öznitelik. Bunun için dizinde raddb/policy.d Aşağıdaki içeriğe sahip 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 := "Welcome Admin"
                }
        }
    else {
        update reply {
        &Reply-Message := "Not authorized for vpn"
            }
        reject
        }
}

Kurulumdan sonra freeradius-ldap dizinde Raddb/mods-mevcut dosya oluşturuldu ldap.

Dizine sembolik bir bağlantı oluşturmanız gerekiyor raddb/mods etkin.

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

İçeriğini bu forma getiriyorum:

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

dosyalarda raddb/siteler etkin/varsayılan и raddb/siteler etkin/iç tünel kısımda yetki vermek Kullanılacak politikanın adını ekliyorum - group_yetkilendirme. Önemli bir nokta - ilkenin adı, dizindeki dosyanın adıyla belirlenmez politika.d, ancak kaşlı ayraçlardan önce dosyanın içindeki bir yönerge ile.
Bölümde kimlik doğrulaması aynı dosyalarda satırın açıklamasını kaldırmanız gerekir pam.

Dosyada client.conf bağlanacağı parametreleri belirtin güçlendirmek:

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

Modül yapılandırması pam.d/yarıçap:

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

Varsayılan paket uygulama seçenekleri FreeRADIUS'un с google authenticator kullanıcının kimlik bilgilerini şu biçimde girmesini gerektir: Kullanıcı adı Şifre+OTP.

Varsayılan paketin kullanılması durumunda kafaya düşecek lanet sayısını hayal ederek FreeRADIUS'un с Google Şifrematik, modül konfigürasyonunun kullanılmasına karar verildi pam böylece yalnızca belirteç kontrol edilebilir Google Şifrematik.

Bir kullanıcı bağlandığında aşağıdakiler gerçekleşir:

  • Freeradius, kullanıcının etki alanında ve belirli bir grupta olup olmadığını kontrol eder ve başarılı olursa OTP jetonunu kontrol eder.

"300'den fazla kullanıcı için OTP'yi nasıl kaydedebilirim?" diye düşündüğüm ana kadar her şey yeterince iyi görünüyordu.

Kullanıcı sunucuya şununla giriş yapmalıdır: FreeRADIUS'un ve hesabınızın altından ve uygulamayı çalıştırın Google kimlik doğrulayıcıkullanıcı için uygulama için bir QR kodu oluşturacak. Yardımın geldiği yer burasıdır. çöp kutusu ile bütünlüğünde .bash_profile.

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

Arka plan programı yapılandırma dosyası şurada bulunur: /etc/sysconfig/shellinabox.
Orada 443 numaralı bağlantı noktasını belirtiyorum ve sertifikanızı belirtebilirsiniz.

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

Kullanıcının yalnızca bağlantıyı takip etmesi, alan adı kredilerini girmesi ve uygulama için bir QR kodu alması yeterlidir.

Algoritma aşağıdaki gibidir:

  • Kullanıcı, bir tarayıcı aracılığıyla makinede oturum açar.
  • Etki alanı kullanıcısının kontrol edilip edilmediği. Değilse, hiçbir işlem yapılmaz.
  • Kullanıcı bir etki alanı kullanıcısı ise, Yöneticiler grubundaki üyelik kontrol edilir.
  • Yönetici değilse, Google Authenticator'ın yapılandırılıp yapılandırılmadığını kontrol eder. Değilse, bir QR kodu ve kullanıcı oturumu kapatılır.
  • Bir yönetici değilse ve Google Authenticator yapılandırılmışsa, oturumu kapatın.
  • Yönetici ise, Google Authenticator'ı tekrar kontrol edin. Yapılandırılmamışsa, bir QR kodu oluşturulur.

Tüm mantık kullanılarak yapılır /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 kurulumu:

  • oluşturmak yarıçap-sunucu

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Gerekli grupları, gerekirse gruplara göre erişim kontrolü oluşturuyoruz. Grup adı açık güçlendirmek iletilen grupla eşleşmelidir Satıcıya Özgü Öznitelik Fortinet-Grup-Adı.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Gerekli düzenleme SSL-portallar.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Politikalara grup ekleme.

    Freeradius + Google Authenticator + LDAP + Fortigate

Bu çözümün avantajları:

  • OTP ile kimlik doğrulaması yapmak mümkündür. güçlendirmek açık kaynak çözümü.
  • Kullanıcı, VPN aracılığıyla bağlanırken bir etki alanı parolası girmez, bu da bağlantı sürecini biraz basitleştirir. 6 haneli şifrenin girilmesi, güvenlik politikası tarafından sağlanandan daha kolaydır. Sonuç olarak, “VPN'ye bağlanamıyorum” konulu bilet sayısı azalır.

Not: Bu çözümü, sorgulama-yanıtlama özelliğine sahip tam teşekküllü iki faktörlü kimlik doğrulamasına yükseltmeyi planlıyoruz.

Güncelleme:

Söz verdiğim gibi, onu meydan okuma-yanıt seçeneğine ayarladım.
Yani:
Dosyada /etc/raddb/siteler etkin/varsayılan bölüm yetki vermek выглядит следующим образом:

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ölüm kimlik doğrulaması şimdi şöyle görünüyor:

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
}

Artık kullanıcı doğrulaması aşağıdaki algoritmaya göre gerçekleşir:

  • Kullanıcı, VPN istemcisine etki alanı kredilerini girer.
  • Freeradius hesabın ve şifrenin geçerliliğini kontrol eder
  • Parola doğruysa, belirteç için bir istek gönderilir.
  • Belirteç doğrulanıyor.
  • kâr).

Kaynak: habr.com

Yorum ekle