Freeradius + Google Authenticator + LDAP + Fortigate

Điều gì sẽ xảy ra nếu xác thực hai yếu tố vừa được mong muốn vừa khó chịu, nhưng không có tiền cho mã thông báo phần cứng và nói chung, chúng đề nghị giữ tâm trạng tốt.

Giải pháp này không phải là một cái gì đó siêu nguyên bản, mà là sự kết hợp của các giải pháp khác nhau được tìm thấy trên Internet.

Vì vậy, đưa ra

Домен active Directory.

Người dùng tên miền làm việc thông qua VPN, giống như nhiều người hiện nay.

Hoạt động như một cổng VPN Pháo đài.

Lưu mật khẩu cho máy khách VPN bị cấm theo chính sách bảo mật.

Chính trị Fortinet đối với các mã thông báo của riêng bạn, bạn không thể gọi nó ít hơn một zhlob - có tới 10 mã thông báo miễn phí, phần còn lại - với mức giá rất phi lý. Tôi đã không xem xét RSASecureID, Duo và những thứ tương tự vì tôi muốn mã nguồn mở.

điều kiện tiên quyết: chủ nhà * nix với thành lập FreeRADIUS, ssd - đã nhập vào miền, người dùng miền có thể dễ dàng xác thực trên đó.

Các gói bổ sung: vỏ sò, con nhỏ, freeradius-ldap, nét chữ nổi loạn.tlf từ kho lưu trữ https://github.com/xero/figlet-fonts.

Trong ví dụ của tôi - CentOS 7.8.

Logic của công việc được cho là như sau: khi kết nối với VPN, người dùng phải nhập thông tin đăng nhập tên miền và OTP thay vì mật khẩu.

thiết lập dịch vụ

В /etc/raddb/radiusd.conf chỉ người dùng và nhóm thay mặt bắt đầu FreeRADIUS, kể từ khi dịch vụ bán kính sẽ có thể đọc các tập tin trong tất cả các thư mục con /nhà/.

user = root
group = root

Để có thể sử dụng các nhóm trong cài đặt Pháo đài, phải truyền Thuộc tính cụ thể của nhà cung cấp. Để làm điều này, trong thư mục raddb/chính sách.d Tôi tạo một tệp có nội dung sau:

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

Sau khi cài đặt bán kính tự do-ldap trong thư mục raddb/mod có sẵn tập tin được tạo ldap.

Cần tạo một liên kết tượng trưng đến thư mục raddb/đã bật mod.

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

Tôi mang nội dung của nó đến hình thức này:

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

Trong các tập tin raddb/kích hoạt trang web/mặc định и raddb/kích hoạt trang web/đường hầm bên trong trong phần ủy quyền Tôi thêm tên của chính sách sẽ được sử dụng - group_authorization. Một điểm quan trọng - tên của chính sách không được xác định bởi tên của tệp trong thư mục chính sách.d, nhưng bằng một lệnh bên trong tệp trước dấu ngoặc nhọn.
Trong phần xác nhận trong cùng các tệp bạn cần bỏ ghi chú dòng pam.

Trong tập tin khách hàng.conf quy định các tham số mà nó sẽ kết nối Pháo đài:

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

Cấu hình mô-đun 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

Tùy chọn triển khai gói mặc định FreeRADIUS с google authenticator yêu cầu người dùng nhập thông tin đăng nhập theo định dạng: tên người dùng/mật khẩu+OTP.

Bằng cách tưởng tượng số lượng lời nguyền sẽ rơi xuống đầu, trong trường hợp sử dụng gói mặc định FreeRADIUS с Google Authenticator, nó đã được quyết định sử dụng cấu hình mô-đun pam để chỉ có thể kiểm tra mã thông báo Google Authenticator.

Khi người dùng kết nối, điều sau đây sẽ xảy ra:

  • Freeradius kiểm tra xem người dùng có ở trong miền và trong một nhóm nhất định hay không và nếu thành công, sẽ kiểm tra mã thông báo OTP.

Mọi thứ có vẻ ổn cho đến lúc tôi nghĩ “Làm cách nào để đăng ký OTP cho hơn 300 người dùng?”

Người dùng phải đăng nhập vào máy chủ với FreeRADIUS và từ dưới tài khoản của bạn và chạy ứng dụng Trình xác thực Google, sẽ tạo mã QR cho ứng dụng cho người dùng. Đây là nơi giúp đỡ đến. vỏ sò kết hợp với .bash_profile.

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

Tệp cấu hình daemon được đặt tại /etc/sysconfig/shellinabox.
Tôi chỉ định cổng 443 ở đó và bạn có thể chỉ định chứng chỉ của mình.

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

Người dùng chỉ cần nhấp vào liên kết, nhập tín dụng tên miền và nhận mã QR cho ứng dụng.

Thuật toán như sau:

  • Người dùng đăng nhập vào máy thông qua một trình duyệt.
  • Người dùng tên miền có được kiểm tra hay không. Nếu không, sau đó không có hành động được thực hiện.
  • Nếu người dùng là người dùng miền, tư cách thành viên trong nhóm Quản trị viên sẽ được chọn.
  • Nếu không phải là quản trị viên, nó sẽ kiểm tra xem Google Authenticator đã được định cấu hình chưa. Nếu không, mã QR và đăng xuất người dùng sẽ được tạo.
  • Nếu không phải là quản trị viên và Google Authenticator được định cấu hình, thì chỉ cần đăng xuất.
  • Nếu admin thì kiểm tra lại Google Authenticator. Nếu không được định cấu hình, mã QR sẽ được tạo.

Tất cả logic được thực hiện bằng cách sử dụng /etc/skel/.bash_profile.

con mèo /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

Thiết lập củng cố:

  • Chúng tôi tạo ra Radius-người phục vụ

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Chúng tôi tạo các nhóm cần thiết, nếu cần, kiểm soát truy cập theo nhóm. Tên nhóm trên Pháo đài phải phù hợp với nhóm được thông qua trong Thuộc tính cụ thể của nhà cung cấp Tên nhóm Fortinet.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Chỉnh sửa cần thiết SSL-cổng thông tin.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • Thêm nhóm vào chính sách.

    Freeradius + Google Authenticator + LDAP + Fortigate

Ưu điểm của giải pháp này:

  • Có thể xác thực bằng OTP trên Pháo đài giải pháp mã nguồn mở.
  • Người dùng không nhập mật khẩu miền khi kết nối qua VPN, điều này phần nào đơn giản hóa quá trình kết nối. Mật khẩu gồm 6 chữ số dễ nhập hơn mật khẩu do chính sách bảo mật cung cấp. Do đó, số lượng vé có chủ đề: “Tôi không thể kết nối với VPN” giảm xuống.

PS Chúng tôi dự định nâng cấp giải pháp này thành xác thực hai yếu tố chính thức với phản hồi thử thách.

Cập nhật:

Như đã hứa, tôi đã điều chỉnh nó thành tùy chọn thử thách-phản hồi.
Vì vậy:
Trong tập tin /etc/raddb/sites-enabled/mặc định tiết diện ủy quyền như sau:

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
}

Mục xác nhận bây giờ trông như thế này:

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
}

Bây giờ xác minh người dùng xảy ra theo thuật toán sau:

  • Người dùng nhập tín dụng tên miền trong máy khách VPN.
  • Freeradius kiểm tra tính hợp lệ của tài khoản và mật khẩu
  • Nếu mật khẩu đúng, thì yêu cầu mã thông báo sẽ được gửi.
  • Mã thông báo đang được xác minh.
  • lợi nhuận).

Nguồn: www.habr.com

Thêm một lời nhận xét