Freeradius + Google Authenticator + LDAP + Fortigate

เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบชเบญเบ‡เบ›เบฑเบ”เป„เบˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเปเบฅเบฐ prickly, เปเบ•เปˆเบšเปเปˆเบกเบตเป€เบ‡เบดเบ™เบชเปเบฒเบฅเบฑเบš tokens เบฎเบฒเบ”เปเบงเปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบญเบฒเบฅเบปเบกเบ”เบต.

เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ™เบตเป‰โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ•เบปเป‰เบ™โ€‹เบชเบฐโ€‹เบšเบฑเบš superโ€‹, เปเบ•เปˆโ€‹เปเบ—เบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ›เบฐโ€‹เบชเบปเบกโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™โ€‹เบ—เบตเปˆโ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบญเบดเบ™โ€‹เป€เบ•เบตโ€‹เป€เบ™เบฑเบ”โ€‹.

เบกเบญเบšเปƒเบซเป‰

เป€เบžเบตเปˆเบกเป€เบ•เบตเบก Active Directory.

เบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เป€เบกเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบœเปˆเบฒเบ™ VPN, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเบซเบผเบฒเบเป†เบ„เบปเบ™เปƒเบ™เบกเบทเป‰เบ™เบตเป‰.

เป€เบฎเบฑเบ”เปœเป‰เบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเบ•เบน VPN เบ›เป‰เบญเบกเบ›เบฒเบเบฒเบ™.

เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ‚เปˆเบฒเบ VPN เปเบกเปˆเบ™เบซเป‰เบฒเบกเป‚เบ”เบเบ™เบฐเป‚เบเบšเบฒเบเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž.

เบเบฒเบ™เป€เบกเบทเบญเบ‡ Fortinet เบเปˆเบฝเบงเบเบฑเบš tokens เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡, เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบกเบฑเบ™เบซเบ™เป‰เบญเบเบเบงเปˆเบฒ zhlob - เบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเป€เบ–เบดเบ‡ 10 tokens เบŸเบฃเบต, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญ - เปƒเบ™เบฅเบฒเบ„เบฒเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ kosher เบซเบผเบฒเบ. เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ RSASecureID, Duo เปเบฅเบฐเบญเบทเปˆเบ™เป†, เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”.

เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™: เป€เบˆเบปเป‰เบฒเบžเบฒเบš * nix เบ”เป‰เบงเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡ เป€เบชเบฅเบตเบžเบฒเบš, ssd - เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบ”เป€เบกเบ™, เบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เป€เบกเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เป„เบ”เป‰เบ‡เปˆเบฒเบ.

เปเบžเบฑเบเป€เบเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก: เบเปˆเบญเบ‡เปเบเบฐ, เปเบฒเบ เป€เบ”เบทเบญเบ, freeradius-ldap, เบ•เบปเบงเบญเบฑเบเบชเบญเบ™ rebel.tlf เบˆเบฒเบ repository เป„เบ”เป‰ https://github.com/xero/figlet-fonts.

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบ - CentOS 7.8.

เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เป€เบกเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš VPN, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เปƒเบชเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป‚เบ”เป€เบกเบ™เปเบฅเบฐ OTP เปเบ—เบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™.

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹

ะ’ /etc/raddb/radiusd.conf เบžเบฝเบ‡เปเบ•เปˆเบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบเบธเปˆเบกเปƒเบ™เบ™เบฒเบกเบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เป€เบชเบฅเบตเบžเบฒเบš, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ เบฅเบฑเบ”เบชเบฐเปเบต เบ„เบงเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบŸเบฅเปŒเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบเปˆเบญเบเบ—เบฑเบ‡เบซเบกเบปเบ” / home /.

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 . เบˆเบธเบ”เบชเปเบฒเบ„เบฑเบ™ - เบŠเบทเปˆเบ‚เบญเบ‡เบ™เบฐเป‚เบเบšเบฒเบเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต เบ™เบฐโ€‹เป‚เบโ€‹เบšเบฒเบ.d, เปเบ•เปˆเป‚เบ”เบเบ„เปเบฒเบชเบฑเปˆเบ‡เบžเบฒเบเปƒเบ™เป„เบŸเบฅเปŒเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐ curly braces.
เปƒเบ™เบžเบฒเบ เบžเบดเบชเบนเบ”เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡ เปƒเบ™เป„เบŸเบฅเปŒเบ”เบฝเบงเบเบฑเบ™เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ uncomment เปเบ–เบง pam.

เปƒเบ™เป„เบŸเบฅเปŒ 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

เบ•เบปเบงเป€เบฅเบทเบญเบเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบŠเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เป€เบชเบฅเบตเบžเบฒเบš ั google authentator เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบงเปƒเบ™เบฎเบนเบšเปเบšเบš: เบŠเบทเปˆโ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบœเปˆเบฒเบ™+OTP.

เป‚เบ”เบเบเบฒเบ™เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบชเบฒเบšเปเบŠเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ•เบปเบเบขเบนเปˆเปƒเบ™เบซเบปเบง, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบŠเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เป€เบชเบฅเบตเบžเบฒเบš ั Google Authenticator, เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบกเบ”เบนเบ™ pam เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆ token เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเป„เบ”เป‰ Google Authenticator.

เป€เบกเบทเปˆเบญเบœเบนเป‰เปƒเบŠเป‰เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™:

  • Freeradius เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบขเบนเปˆเปƒเบ™เป‚เบ”เป€เบกเบ™เปเบฅเบฐเบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เปเบฅเบฐ, เบ–เป‰เบฒเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบเบงเบ”เป€เบšเบดเปˆเบ‡ OTP token.

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบšเบดเปˆเบ‡เบ”เบตเบžเปเบˆเบปเบ™เบเปˆเบงเบฒเป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒ "เบ‚เป‰เบญเบเบˆเบฐเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ OTP เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰ 300+ เป„เบ”เป‰เปเบ™เบงเปƒเบ”?"

เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ”เป‰เบงเบ เป€เบชเบฅเบตเบžเบฒเบš เปเบฅเบฐเบˆเบฒเบเบžเบฒเบเปƒเบ•เป‰เบšเบฑเบ™เบŠเบตเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ google authenticator, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ” QR เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเป€เบ‚เบปเป‰เบฒเบกเบฒ. เบเปˆเบญเบ‡เปเบเบฐ เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฑเบš .bash_ เป‚เบ›เบฃเป„เบŸเบฅ.

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

เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ daemon เบขเบนเปˆเบ—เบตเปˆ /etc/sysconfig/shellinabox.
เบ‚เป‰เบญเบเบฅเบฐเบšเบธเบžเบญเบ” 443 เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ เปเบฅเบฐเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเป„เบ”เป‰.

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

เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ•เบฒเบกโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹, เปƒเบชเปˆโ€‹เบชเบดเบ™โ€‹เป€เบŠเบทเปˆเบญโ€‹เป‚เบ”โ€‹เป€เบกเบ™โ€‹เปเบฅเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบฅเบฐโ€‹เบซเบฑเบ” QR เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹.

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบกเบตเบ”เบฑเปˆเบ‡เบ™เบตเป‰:

  • เบœเบนเป‰เปƒเบŠเป‰เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ„เบทเปˆเบญเบ‡เบœเปˆเบฒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš.
  • เบšเปเปˆเบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เป€เบกเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบš. เบ–เป‰เบฒเบšเปเปˆ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™.
  • เบ–เป‰เบฒเบœเบนเป‰เปƒเบŠเป‰เป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เป€เบกเบ™, เบชเบฐเบกเบฒเบŠเบดเบเปƒเบ™เบเบธเปˆเบก Administrators เบ–เบทเบเบเบงเบ”เบชเบญเบš.
  • เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡, เบกเบฑเบ™เบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ Google Authenticator เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบซเบผเบทเบšเปเปˆ. เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™, เบฅเบฐเบซเบฑเบ” QR เปเบฅเบฐเบœเบนเป‰เปƒเบŠเป‰เบญเบญเบเบˆเบฒเบเบฅเบฐเบšเบปเบšเปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™.
  • เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡เปเบฅเบฐ Google Authenticator เป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเบญเบญเบเบˆเบฒเบเบฅเบฐเบšเบปเบš.
  • เบ–เป‰เบฒ admin, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบงเบ”เป€เบšเบดเปˆเบ‡ 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

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Fortigate:

  • เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ เบฅเบฑเบ”เบชเบฐเบซเบกเบต- เป€เบŠเบตเบšเป€เบงเบต

    Freeradius + Google Authenticator + LDAP + Fortigate

  • เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบเบธเปˆเบกเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป‚เบ”เบเบเบธเปˆเบก. เบŠเบทเปˆเบเบธเปˆเบกเป€เบ›เบตเบ” เบ›เป‰เบญเบกเบ›เบฒเบเบฒเบ™ เบ•เป‰เบญเบ‡เบเบปเบ‡เบเบฑเบšเบเบธเปˆเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒ เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบœเบนเป‰เบ‚เบฒเบ Fortinet-Group-Name.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ—เบตเปˆโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹ SSL- เบ›เบฐเบ•เบน.

    Freeradius + Google Authenticator + LDAP + Fortigate

  • เป€เบžเบตเปˆเบกเบเบธเปˆเบกเปƒเบชเปˆเบ™เบฐเป‚เบเบšเบฒเบ.

    Freeradius + Google Authenticator + LDAP + Fortigate

เบ‚เปเป‰เบ”เบตเบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰:

  • เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™เป‚เบ”เบ OTP on เบ›เป‰เบญเบกเบ›เบฒเบเบฒเบ™ เบเบฒเบ™เปเบเป‰เป„เบ‚เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”.
  • เบœเบนเป‰เปƒเบŠเป‰เบšเปเปˆเปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เป‚เบ”เป€เบกเบ™เป€เบกเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™ 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 เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™
  • เบ–เป‰เบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ–เบทเบเบ•เป‰เบญเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบชเปเบฒเบฅเบฑเบš token เบ–เบทเบเบชเบปเปˆเบ‡.
  • เป‚เบ—เป€เบ„เบฑเบ™เบเบณเบฅเบฑเบ‡เบ–เบทเบเบเบงเบ”เบชเบญเบš.
  • เบเปเบฒเป„เบฅ).

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™