Freeradius + Google Autheticator + LDAP + Fortigate

Bagaimana jika Anda menginginkan otentikasi dua faktor dan itu menyakitkan, tetapi tidak ada uang untuk token perangkat keras, dan secara umum mereka menawarkan untuk tetap dalam suasana hati yang baik.



Solusi ini bukanlah sesuatu yang super orisinal, melainkan campuran dari berbagai solusi yang ditemukan di Internet.



Jadi, diberikan



Domain Direktori Aktif .



Pengguna domain menggunakan VPN, seperti banyak orang saat ini. Fortigate



bertindak sebagai gateway VPN . Menyimpan kata sandi untuk klien VPN dilarang oleh kebijakan keamanan. Kebijakan Fortinet mengenai tokennya sendiri tidak bisa disebut kurang dari redneck - sudah ada 10 token gratis, sisanya dengan harga yang sangat tidak halal. RSASecureID, Duo, dan sejenisnya belum dipertimbangkan, karena saya ingin open source. Prasyarat: * nix host dengan freeradius terinstal , sssd - masuk ke domain, pengguna domain dapat dengan mudah melakukan otentikasi di atasnya. Paket tambahan:















shellinabox , figlet , freeeradius-ldap , rebel.tlf font dari https://github.com/xero/figlet-fonts repositori .



Dalam contoh saya, CentOS 7.8.



Logika kerjanya adalah sebagai berikut: saat menyambung ke VPN, pengguna harus memasukkan login domain dan OTP, bukan sandi.



Menyiapkan layanan



Di /etc/raddb/radiusd.conf, hanya pengguna dan grup di mana freeradius dimulai yang diubah , karena layanan radiusd harus dapat membaca file di semua subdirektori / home / .



user = root
group = root


Untuk dapat menggunakan grup dalam pengaturan Fortigate , Anda harus meneruskan Atribut Khusus Vendor . Untuk melakukan ini, di direktori raddb / policy.d, buat file dengan konten 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
        }
}


Setelah menginstal freeradius-ldap di direktori, file yang tersedia raddb / mods dibuat ldap .



Anda perlu membuat tautan simbolis ke direktori yang mendukung raddb / mods .



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


Saya bawa isinya ke formulir 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'
        }
}


Di file raddb / sites-enabled / default dan raddb / sites-enabled / inner-tunnel, di bagian otorisasi , saya menambahkan nama kebijakan yang akan digunakan - group_authorization. Poin penting - nama kebijakan ditentukan bukan oleh nama file di direktori policy.d , tetapi oleh arahan di dalam file sebelum tanda kurung kurawal.

Di bagian otentikasi dari file yang sama, hapus komentar pam .



Di file clients.conf, tulis parameter yang akan dihubungkan dengan Fortigate :



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


Opsi default untuk mengimplementasikan bundel freeradius dengan google authenticator melibatkan pengguna yang memasukkan kredensial dalam format: nama pengguna / kata sandi + OTP .



Setelah menyajikan jumlah kutukan yang akan terjadi di kepala Anda, dalam kasus menggunakan paket freeradius default dengan Google Authenticator , diputuskan untuk menggunakan konfigurasi modul pam untuk memverifikasi hanya token Google Authenticator .



Saat pengguna terhubung, hal berikut terjadi:



  • Freeradius memeriksa keberadaan pengguna di domain dan di grup tertentu dan, jika berhasil, memeriksa token OTP.


Semuanya terlihat cukup baik sampai saya berpikir, "Bagaimana cara mendaftarkan OTP untuk 300+ pengguna?"



Pengguna harus masuk ke server dengan freeradius dan di bawah akunnya dan menjalankan aplikasi Google Authenticator , yang akan menghasilkan kode QR untuk aplikasi tersebut bagi pengguna. Di sinilah shellinabox berguna dalam kombinasi dengan .bash_profile .



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


File konfigurasi daemon terletak di / etc / sysconfig / shellinabox .

Saya menunjukkan port 443 di sana dan Anda dapat menentukan sertifikat Anda.



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


Pengguna hanya perlu mengikuti tautan, memasukkan kredit domain dan menerima kode QR untuk aplikasi tersebut.



Algoritmanya adalah sebagai berikut:



  • Pengguna masuk ke mesin melalui browser.
  • Pengguna domain dicentang. Jika tidak, tidak ada tindakan yang diambil.
  • Jika pengguna adalah pengguna domain, keanggotaan di grup Administrator dicentang.
  • Jika bukan admin, ia memeriksa apakah Google Autheticator dikonfigurasi. Jika tidak, maka kode QR dan logout pengguna dibuat.
  • Jika tidak ada admin dan Google Authenticator dikonfigurasi, maka cukup logout.
  • Jika admin, periksa lagi Google Authenticator. Jika tidak dikonfigurasi, maka kode QR dibuat.


Semua logika dikerjakan dengan 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




Fortigate setup:



  • Buat Server Radius



  • Kami membuat grup yang diperlukan, jika perlu, membedakan akses berdasarkan grup. Nama grup di Fortigate harus cocok dengan grup yang diteruskan di Vendor Specific Attribute Fortinet-Group-Name .



  • Mengedit portal SSL yang diperlukan .



  • Tambahkan grup ke kebijakan.







Keuntungan dari solusi ini:

  • Ada kemungkinan otentikasi OTP pada solusi sumber terbuka Fortigate .
  • Ini mengecualikan pengguna yang memasukkan kata sandi domain saat terhubung melalui VPN, yang agak menyederhanakan proses koneksi. Kata sandi 6 digit lebih mudah untuk dimasukkan daripada kebijakan keamanan. Akibatnya, jumlah tiket dengan subjek: "Tidak dapat terhubung ke VPN" berkurang.


PS Ada rencana untuk memperketat solusi ini ke otentikasi dua faktor yang lengkap dengan tantangan-respons.



Memperbarui:



Seperti yang dijanjikan, saya menyelesaikannya hingga opsi tantangan-respons.

Jadi:

Dalam / etc / raddb / sites-enabled / default file, authorize bagian terlihat 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
}


Bagian otentikasi sekarang terlihat 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 pengguna diverifikasi menurut algoritme berikut:

  • Pengguna memasukkan kredit domain di klien VPN.
  • Freeradius memeriksa validitas akun dan kata sandi
  • Jika kata sandi benar, maka permintaan token dikirim.
  • Token diverifikasi.
  • Keuntungan).



All Articles