Freeradius + Google Authenticator + LDAP + Fortigate

Bagaimana jika pengesahan dua faktor adalah wajar dan berduri, tetapi tidak ada wang untuk token perkakasan dan secara amnya mereka menawarkan untuk kekal dalam mood yang baik.

Penyelesaian ini bukanlah sesuatu yang sangat asli, melainkan gabungan penyelesaian berbeza yang terdapat di Internet.

Jadi diberi

Домен Active Directory.

Pengguna domain yang bekerja melalui VPN, seperti kebanyakan hari ini.

Bertindak sebagai gerbang VPN Berpantang.

Menyimpan kata laluan untuk klien VPN adalah dilarang oleh dasar keselamatan.

Politik Fortinet berhubung dengan token anda sendiri, anda tidak boleh menyebutnya kurang daripada zhlob - terdapat sebanyak 10 token percuma, selebihnya - pada harga yang sangat tidak halal. Saya tidak menganggap RSASecureID, Duo dan seumpamanya, kerana saya mahukan sumber terbuka.

Prasyarat: tuan rumah * nix dengan ditubuhkan freeradius, ssd - dimasukkan ke dalam domain, pengguna domain boleh mengesahkannya dengan mudah.

Pakej tambahan: kotak shellina, figlett, jejari bebas-ldap, fon memberontak.tlf daripada repositori https://github.com/xero/figlet-fonts.

Dalam contoh saya - CentOS 7.8.

Logik kerja sepatutnya seperti berikut: apabila menyambung ke VPN, pengguna mesti memasukkan log masuk domain dan OTP dan bukannya kata laluan.

Persediaan perkhidmatan

В /etc/raddb/radiusd.conf hanya pengguna dan kumpulan bagi pihak yang bermula freeradius, sejak perkhidmatan jejari sepatutnya boleh membaca fail dalam semua subdirektori / rumah /.

user = root
group = root

Untuk dapat menggunakan kumpulan dalam tetapan Berpantang, mesti dihantar Atribut Khusus Vendor. Untuk melakukan ini, dalam direktori raddb/polisi.d Saya mencipta fail dengan kandungan berikut:

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

Selepas pemasangan jejari bebas-ldap dalam direktori raddb/mods-tersedia fail dibuat ldap.

Perlu membuat pautan simbolik ke direktori raddb/mods-enabled.

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

Saya membawa kandungannya ke borang ini:

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

Dalam fail raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel dalam bahagian memberi kebenaran Saya menambah nama dasar yang akan digunakan - group_authorization. Perkara penting - nama dasar tidak ditentukan oleh nama fail dalam direktori dasar.d, tetapi dengan arahan di dalam fail sebelum pendakap kerinting.
Dalam bahagian mengesahkan dalam fail yang sama anda perlu menyahkomen baris PAM.

Dalam fail pelanggan.conf tetapkan parameter yang akan disambungkan Berpantang:

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

Konfigurasi modul 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

Pilihan pelaksanaan himpunan lalai freeradius с pengesah google memerlukan pengguna memasukkan bukti kelayakan dalam format: kata laluan nama pengguna+OTP.

Dengan membayangkan bilangan kutukan yang akan jatuh ke atas kepala, dalam hal menggunakan bundle lalai freeradius с Pengesah Google, telah diputuskan untuk menggunakan konfigurasi modul PAM supaya hanya token boleh disemak Pengesah Google.

Apabila pengguna menyambung, perkara berikut berlaku:

  • Freeradius menyemak sama ada pengguna berada dalam domain dan dalam kumpulan tertentu dan, jika berjaya, semak token OTP.

Semuanya kelihatan cukup baik sehingga saat saya terfikir "Bagaimanakah saya boleh mendaftarkan OTP untuk 300+ pengguna?"

Pengguna mesti log masuk ke pelayan dengan freeradius dan dari bawah akaun anda dan jalankan aplikasi Pengesah Google, yang akan menjana kod QR untuk aplikasi untuk pengguna. Di sinilah bantuan datang. kotak shellina dalam kombinasi dengan .bash_profile.

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

Fail konfigurasi daemon terletak di /etc/sysconfig/shellinabox.
Saya nyatakan port 443 di sana dan anda boleh menentukan sijil anda.

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

Pengguna hanya perlu mengikuti pautan, memasukkan kredit domain dan menerima kod QR untuk aplikasi.

Algoritma adalah seperti berikut:

  • Pengguna log masuk ke mesin melalui pelayar.
  • Sama ada pengguna domain disemak. Jika tidak, maka tiada tindakan diambil.
  • Jika pengguna ialah pengguna domain, keahlian dalam kumpulan Pentadbir disemak.
  • Jika bukan pentadbir, ia menyemak sama ada Google Authenticator dikonfigurasikan. Jika tidak, maka kod QR dan log keluar pengguna dijana.
  • Jika bukan pentadbir dan Google Authenticator dikonfigurasikan, maka hanya log keluar.
  • Jika pentadbir, semak Google Authenticator sekali lagi. Jika tidak dikonfigurasikan, kod QR dijana.

Semua logik dilakukan menggunakan /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

Persediaan Fortigate:

  • Kami cipta Radius-pelayan

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Kami mencipta kumpulan yang diperlukan, jika perlu, kawalan akses mengikut kumpulan. Nama kumpulan dihidupkan Berpantang mesti sepadan dengan kumpulan yang diluluskan Atribut Khusus Vendor Nama-Kumpulan Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Mengedit yang perlu SSL-portal.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Menambah kumpulan pada dasar.

    Freeradius + Google Authenticator + LDAP + Fortigate

Kelebihan penyelesaian ini:

  • Ia adalah mungkin untuk mengesahkan melalui OTP pada Berpantang penyelesaian sumber terbuka.
  • Pengguna tidak memasukkan kata laluan domain apabila menyambung melalui VPN, yang sedikit sebanyak memudahkan proses sambungan. Kata laluan 6 digit lebih mudah untuk dimasukkan daripada yang disediakan oleh dasar keselamatan. Akibatnya, bilangan tiket dengan subjek: "Saya tidak dapat menyambung ke VPN" berkurangan.

PS Kami merancang untuk menaik taraf penyelesaian ini kepada pengesahan dua faktor sepenuhnya dengan respons cabaran.

Kini:

Seperti yang dijanjikan, saya mengubahnya kepada pilihan respons cabaran.
Jadi:
Dalam fail /etc/raddb/sites-enabled/default bahagian memberi kebenaran kelihatan seperti ini:

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
}

Bahagian mengesahkan sekarang kelihatan seperti ini:

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
}

Sekarang pengesahan pengguna berlaku mengikut algoritma berikut:

  • Pengguna memasukkan kredit domain dalam klien VPN.
  • Freeradius menyemak kesahihan akaun dan kata laluan
  • Jika kata laluan adalah betul, maka permintaan untuk token dihantar.
  • Token sedang disahkan.
  • keuntungan).

Sumber: www.habr.com

Tambah komen