Freeradius + Google Authenticator + LDAP + Fortigate

Bagaimana jika otentikasi dua faktor diinginkan dan berduri, 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 berbagai solusi yang ditemukan di Internet.

Begitu diberikan

Домен Active Directory.

Pengguna domain bekerja melalui VPN, seperti banyak orang saat ini.

Bertindak sebagai gateway VPN Perkuat.

Menyimpan kata sandi untuk klien VPN dilarang oleh kebijakan keamanan.

Politik Fortinet sehubungan dengan token Anda sendiri, Anda tidak dapat menyebutnya kurang dari satu zhlob - ada sebanyak 10 token gratis, sisanya - dengan harga yang sangat tidak halal. Saya tidak mempertimbangkan RSASecureID, Duo dan sejenisnya, karena saya ingin open source.

Prasyarat: tuan rumah * nix dengan didirikan freeradius, ssd - dimasukkan ke dalam domain, pengguna domain dapat dengan mudah mengotentikasinya.

Paket tambahan: kotak shellina, ara, freeradius-ldap, jenis huruf pemberontak.tlf dari repositori https://github.com/xero/figlet-fonts.

Dalam contoh saya - CentOS 7.8.

Logika kerjanya seharusnya sebagai berikut: saat menghubungkan ke VPN, pengguna harus memasukkan login domain dan OTP alih-alih kata sandi.

Pengaturan layanan

В /etc/raddb/radiusd.conf hanya pengguna dan grup atas nama yang dimulai freeradius, sejak layanan radiusd harus dapat membaca file di semua subdirektori /rumah/.

user = root
group = root

Untuk dapat menggunakan grup dalam pengaturan Perkuat, harus ditransmisikan Atribut Khusus Vendor. Untuk melakukan ini, di direktori raddb/kebijakan.d Saya membuat 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 instalasi freeradius-ldap di direktori raddb/mods-tersedia file dibuat lap.

Perlu membuat tautan simbolis ke direktori raddb/mods diaktifkan.

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

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

Dalam file raddb/situs-diaktifkan/default и raddb/sites-enabled/inner-tunnel di bagian mengizinkan Saya menambahkan nama kebijakan yang akan digunakan - otorisasi_kelompok. Poin penting - nama kebijakan tidak ditentukan oleh nama file di direktori kebijakan.d, tetapi dengan arahan di dalam file sebelum kurung kurawal.
Di bagian mengotentikasi dalam file yang sama Anda perlu menghapus tanda komentar pada baris pam.

Dalam file klien.conf meresepkan parameter yang akan terhubung Perkuat:

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 implementasi bundel default freeradius с google authenticator mengharuskan pengguna untuk memasukkan kredensial dalam format: nama pengguna/kata sandi+OTP.

Dengan membayangkan banyaknya kutukan yang akan menimpa kepala, dalam hal menggunakan bundle bawaan freeradius с Google Authenticator, diputuskan untuk menggunakan konfigurasi modul pam sehingga hanya token yang dapat diperiksa Google Authenticator.

Saat pengguna terhubung, hal berikut terjadi:

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

Semuanya tampak cukup baik sampai saya berpikir “Bagaimana cara mendaftarkan OTP untuk 300+ pengguna?”

Pengguna harus login ke server dengan freeradius dan dari bawah akun Anda dan jalankan aplikasi Google autentikator, yang akan menghasilkan kode QR untuk aplikasi bagi pengguna. Di sinilah bantuan datang. kotak shellina dalam kombinasi dengan .bash_profile.

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

File konfigurasi daemon terletak di /etc/sysconfig/shellinabox.
Saya menentukan 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.
  • Apakah pengguna domain dicentang. Jika tidak, maka tidak ada tindakan yang diambil.
  • Jika pengguna adalah pengguna domain, keanggotaan di grup Administrator akan diperiksa.
  • Jika bukan admin, ia akan memeriksa apakah Google Authenticator telah dikonfigurasi. Jika tidak, maka kode QR dan logout pengguna dibuat.
  • Jika bukan admin dan Google Authenticator dikonfigurasi, maka logout saja.
  • Jika admin, maka periksa kembali Google Authenticator. Jika tidak dikonfigurasi, kode QR dibuat.

Semua logika dilakukan 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

Fortigasi penyiapan:

  • Kami membuat Radius-server

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Kami membuat grup yang diperlukan, jika perlu, kontrol akses berdasarkan grup. Nama grup aktif Perkuat harus sesuai dengan kelompok yang dilewati Atribut Khusus Vendor Nama-Grup-Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Mengedit yang diperlukan SSL-portal.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Menambahkan grup ke kebijakan.

    Freeradius + Google Authenticator + LDAP + Fortigate

Keuntungan dari solusi ini:

  • Dimungkinkan untuk mengotentikasi dengan OTP pada Perkuat solusi sumber terbuka.
  • Pengguna tidak memasukkan kata sandi domain saat terhubung melalui VPN, yang agak menyederhanakan proses koneksi. Kata sandi 6 digit lebih mudah dimasukkan daripada yang disediakan oleh kebijakan keamanan. Akibatnya, jumlah tiket dengan subjek: "Saya tidak dapat terhubung ke VPN" berkurang.

PS Kami berencana untuk memutakhirkan solusi ini ke autentikasi dua faktor lengkap dengan respons-tantangan.

Update:

Seperti yang dijanjikan, saya men-tweaknya ke opsi respons-tantangan.
Jadi:
Dalam file /etc/raddb/sites-enabled/default bagian mengizinkan adalah sebagai berikut:

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 mengotentikasi 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 verifikasi pengguna terjadi sesuai dengan 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 sedang diverifikasi.
  • laba).

Sumber: www.habr.com

Tambah komentar