Freeradius + Google Authenticator + LDAP + Fortigate

рдЬрд░ рджреНрд╡рд┐-рдШрдЯрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рджреЛрдиреНрд╣реА рдЗрд╖реНрдЯ рдЖрдгрд┐ рдХрд╛рдЯреЗрд░реА рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рдЯреЛрдХрдирд╕рд╛рдареА рдкреИрд╕реЗ рдирд╛рд╣реАрдд рдЖрдгрд┐ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рддреЗ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдореВрдбрдордзреНрдпреЗ рд░рд╛рд╣рдгреНрдпрд╛рдЪреА рдСрдлрд░ рджреЗрддрд╛рдд.

рд╣реЗ рд╕реЛрд▓реНрдпреВрд╢рди рдХрд╛рд╣реА рд╕реБрдкрд░ рдУрд░рд┐рдЬрд┐рдирд▓ рдирд╛рд╣реА, рддрд░ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдорд┐рд│рдгрд╛рд▒реНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕рдЪреЗ рдорд┐рд╢реНрд░рдг рдЖрд╣реЗ.

рдореНрд╣рдгреВрди рджрд┐рд▓реЗ

рдбреЛрдореЗрди рдЪрд╛рд▓реВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛.

VPN рджреНрд╡рд╛рд░реЗ рдХрд╛рдо рдХрд░рдгрд╛рд░реЗ рдбреЛрдореЗрди рд╡рд╛рдкрд░рдХрд░реНрддреЗ, рдЬрд╕реЗ рдЖрдЬ рдЕрдиреЗрдХ.

VPN рдЧреЗрдЯрд╡реЗ рдореНрд╣рдгреВрди рдХрд╛рд░реНрдп рдХрд░рддреЗ рдХрд┐рд▓реНрд▓рд╛.

VPN рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рдкрд╛рд╕рд╡рд░реНрдб рдЬрддрди рдХрд░рдгреЗ рд╕реБрд░рдХреНрд╖рд╛ рдзреЛрд░рдгрд╛рджреНрд╡рд╛рд░реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдЖрд╣реЗ.

рд░рд╛рдЬрдХрд╛рд░рдг рдлреЙрд░реНрдЯреАрдиреЗрдЯ рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рдд:рдЪреНрдпрд╛ рдЯреЛрдХрдиреНрд╕рдЪреНрдпрд╛ рд╕рдВрдмрдВрдзрд╛рдд, рддреБрдореНрд╣реА рдпрд╛рд▓рд╛ рдЭреНрд▓реЙрдмрдкреЗрдХреНрд╖рд╛ рдХрдореА рдореНрд╣рдгреВ рд╢рдХрдд рдирд╛рд╣реА - рддреЗрдереЗ 10 рдореЛрдлрдд рдЯреЛрдХрди рдЖрд╣реЗрдд, рдмрд╛рдХреАрдЪреА - рдЕрдЧрджреА рдиреЙрди-рдХреЛрд╢рд░ рдХрд┐рдорддреАрдд. рдореА RSASecureID, Duo рдЖрдгрд┐ рдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдирд╛рд╣реА, рдХрд╛рд░рдг рдорд▓рд╛ рдореБрдХреНрдд рд╕реНрд░реЛрдд рд╣рд╡рд╛ рдЖрд╣реЗ.

рдкреВрд░реНрд╡рддрдпрд╛рд░реА: рд╣реЛрд╕реНрдЯ * рдирд┐рдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рд╕рд╣ рдореБрдХреНрдд рддреНрд░рд┐рдЬреНрдпрд╛, рдПрд╕рдПрд╕рдбреА - рдбреЛрдореЗрдирдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЖрд╣реЗ, рдбреЛрдореЗрди рд╡рд╛рдкрд░рдХрд░реНрддреЗ рддреНрдпрд╛рд╡рд░ рд╕рд╣рдЬрдкрдгреЗ рдкреНрд░рдорд╛рдгреАрдХреГрдд рдХрд░реВ рд╢рдХрддрд╛рдд.

рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЕрдХреЗрдЬреЗрд╕: рд╢реЗрд▓рд┐рдирд╛ рдмреЙрдХреНрд╕, рдЕрдВрдЬреАрд░, freeradius-ldap, рдлреЙрдиреНрдЯ rebel.tlf рднрд╛рдВрдбрд╛рд░рд╛рддреВрди https://github.com/xero/figlet-fonts.

рдорд╛рдЭреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд - CentOS 7.8.

рдХрд╛рдорд╛рдЪреЗ рддрд░реНрдХ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЕрд╕рд╛рд╡реЗрдд: VPN рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдкрд╛рд╕рд╡рд░реНрдбрдРрд╡рдЬреА рдбреЛрдореЗрди рд▓реЙрдЧрд┐рди рдЖрдгрд┐ OTP рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╕реЗрд╡рд╛ рд╕реЗрдЯрдЕрдк

╨Т /etc/raddb/radiusd.conf рдлрдХреНрдд рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЖрдгрд┐ рдЧрдЯ рдЬреНрдпрд╛рдЪреНрдпрд╛ рд╡рддреАрдиреЗ рд╕реБрд░реВ рд╣реЛрддреЛ рдореБрдХреНрдд рддреНрд░рд┐рдЬреНрдпрд╛, рд╕реЗрд╡рд╛ рдкрд╛рд╕реВрди рддреНрд░рд┐рдЬреНрдпрд╛ рд╕рд░реНрд╡ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдВрдордзреАрд▓ рдлрд╛рдЗрд▓реНрд╕ рд╡рд╛рдЪрдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рд╛рд╡реЗ /рдШрд░/.

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-рд╕рдХреНрд╖рдо.

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. рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдореБрджреНрджрд╛ - рдкреЙрд▓рд┐рд╕реАрдЪреЗ рдирд╛рд╡ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрддреАрд▓ рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рдирд╛рд╡рд╛рд╡рд░реВрди рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА рдкреЙрд▓рд┐рд╕реА.рдбреА, рдкрд░рдВрддреБ рдХрд░реНрд▓реА рдмреНрд░реЗрд╕реЗрд╕рдЪреНрдпрд╛ рдЖрдзреА рдлрд╛рдИрд▓рдЪреНрдпрд╛ рдЖрдд рдирд┐рд░реНрджреЗрд╢рд╛рдиреБрд╕рд╛рд░.
рд╡рд┐рднрд╛рдЧрд╛рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддреНрдпрд╛рдЪ рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЗрди рдЕрдирдХрдореЗрдВрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдкрд╛рдо.

рдлрд╛рдИрд▓рдордзреНрдпреЗ 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

рдбреАрдлреЙрд▓реНрдЯ рдмрдВрдбрд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдкрд░реНрдпрд╛рдп рдореБрдХреНрдд рддреНрд░рд┐рдЬреНрдпрд╛ ╤Б рдЧреВрдЧрд▓ рдкреНрд░рдорд╛рдгрд┐рдХ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓реНрд╕ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдПрдВрдЯрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рд╡рд╛рдкрд░рдгрд╛рд░реНрдпрд╛рдЪреЗ рдирд╛рд╡ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрдж+OTP.

рдбрд┐рдлреЙрд▓реНрдЯ рдмрдВрдбрд▓ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдбреЛрдХреНрдпрд╛рд╡рд░ рдХрд┐рддреА рд╢рд╛рдк рдкрдбрддреАрд▓ рдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░реВрди рдореБрдХреНрдд рддреНрд░рд┐рдЬреНрдпрд╛ ╤Б Google рдкреНрд░рдорд╛рдгрдХрд░реНрддрд╛, рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рдд рдЖрд▓рд╛ рдкрд╛рдо рдЬреЗрдгреЗрдХрд░реВрди рдлрдХреНрдд рдЯреЛрдХрди рддрдкрд╛рд╕рддрд╛ рдпреЗрдИрд▓ Google рдкреНрд░рдорд╛рдгрдХрд░реНрддрд╛.

рдЬреЗрд╡реНрд╣рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреА рдШрдбрддрд╛рдд:

  • Freeradius рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдбреЛрдореЗрди рдЖрдгрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧрдЯрд╛рдд рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, OTP рдЯреЛрдХрди рддрдкрд╛рд╕рддреЗ.

"рдореА 300+ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА OTP рдХрд╢реА рдиреЛрдВрджрд╡реВ?"

рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдореБрдХреНрдд рддреНрд░рд┐рдЬреНрдпрд╛ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЦрд╛рддреНрдпрд╛рдЦрд╛рд▓реАрд▓ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд╛рд▓рд╡рд╛ Google рдкреНрд░рдорд╛рдгрдХ, рдЬреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕рд╛рдареА рдПрдХ QR рдХреЛрдб рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реЗрд▓. рдЗрдереЗрдЪ рдорджрдд рдорд┐рд│рддреЗ. рд╢реЗрд▓рд┐рдирд╛ рдмреЙрдХреНрд╕ рд╕рд╣ рд╕рдВрдпреЛрдЬрдирд╛рдд .bash_profile.

[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-рдЧрдЯ-рдирд╛рд╡.

    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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛