Freeradius + Google Authenticator + LDAP + Fortigate

ද්වි-සාධක සත්‍යාපනය යෝග්‍ය සහ කටුක නම්, නමුත් දෘඩාංග ටෝකන සඳහා මුදල් නොමැති අතර සාමාන්‍යයෙන් ඔවුන් හොඳ මනෝභාවයකින් සිටීමට ඉදිරිපත් වේ.

මෙම විසඳුම සුපිරි ඔරිජිනල් දෙයක් නොව අන්තර්ජාලයේ ඇති විවිධ විසඳුම් මිශ්‍රණයකි.

ඉතින් දුන්නා

ඩොමේන් සක්රීය නාමාවලිය.

අද බොහෝ දෙනෙක් මෙන් VPN හරහා වැඩ කරන වසම් පරිශීලකයින්.

VPN ද්වාරයක් ලෙස ක්‍රියා කරයි ශක්තිමත් කරන්න.

VPN සේවාලාභියා සඳහා මුරපදය සුරැකීම ආරක්ෂක ප්‍රතිපත්ති මගින් තහනම් කර ඇත.

දේශපාලනය ෆෝටිනෙට් ඔබේම ටෝකන සම්බන්ධයෙන්, ඔබට එය zhlob එකකට වඩා අඩු ලෙස හැඳින්විය නොහැක - නොමිලේ ටෝකන 10 ක් පමණ ඇත, ඉතිරිය - ඉතා කොෂර් නොවන මිලකට. මට විවෘත මූලාශ්‍ර අවශ්‍ය නිසා මම RSASecureID, Duo සහ ඒ හා සමාන ඒවා සලකා බැලුවේ නැත.

පූර්ව අවශ්‍යතා: සත්කාරක * නෙක් ස්ථාපිත සමග freeradius, ssd - වසම තුළට ඇතුළු වූ විට, වසම් පරිශීලකයින්ට එය පහසුවෙන් සත්‍යාපනය කළ හැකිය.

අමතර පැකේජ: ෂෙලිනා පෙට්ටිය, අත්තික්කා, freeradius-ldap, අකුරු rebel.tlf ගබඩාවෙන් https://github.com/xero/figlet-fonts.

මගේ උදාහරණයේ - CentOS 7.8.

කාර්යයේ තර්කනය පහත පරිදි විය යුතුය: VPN වෙත සම්බන්ධ වන විට, පරිශීලකයා මුරපදයක් වෙනුවට වසම් පිවිසුමක් සහ OTP ඇතුළත් කළ යුතුය.

සේවා සැකසුම

В /etc/raddb/radiusd.conf ආරම්භ වන පරිශීලකයා සහ කණ්ඩායම වෙනුවෙන් පමණි freeradius, සේවයේ සිට අරය සියලුම උප බහලුම් වල ගොනු කියවීමට හැකි විය යුතුය /නිවස/.

user = root
group = root

සැකසීම් තුළ කණ්ඩායම් භාවිතා කිරීමට හැකි වීමට ශක්තිමත් කරන්න, සම්ප්රේෂණය කළ යුතුය විකුණුම්කරුගේ විශේෂිත ගුණාංගය. මෙය සිදු කිරීම සඳහා, නාමාවලියෙහි raddb/policy.d මම පහත අන්තර්ගතය සහිත ගොනුවක් සාදන්නෙමි:

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

ස්ථාපනය කිරීමෙන් පසු freeradius-ldap නාමාවලියෙහි raddb/mods-තිබේ ගොනුව සෑදී ඇත ldap.

නාමාවලියට සංකේතාත්මක සබැඳියක් නිර්මාණය කිරීම අවශ්ය වේ raddb/mods-enabled.

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

මම එහි අන්තර්ගතය මෙම පෝරමයට ගෙන එන්නේ:

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

ගොනු තුළ raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel කොටසේ අවසර දෙන්න මම භාවිතා කළ යුතු ප්‍රතිපත්තියේ නම එකතු කරමි - group_authorization. වැදගත් කරුණක් - ප්‍රතිපත්තියේ නම ඩිරෙක්ටරියේ ඇති ගොනුවේ නම අනුව තීරණය නොවේ ප්‍රතිපත්ති ඩී, නමුත් curly braces වලට පෙර ගොනුව තුල ඇති නියෝගයක් මගින්.
කොටසේ සත්‍යාපනය කරන්න එම ලිපිගොනු තුළම ඔබට රේඛාව අදහස් දැක්වීම ඉවත් කළ යුතුය පැම්.

ගොනුවේ clients.conf එය සම්බන්ධ වන පරාමිතීන් නියම කරන්න ශක්තිමත් කරන්න:

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

මොඩියුල වින්‍යාසය 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

පෙරනිමි බණ්ඩල් ක්‍රියාත්මක කිරීමේ විකල්ප freeradius с google සත්‍යාපකය ආකෘතියෙන් අක්තපත්‍ර ඇතුළත් කිරීමට පරිශීලකයාට අවශ්‍ය වේ: පරිශීලක නාමය / මුරපදය+OTP.

පෙරනිමි බණ්ඩලය භාවිතා කිරීමේදී හිසට වැටෙන ශාප ගණන සිතින් මවා ගැනීමෙනි. freeradius с Google Authenticator, මොඩියුල වින්යාසය භාවිතා කිරීමට තීරණය විය පැම් ටෝකනය පමණක් පරීක්ෂා කළ හැකි වන පරිදි Google Authenticator.

පරිශීලකයෙකු සම්බන්ධ වූ විට, පහත සඳහන් දේ සිදු වේ:

  • Freeradius පරිශීලක වසම තුළ සහ යම් කණ්ඩායමක සිටීද යන්න පරීක්ෂා කරන අතර, සාර්ථක නම්, OTP ටෝකනය පරීක්ෂා කරනු ලැබේ.

“300+ පරිශීලකයින් සඳහා OTP ලියාපදිංචි කරන්නේ කෙසේද?” යැයි මා සිතන මොහොත දක්වා සෑම දෙයක්ම ප්‍රමාණවත් ලෙස පෙනෙන්නට තිබුණි.

පරිශීලකයා සමඟ සේවාදායකයට පුරනය විය යුතුය freeradius සහ ඔබගේ ගිණුම යටතේ සිට යෙදුම ධාවනය කරන්න Google Authenticator, පරිශීලකයා සඳහා යෙදුම සඳහා QR කේතයක් ජනනය කරනු ඇත. උදව් පැමිණෙන්නේ මෙහිදීය. ෂෙලිනා පෙට්ටිය සමඟ ඒකාබද්ධව .බෂ්_පෞතික.

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

ඩීමන් වින්‍යාස ගොනුව පිහිටා ඇත /etc/sysconfig/shellinabox.
මම එහි 443 වරාය සඳහන් කරන අතර ඔබට ඔබේ සහතිකය සඳහන් කළ හැකිය.

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

පරිශීලකයාට අවශ්‍ය වන්නේ සබැඳිය අනුගමනය කිරීම, වසම් බැර ඇතුළත් කිරීම සහ යෙදුම සඳහා QR කේතයක් ලබා ගැනීම පමණි.

ඇල්ගොරිතම පහත පරිදි වේ:

  • පරිශීලකයා බ්‍රවුසරයක් හරහා යන්ත්‍රයට ලොග් වේ.
  • වසම් පරිශීලකයා පරීක්ෂා කර තිබේද යන්න. එසේ නොවේ නම්, කිසිදු පියවරක් නොගනී.
  • පරිශීලකයා වසම් පරිශීලකයෙක් නම්, පරිපාලක කණ්ඩායමේ සාමාජිකත්වය පරීක්ෂා කරනු ලැබේ.
  • පරිපාලකයෙකු නොවේ නම්, එය Google Authenticator වින්‍යාස කර ඇත්දැයි පරීක්ෂා කරයි. එසේ නොවේ නම්, QR කේතයක් සහ පරිශීලක පිටවීම ජනනය වේ.
  • පරිපාලකයෙකු සහ Google Authenticator වින්‍යාස කර නොමැති නම්, ඉවත් වන්න.
  • පරිපාලක නම්, Google Authenticator නැවත පරීක්ෂා කරන්න. වින්‍යාස කර නොමැති නම්, QR කේතයක් ජනනය වේ.

සියලුම තර්ක භාවිතා කර ඇත /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

සවිබල ගැන්වීම:

  • අපි නිර්මාණය කරනවා අරය- සේවාදායකය

    Freeradius + Google Authenticator + LDAP + Fortigate

  • අපි අවශ්‍ය කණ්ඩායම් සාදන්නෙමු, අවශ්‍ය නම්, කණ්ඩායම් විසින් ප්‍රවේශ පාලනය කරන්න. කණ්ඩායම් නම ක්‍රියාත්මකයි ශක්තිමත් කරන්න සමත් වූ කණ්ඩායමට අනුරූප විය යුතුය විකුණුම්කරුගේ විශේෂිත ගුණාංගය Fortinet-Group-නම.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • අවශ්ය සංස්කරණය කිරීම SSL- ද්වාර.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • ප්‍රතිපත්තිවලට කණ්ඩායම් එකතු කිරීම.

    Freeradius + Google Authenticator + LDAP + Fortigate

මෙම විසඳුමේ වාසි:

  • OTP මගින් සත්‍යාපනය කළ හැක ශක්තිමත් කරන්න විවෘත මූලාශ්ර විසඳුම.
  • VPN හරහා සම්බන්ධ වන විට පරිශීලකයා වසම් මුරපදයක් ඇතුළත් නොකරයි, එය සම්බන්ධතා ක්‍රියාවලිය තරමක් සරල කරයි. ආරක්ෂක ප්‍රතිපත්තිය මගින් සපයන ලද මුරපදයට වඩා ඉලක්කම් 6කින් යුත් මුරපදය ඇතුළත් කිරීම පහසුය. එහි ප්රතිඵලයක් වශයෙන්, මාතෘකාව සහිත ප්රවේශපත් සංඛ්යාව: "මට VPN වෙත සම්බන්ධ විය නොහැක" අඩු වේ.

PS අපි මෙම විසඳුම අභියෝග-ප්‍රතිචාරය සහිත සම්පූර්ණ ද්වි-සාධක සත්‍යාපනයකට උත්ශ්‍රේණි කිරීමට සැලසුම් කරමු.

යාවත්කාලීනය:

පොරොන්දු වූ පරිදි, මම එය අභියෝග-ප්‍රතිචාර විකල්පයට වෙනස් කළෙමි.
ඉතින්:
ගොනුවේ /etc/raddb/sites-enabled/default කොටස අවසර දෙන්න මේ වගේ:

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
}

අංශය සත්‍යාපනය කරන්න දැන් මේ වගේ:

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
}

දැන් පරිශීලක සත්‍යාපනය පහත ඇල්ගොරිතමයට අනුව සිදු වේ:

  • පරිශීලකයා VPN සේවාලාභියා තුළ වසම් බැර ඇතුළත් කරයි.
  • Freeradius ගිණුමේ සහ මුරපදයේ වලංගුභාවය පරීක්ෂා කරයි
  • මුරපදය නිවැරදි නම්, ටෝකනයක් සඳහා ඉල්ලීමක් යවනු ලැබේ.
  • ටෝකනය සත්‍යාපනය වෙමින් පවතී.
  • ලාභයක්).

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න