рдлреНрд░реАрд░реЗрдбрд┐рдпрд╕ + рдЧреВрдЧрд▓ рдСрдереЗрдВрдЯрд┐рдХреЗрдЯрд░ + рдПрд▓рдбреАрдПрдкреА + рдлреЛрд░реНрдЯрд┐рдЧреЗрдЯ

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рджреЛ-рдХрд╛рд░рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд╛рдВрдЫрдиреАрдп рдФрд░ рдХрд╛рдВрдЯреЗрджрд╛рд░ рджреЛрдиреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╡реЗ рдЕрдЪреНрдЫреЗ рдореВрдб рдореЗрдВ рд░рд╣рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЛрдИ рдЕрддрд┐ рдореМрд▓рд┐рдХ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИред

рддреЛ рджрд┐рдпрд╛

рдбреЛрдореЗрди рдирд╛рдо рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛.

рд╡реАрдкреАрдПрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЛрдореЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЖрдЬ рдХреЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ред

рд╡реАрдкреАрдПрди рдЧреЗрдЯрд╡реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ FortiGate.

рд╡реАрдкреАрдПрди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕рд╣реЗрдЬрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИред

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

рдкреВрд░реНрд╡рд╛рд╡рд╢реНрдпрдХрддрд╛рдПрдБ: рдореЗрдЬрд╝рдмрд╛рди * nix рд╕реНрдерд╛рдкрд┐рдд рдХреЗ рд╕рд╛рде freeradius, рдПрд╕рдПрд╕рдПрд╕рдбреА - рдбреЛрдореЗрди рдореЗрдВ рджрд░реНрдЬ, рдбреЛрдореЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ - CentOS 7.8.

рдХрд╛рд░реНрдп рдХрд╛ рддрд░реНрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╡реАрдкреАрдПрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдбреЛрдореЗрди рд▓реЙрдЧрд┐рди рдФрд░ рдУрдЯреАрдкреА рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

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

╨Т /etc/raddb/radiusd.conf рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рдореВрд╣ рдЬрд┐рд╕рдХреА рдУрд░ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИ freeradius, рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рдж рд╕реЗ рддреНрд░рд┐рдЬреНрдпрд╛ рд╕рднреА рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП /рд╣реЛрдо/.

user = root
group = root

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

рдлрд╛рдЗрд▓ рдореИрдВ client.conf рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдпрд╣ рдЬреБрдбрд╝реЗрдЧрд╛ FortiGate:

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 ╤Б рдЧреВрдЧрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХрд░реНрддрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдкреНрд░рдпреЛрдХреНрддрд╛ рдирд╛рдо рдкрд╛рд╕рд╡рд░реНрдб+OTP.

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

рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рд╣реЛрддрд╛ рд╣реИ:

  • рдлрд╝реНрд░реАрд░реЗрдбрд┐рдпрд╕ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЛрдореЗрди рдореЗрдВ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рдореЗрдВ рд╣реИ рдФрд░, рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рдУрдЯреАрдкреА рдЯреЛрдХрди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред

рдЙрд╕ рдХреНрд╖рдг рддрдХ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ "рдореИрдВ 300+ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдУрдЯреАрдкреА рдХреИрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?"

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

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

рдбреЗрдореЙрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИ /etc/sysconfig/shellinabox.
рдореИрдВ рд╡рд╣рд╛рдВ рдкреЛрд░реНрдЯ 443 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдк рдЕрдкрдирд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдбреЛрдореЗрди рдХреНрд░реЗрдбрд┐рдЯ рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╢реАрди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИред
  • рдХреНрдпрд╛ рдбреЛрдореЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рд╣реИ. рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА.
  • рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдбреЛрдореЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╕рдореВрд╣ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
  • рдпрджрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ Google рдкреНрд░рдорд╛рдгрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрдЖрдЙрдЯ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
  • рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ Google рдкреНрд░рдорд╛рдгрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдмрд╕ рд▓реЙрдЧрдЖрдЙрдЯ рдХрд░реЗрдВред
  • рдпрджрд┐ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╣реИ, рддреЛ Google рдкреНрд░рдорд╛рдгрдХ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪреЗрдВред рдпрджрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ QR рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

рд╕рднреА рддрд░реНрдХ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ /etc/sgel/.bash_profile.

рдмрд┐рд▓реНрд▓реА /etc/sgel/.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 рдЙрд╕ рд╕рдореВрд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд┐рдХреНрд░реЗрддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдлреЛрд░реНрдЯрд┐рдиреЗрдЯ-рд╕рдореВрд╣-рдирд╛рдо.

    рдлреНрд░реАрд░реЗрдбрд┐рдпрд╕ + рдЧреВрдЧрд▓ рдСрдереЗрдВрдЯрд┐рдХреЗрдЯрд░ + рдПрд▓рдбреАрдПрдкреА + рдлреЛрд░реНрдЯрд┐рдЧреЗрдЯ

  • рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрд╛рджрди рдПрд╕рдПрд╕рдПрд▓-рдкреЛрд░реНрдЯрд▓.

    рдлреНрд░реАрд░реЗрдбрд┐рдпрд╕ + рдЧреВрдЧрд▓ рдСрдереЗрдВрдЯрд┐рдХреЗрдЯрд░ + рдПрд▓рдбреАрдПрдкреА + рдлреЛрд░реНрдЯрд┐рдЧреЗрдЯ

  • рдиреАрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдореВрд╣ рдЬреЛрдбрд╝рдирд╛.

    рдлреНрд░реАрд░реЗрдбрд┐рдпрд╕ + рдЧреВрдЧрд▓ рдСрдереЗрдВрдЯрд┐рдХреЗрдЯрд░ + рдПрд▓рдбреАрдПрдкреА + рдлреЛрд░реНрдЯрд┐рдЧреЗрдЯ

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд╛рдн:

  • рдкрд░ рдУрдЯреАрдкреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ FortiGate рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕рдорд╛рдзрд╛рди.
  • рд╡реАрдкреАрдПрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЛрдореЗрди рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд╛рд╕рд╡рд░реНрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 6 рдЕрдВрдХреЛрдВ рдХрд╛ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, "рдореИрдВ рд╡реАрдкреАрдПрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛" рд╡рд┐рд╖рдп рд╡рд╛рд▓реЗ рдЯрд┐рдХрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдШрдЯ рдЬрд╛рддреА рд╣реИред

PS рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЪреБрдиреМрддреА-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд рджреЛ-рдХрд╛рд░рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

рдЕрдкрдбреЗрдЯ:

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪреБрдиреМрддреА-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред
рддреЛ:
рдлрд╛рдЗрд▓ рдореИрдВ /etc/raddb/рд╕рд╛рдЗрдЯ-рд╕рдХреНрд╖рдо/рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЕрдзрд┐рдХреГрдд рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

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
}

рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрдпрд╛рдкрди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реАрдкреАрдПрди рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдбреЛрдореЗрди рдХреНрд░реЗрдбрд┐рдЯ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред
  • рдлрд╝реНрд░реАрд░реЗрдбрд┐рдпрд╕ рдЦрд╛рддреЗ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ
  • рдпрджрд┐ рдкрд╛рд╕рд╡рд░реНрдб рд╕рд╣реА рд╣реИ, рддреЛ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЯреЛрдХрди рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ.
  • рд▓рд╛рдн)ред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ