Check Point MFA With Google Authenticator 2
Check Point MFA With Google Authenticator 2
Check Point MFA With Google Authenticator 2
GOOGLE AUTHENTICATOR
Vladimir Yakovlev 101010@higherintelligence.com
Most of us are familiar with Google Authenticator application and are already using it for a multitude of services. I would
like to describe the procedures that will make it possible to authenticate administrators and users to Check Point Gaia
Web UI and SSH as well as Smart Console applications and VPN using this application.
This setup requires creation and maintenance of local accounts on RADIUS server. To simplify user onboarding, QR
codes will be generated for mobile Google Authenticator application registration.
This guide is created with beginners in mind and does not require extensive Linux experience.
1|Page
Vladimir Yakovlev 101010@higherintelligence.com
IP addresses, host names and zone designations shown reflect those used in a lab environment for creation of this
document. Change those according to your requirements.
Conventions:
# Green on grey denotes existing text in files or prompts.
Blue on grey indicates modified entries in files, commands and responses to the
prompts made by you. Commands should be followed by pressing EEnterr
CCtrl+xx ; CCtrl+ww ; yyy ; nnn ; EEnterr , etc., represent key combinations, single key presses or sequences.
2|Page
Vladimir Yakovlev 101010@higherintelligence.com
When making changes in configuration files, comment out the lines you are changing and create modified entries under
those. Create a commented-out delimiter above and below the changed entries to allow for easier searches later, i.e.:
#---------------------- changed-by-admin1 ------------------------
#original entry, commented-out
Modified entry
#-------------------------- end-change ---------------------------
You can subsequently search configuration files for changes using “changed-by-admin1” pattern.
3|Page
Vladimir Yakovlev 101010@higherintelligence.com
We’ll be using the most widely deployed RADIUS server in the world, FreeRADIUS, running on Ubuntu distribution of
Linux.
Install Ubuntu 16.04 LTS server with default settings on a platform of your choice. Do not encrypt user directories!!!
You will need to provide the Ubuntu server with Internet access, at least during initial configuration. Once configuration
is completed, you may restrict its access to the Internet completely if you have internal Time Server(s). If you are relying
on time-based tokens, your RADIUS server should retain capability to keep accurate time.
Depending on installation method and target, you may be prompted with configuration options during setup. If so, enter
your hostname, user name, password and network settings as you go through the installation process. If some of the
options shown in the table were not available during the installation, follow instructions below to make necessary
changes.
Parameters (blue values used in the lab), note your own in the empty cells
Hostname (fru16) Address (10.2.2.106)
User (fradmin) Netmask (255.255.255.0)
Password (FR@dmin) Network (10.2.2.0)
Broadcast (10.2.2.255)
Gateway (10.2.2.1)
Time Zone America/New_York Domain (-//-)
DNS-Resolvers 8.8.8.8 single space 8.8.8.4 DNS-Resolvers
4|Page
Vladimir Yakovlev 101010@higherintelligence.com
Inside the Nano editor, navigate to the iface line located under # The primary network interface,
comment it out and paste “iface ens33 inet static” below, (your interface name may differ, but will be in identical
location):
# The primary network interface
auto ens33
#iface ens33 inet dhcp
iface ens33 inet static
Copy and paste, if you can, or type these lines under the “iface ens33 inet static”, to configure IP address, gateway and
DNS resolvers. Substitute values for address, mask, gateway and DNS servers with those pertinent to your network:
address 10.2.2.106
netmask 255.255.255.0
network 10.2.2.0
broadcast 10.2.2.255
gateway 10.2.2.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8 8.8.4.4
Press CCtrl+xx ; yyy and EEnterr to save changes and exit Nano.
5|Page
Vladimir Yakovlev 101010@higherintelligence.com
Type:
sudo reboot now
to restart your Ubuntu server.
We will continue configuration of the Ubuntu and FreeRADIUS once initial configuration of our firewall is completed.
At this point in the process, we must configure the firewall to allow for the following actions:
1. Access Ubuntu server from your management workstation
2. Allow Ubuntu to resolve names
3. Allow Ubuntu to sync time with NTP servers or pools
4. Permit Internet access from Ubuntu for installation and updates of additional software packages
Our Check Point firewall topology, reflecting network diagram on Page 2, should look like this:
Let’s create the host object representing our Ubuntu server and name it “fru16”, (abbreviated FreeRADIUS Ubuntu 16):
6|Page
Vladimir Yakovlev 101010@higherintelligence.com
And its NAT properties set to “Add Automatic Address Translation rules” with Translation method set to “Hide”.
The object representing our Internal network and its NAT properties should be defined as well:
7|Page
Vladimir Yakovlev 101010@higherintelligence.com
As well as the object representing our management workstation, (do not set NAT properties):
In SmartDashboard, “Firewall/NAT”, create the top two new rules shown here:
8|Page
Vladimir Yakovlev 101010@higherintelligence.com
And in “Firewall/Policy”, re-create the rules shown below, defining new “Time” object to limit your FreeRADIUS server’s
ability to establish outbound connections to the Internet outside of its designated maintenance window:
During the initial configuration, you may enable logging for the “dns” and “ntp” traffic to verify its functionality. Once
confirmed, it makes sense to set “Track” values to “- None” to avoid excessive logging.
The purpose of rule # 5 will become clear once we get to the “RADIUS Logging” section of this Guide.
9|Page
Vladimir Yakovlev 101010@higherintelligence.com
Once the server is rebooted, do not logon locally. Instead, use the SSH client residing on your Windows management PC,
(typically PuTTY), to establish a connection to your Ubuntu server. Adjust “Window” parameters as shown below if your
own are same as defaults. We will need the “Column” count exceeding default value to display uncorrupted QR codes;
the Rows count is arbitrary, since we can adjust the height dynamically by resizing terminal window:
Click “Yes” when prompted with “PuTTY Security Alert” and you should have established an SSH session.
You can now perform remote administration as well as copy/paste operations.
to get to the root of your directory (there is a space between cd and ~):
root@fru16:/home/fradmin# cd ~
root@fru16:~#
10 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Download the package lists from the repositories and update them to get information on the newest versions of
packages and their dependencies:
sudo apt-get update
Install NTP modules, as we will rely on time-based tokens, (you may forego this step if, for example, you are running
Ubuntu on a hypervisor and it is syncing time with the host):
sudo apt-get install ntp
When prompted:
Check the default time zone and change it to the one you are in, (press Enter after each blue line):
root@fru16:/home/fradmin# date
Wed Nov 9 15:08:27 PST 2016
root@fru16:/home/fradmin# cd ~
root@fru16:~# timedatectl set-timezone America/New_York
root@fru16:~# timedatectl
Local time: Wed 2016-11-09 18:11:14 EST
Universal time: Wed 2016-11-09 23:11:14 UTC
RTC time: Wed 2016-11-09 23:11:16
Time zone: America/New_York (EST, -0500)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no
root@fru16:~# service ntp restart
root@fru16:~# date
Wed Nov 9 18:11:30 EST 2016
root@fru16:~#
reboot
If you do not know the correct definition of your Time Zone, perform search, (I am using Tahiti as example):
fradmin@fru16:~$ timedatectl list-timezones | grep Tahiti
Pacific/Tahiti
Then use the complete output of the search in your zone definition.
Run the update again, to bring all the information about dependencies in line with freshly installed components.
Execute:
sudo apt-get update
11 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Paste this line to the terminal and press Enter to install the Google Authenticator components:
sudo apt-get install libpam-google-authenticator
Create a group for users whose access you may want to temporary disable in the future without deleting accounts:
sudo addgroup radius-disabled
Find lines:
user = freerad
group = freerad
Comment both lines out, copy and paste these lines below:
user = root
group = root
Press CCtrl+xx ; yyy and EEnterr to save changes and exit Nano.
12 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Execute:
sudo nano /etc/freeradius/users
Press CCtrl+xx ; yyy and EEnterr to save changes and exit Nano.
Execute:
sudo nano /etc/freeradius/sites-enabled/default
Search for this block of text containing commented-out word “pam”. Insert uncommented line “pam” under it:
# Pluggable Authentication Modules.
# pam
pam
Press CCtrl+xx ; yyy and EEnterr to save changes and exit Nano.
Configure PAM to use a combination of the local user’s password and the PIN generated by Google Authenticator:
Execute:
sudo nano /etc/pam.d/radiusd
Find and comment-out these four lines by prepending them with “#”:
@include common-auth
@include common-account
@include common-password
@include common-session
13 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Paste these two lines under the four lines commented out in the step above:
Execute:
sudo nano /etc/freeradius/radiusd.conf
Ctrl+ w ; find “auth”, comment it out and add line auth = yes below:
#auth = no
auth = yes
# Log passwords with the authentication requests.
# auth_badpass - logs password if it's rejected
# auth_goodpass - logs password if it's correct
#
# allowed values: {no, yes}
#
auth_badpass = no
auth_goodpass = no
sudo reboot
You are now ready to set up clients and users, issue google-authenticator tokens and perform RADIUS authentication.
14 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Scroll down with the arrow keys and append the file with section containing your Check Point management server, as
well as your management workstation. Replace IPs and “secret” with those pertinent to your environment. “Secret” is
an authentication method that the Clients will be using when addressing RADIUS and corresponding entries will be
defined later in your firewall and your workstation. “Shortname” is simply a name under which RADIUS will be logging
your Client’s activity.
client 10.2.2.1 {
secret = SECRET
shortname = allinoneDMZ
}
#
client 192.168.7.147 {
secret = SECRET
shortname = Precision
}
Press CCtrl+xx ; yyy and EEnterr to save changes and exit Nano.
15 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/cpmon
itor@fru16%3Fsecret%3DZLVQMR7ZTCRP24LZGRL3WQOWRQ%26issuer%3Dubuntu
16 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
17 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
cpmonitor@fru16:~$ exit
exit
root@fru16/home/cpmonitor# cd ~
root@fru16~# service freeradius restart
The QR code will remain visible only for the duration of the session. If you would like to provide your users with the
remote access to the QR code, email them the URL located immediately above the QR code.
When pasted in the browser,
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/cpmonitor@fru%3Fsecret%3DZL
VQMR7ZTCRP24LZGRL3WQOWRQ%26issuer%3Dubuntu
will generate identical QR code at google.com:
Alternatively, you can email your users their secret key together with the emergency scratch codes located under the QR
code during the original session, or located later in the /home/username/.google-authenticator file:
root@fru16~# cd /home/cpmonitor
root@fru16/home/cpmonitor# su cpmonitor
cpmonitor@fru16:~$ ls -a
. .. .bash_history .bash_logout .bashrc .google_authenticator .profile
cpmonitor@fru16:~$ cat .google_authenticator
ZLVQMR7ZTCRP24LZGRL3WQOWRQ
" RATE_LIMIT 3 30 1478891731
" DISALLOW_REUSE 49296382
" TOTP_AUTH
29294009
18 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
71196238
77206028
16714754
77329657
cpmonitor@fru16:~$
The secret key could be copied and pasted to their Google Authenticator app manually. Note that the account name in
the Google Authenticator app could be arbitrary if the secret key is entered manually. It will not affect your ability to
authenticate, as long as you are entering a proper user name at the logon prompt. If you are scanning the QR code,
user name will be in the format of user@freeradiushostname. Do not enter the “@freeradiushostname” at Check Point
Web UI or SSH logon prompts. Check Point does not support special characters in user names.
Test the ability of the user account created to authenticate locally, replacing “<passwd>” with the actual password you
have assigned to the user, and “<g-auth-code> with the 6-digit code generated by the Google Authenticator. Port 18120
is not specified in error. This is a pre-defined port for local authentication, as is “testing123” a pre-defined secret for the
local host:
root@fru16:~# radtest cpmonitor <passwd><g-auth-code> localhost 18120 testing123
Sending Access-Request of id 104 to 127.0.0.1 port 1812
User-Name = "cpmonitor"
User-Password = "<unix_password>493895"
NAS-IP-Address = 10.2.2.106
NAS-Port = 18120
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=104, length=20
root@fru16:~#
19 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Setting up Local RADIUS Users for Access to Gaia Web UI and Clish
To configure users in Web UI, logon to Gaia Web Portal using administrative credentials defined during installation of
the management server or gateway, or those defined via “cpconfig”:
Navigate to “User Management” section and click on the “Authentication Servers”. In the right pane on top, click on the
“Add” button, below the “RADIUS Servers”:
20 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Click “Ok”:
21 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Fill out User’s “Login Name”, spelling it exactly as you have done in the “Creating Users in RADIUS” section. Specify
desired “Access Mechanisms”, select preferred role in “Available Roles” and click “Add >” to move the selected role to
the “Added Roles” section. Leave the “Password” field blank and click “Ok”:
Note the warning about users that do not have passwords assigned.
22 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Users with no passwords assigned are required to supply credentials for their account created in the Authentication
Servers defined earlier. Attempts to login without password will fail with “Permission Denied” notification:
When the correct password defined on our RADIUS server is entered in combination with the code generated by Google
Authenticator, logon succeeds and the permissions defined in the Role assigned to the user in Gaia are applied:
23 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
In the picture above, user “cpmonitor” that was assigned “monitorRole” has all the action buttons grayed-out.
SSH access to Gaia for locally defined RADIUS users* will work in the same exact fashion, permitting only the execution
of commands defined in the Role assigned to the user.
*Locally defined RADIUS users, in the context of this document, are the users defined on each Check Point device.
24 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
25 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Configuring administrator’s authentication method and selecting RADIUS server or group responsible for it:
26 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Once the objects are created and the authentication method is defined, load the policy.
If the “Log Implied Rules” settings are enabled, during the RADIUS authentication attempts you will see traces like this:
27 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
In addition to individual user’s authentication that is similar to that described for Smart Console administrators:
28 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
In this case, you can leave the “Authentication” settings for the VPN users, or the template on which you are relying for
their creation, as “Undefined”:
29 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Users then will be forced to use the default authentication method assigned to specific blades and will be relying on
RADIUS passwords and codes generated by the Google Authenticator.
A typical VPN establishment and authentication process log will then look like this:
30 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
By default, FreeRADIUS events are being logged on your Ubuntu server in /var/log/freeradius/radius.log file.
Running the “tail” command will show you the last entries in this log:
root@fru16:~# cd /var/log/freeradius/
root@fru16:/var/log/freeradius# ls
radius.log radwtmp
root@fru16:/var/log/freeradius# tail radius.log
Sat Nov 12 19:59:37 2016 : Auth: Login OK: [cpadmin] (from client allinoneDMZ
port 0)
Sat Nov 12 20:05:52 2016 : Auth: Login OK: [cpadmin] (from client allinoneDMZ
port 0)
Sat Nov 12 20:17:49 2016 : Info: Signalled to terminate
Sat Nov 12 20:17:49 2016 : Info: Exiting normally.
Sat Nov 12 20:20:12 2016 : Info: Loaded virtual server <default>
Sat Nov 12 20:20:12 2016 : Info: Loaded virtual server inner-tunnel
Sat Nov 12 20:20:12 2016 : Info: Ready to process requests.
Sat Nov 12 20:28:21 2016 : Auth: Login OK: [cpadmin] (from client Precision port
0)
This will result in continuously scrolling log entries in your terminal session.
To filter the content of the log for a client or user, (“cpmonitor” in this example):
tail -f /var/log/freeradius/radius.log | grep cpmonitor
In this case the output of the log file will be limited to the entries specified in a filter, with filtered parameters
highlighted in red:
root@fru16:~# tail -f /var/log/freeradius/radius.log | grep cpmonitor
Nov 17 12:54:35 fru16 freeradius[8588]: Login OK: [cpmonitor] (from client
allinoneDMZ port 2083 cli 192.168.7.147)
Nov 18 12:36:36 fru16 freeradius[8588]: Login OK: [cpmonitor] (from client
allinoneDMZ port 28533 cli 192.168.7.147)
Nov 18 12:39:19 fru16 freeradius[8588]: Login OK: [cpmonitor] (from client
allinoneDMZ port 29634)
Nov 18 12:40:53 fru16 freeradius[11960]: Login OK: [cpmonitor] (from client
allinoneDMZ port 30686 cli 192.168.7.147)
root@fru16:~#
31 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
It is considered good practice to consolidate log files from critical infrastructure components to centralized logging
servers. To achieve that, the log output of FreeRADIUS should be redirected to the SIEM facility of your choice.
In the next section of this document I will demonstrate how to do this by forwarding logs to the Check Point
management or logging servers.
Redirection of the logs requires alteration of default configuration files for FreeRADIUS and rsyslog.
First, let’s make these changes in the radius.conf file:
Execute:
sudo nano /etc/freeradius/radius.conf
Once you find this section, comment out the “destination = files” and add the line “destination = syslog” below:
log {
#
# Destination for log messages. This can be one of:
#
# files - log to "file", as defined below.
# syslog - to syslog (see also the "syslog_facility", below.
# stdout - standard output
# stderr - standard error.
#
# The command-line option "-X" over-rides this option, and forces
# logging to go to stdout.
#
#destination = files
destination = syslog
Continue searching in same file, press CCtrl + ww and search for “syslog_facility = daemon“.
32 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Once found, comment this line out and add “syslog_facility = local1“ below, so that this portion of the file looks like:
# The exact values permitted here are OS-dependent. You probably
# don't want to change this.
#
#syslog_facility = daemon
syslog_facility = local1
# Log the full User-Name attribute, as it was found in the request.
#
# allowed values: {no, yes}
#
stripped_names = no
Press CCtrl + xw ; yyy and EEnterr to save changes and exit the nano editor.
Execute:
sudo nano /etc/rsyslog.conf
Press CCtrl + ww and search for “Set the default permissions for all log files “
Comment out lines “$PrivDropToUser syslog” and “$PrivDropToGroup syslog”, and paste these two lines below:
$PrivDropToUser adm
$PrivDropToGroup adm
Scroll down to the bottom of the file and paste these two lines at the end:
local1.* /var/log/fradius.log
*.* @ip_address_of_CheckPoint_management_or_log_server
Press CCtrl + xw ; yyy and EEnterr to save changes and exit the nano editor.
33 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Note that in our case, since FreeRADIUS is isolated in DMZ and is configured as a narrow purpose server, we can forward
all the logs to the Check Point. If you would like to narrow down the scope of forwarded events, you may use the two
lines shown below instead of those shown earlier:
local1.* /var/log/fradius.log
*.=notice @ip_address_of_CheckPoint_management_or_log_server
Once you are out of the nano editor, execute the following line for changes to take effect:
sudo reboot now
34 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
In SmartDashboard, open the properties of your management or logging server, navigate to “Logs\Additional Logging”
and check the box labeled “Accept Syslog messages”:
With the “Log Implied Rules” enabled in the “Global Properties”, a typical sequence of authentication looks like this:
You can see on line 43, that the NEW-RADIUS connection is treated by Implied Rules, (0 on the right is indicative of the
Implied Rules).
Syslog inbound connection on line 44, triggered by the authentication event, is treated by the policy rule number 4.
Line 45 indicates that syslog payload is being processed and contains information about login attempts.
35 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Syslog messages do not require “Log Implied Rules” to be enabled and will be visible in the tracker, where they could be
subjected to filtering based on the content of “Information” field.
In the SmartView Tracker, scroll to the right until column “Information” becomes visible.
Right click on the “Information” tab and select “Edit Filter”:
36 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Enter “*Login OK*” in the “Text” field, select “Match Case” and click “OK”.
37 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
This is in addition to the actual administrative logon attempts registered under the “Management” Tab:
38 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
To verify FreeRADIUS functionality and to observe the authentication attempts details, execute:
sudo service freeradius stop
and
sudo freeradius -X
You will now have a verbose output of FreeRADIUS startup and logon attempt processing, which can be of great help in
troubleshooting.
This is a typical output of logon attempt in debugging mode:
Ready to process requests.
rad_recv: Access-Request packet from host 10.2.2.1 port 29378, id=62, length=94
User-Name = "cpmonitor"
User-Password = "clear_text_password968932"
NAS-IP-Address = 192.168.7.33
NAS-Identifier = "sshd"
NAS-Port = 28352
NAS-Port-Type = Virtual
Service-Type = Authenticate-Only
Calling-Station-Id = "192.168.7.147"
# Executing section authorize from file /etc/freeradius/sites-enabled/default
+group authorize {
++[preprocess] = ok
++[chap] = noop
++[mschap] = noop
++[digest] = noop
[suffix] No '@' in User-Name = "cpmonitor", looking up realm NULL
[suffix] No such realm "NULL"
++[suffix] = noop
[eap] No EAP-Message, not doing EAP
++[eap] = noop
[files] users: Matched entry DEFAULT at line 70
++[files] = ok
++[expiration] = noop
++[logintime] = noop
[pap] WARNING! No "known good" password found for the user. Authentication may
fail because of this.
++[pap] = noop
+} # group authorize = ok
Found Auth-Type = PAM
# Executing group from file /etc/freeradius/sites-enabled/default
+group authenticate {
pam_pass: using pamauth string <radiusd> for pam.conf lookup
pam_pass: authentication succeeded for <cpmonitor>
++[pam] = ok
+} # group authenticate = ok
Login OK: [cpmonitor] (from client allinoneDMZ port 28352 cli 192.168.7.147)
39 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
Keep in mind, that when you are running FreeRADIUS in debugging mode, its actions are NOT written to the logs, they
are outputted only to your console session.
To return FreeRADIUS to normal operation, execute:
sudo service freeradius stop
and
sudo service freeradius start
40 | P a g e
Vladimir Yakovlev 101010@higherintelligence.com
FreeRADIUS implementation described above is suitable for small to medium environments where administrators would
like to take advantage of Google Authenticator for a limited number of accounts.
This exercise was inspired by the blog entry http://www.supertechguy.com/help/security/freeradius-google-auth by
Jeremy Cox.
For larger environments, use FreeRADIUS with MySQL as a back end, setup MySQL replication to secondary server and
define multiple RADIUS servers in Gaia, as well as RADIUS group in the SmartDashboard.
You may also decide to set up a front-end Web UI for your FreeRADIUS implementation using DaloRADIUS, (see
https://thenetworkcable.wordpress.com/2014/10/26/configuring-daloradius-as-a-freeradius-frontend/
for references).
41 | P a g e