07InstanceFreeRadiusAD - amagerard/Freeradius GitHub Wiki
RedHat/FreeRadius
01 Sypnoptic | 02 Network | 03 FreeRadius | 04 InstanceDefault | |
---|---|---|---|---|
05 InstanceSql | 06 InstanceLdap | 07 InstanceAD | 08 Selinux | 09 GnomeShell |
DaloRadius | OpenLdap | Samba-AD |
7. Instance Freeradius-ad.
7.1 Principle.
Freeradius needs a domain controller (thot) for user authentication.
Freeradius must be joined to dw.learn.lan.
Domain controller (thot) is samba ad server
for dw.learn.lan.
Reminder :
This procedure is based on this example.
Ip freeradius: 192.168.50.41
Ip SambaAD thot : 192.168.40.47
Ip dns1 : 192.168.90.41
Ip mail : 192.168.60.50
Domain controller : dw.learn.lan
Servers name:
freeradius.ol26modk.com
dns1.ol26modk.com
mail.ol26modk.com
See AD synoptic.
7.2 SambaAD.
Samba-AD is a GPLv3 licensed opensource software that
reproduces the behavior of Microsoft Active Directory (2012R2 schemas and 2008R2 functional level).
(https://samba.tranquil.it/doc/en/
).
SambaAD must have the same time as freeradius.
Time server pool:systemctl status chronyd | grep source
Time zone: timedatectl
The dns of SambaAD will be redirected to dns1.
Your domain controller server should be ready to continue.
Read install SambaAD
7.3 Redirector thot.learn.lan from DNS1.
Pdns-recursor is a service that redirects DNS requests for:
ol26modk.com
domain to the DNS1 server.- The
dw.Learn.lan
domain to the SambaAD server. - Other domain to 1.1.1.1.
The pdns-recursor service is on DNS1.
Read install Powerdns
Read install Pdns-Recursor
Open a terminal console on DNS1.
Stop the pdns and pdns-recursor services.
systemctl stop pdns
systemctl stop pdns-recursor
Open a terminal console in root on dns1.
vi /etc/pdns-recursor/recursor.conf
Add this line:forward-zones +=dw.learn.lan=192.168.40.47:53
.
# forward-zones Zones for which we forward queries, comma separated domain=ip pairs
forward-zones=ol26modk.com=127.0.0.1:8669, 50.168.192.in-addr.arpa=127.0.0.1:8669, 90.168.192.in-addr.arpa=127.0.0.1:8669
## If you have AD domain server.
forward-zones +=dw.learn.lan=192.168.40.47:53
Start the pdns and pdns-recursor services.
systemctl start pdns
systemctl start pdns-recursor
Check from the DNS1 server the name of thot.dw.learn.lan
.
nslookup thot.dw.learn.lan
Server: 192.168.90.41
Address: 192.168.90.41#53
Non-authoritative answer:
Name: thot.dw.learn.lan
Address: 192.168.40.47
7.4 Add user system dadrad.
groupadd dadrad
useradd -g dadrad -s /bin/false -d /etc/freeradius-ad dadrad
Give permissions for dadrad.
setfacl -m u:dadrad:rx /etc/pki/tls/private/freeradius.key
setfacl -m u:dadrad:rx /etc/pki/tls/certs/freeradius.crt
setfacl -m u:dadrad:rx /etc/pki/tls/private/CA.key
setfacl -m u:dadrad:rx /etc/pki/tls/certs/CA.crt
7.5 Freeradius-ad installation.
Copy /etc/raddb to /etc/freeradius-ad.
cp -R /etc/raddb/* /etc/freeradius-ad/
chgrp -R dadrad /etc/freeradius-ad
7.6 Configuration.
vi /etc/freeradius-ad/radiusd.conf
prefix = /usr
sysconfdir = /etc
localstatedir = /var
sbindir = /usr/sbin
logdir = ${localstatedir}/log/freeradius-ad
raddbdir = ${sysconfdir}/freeradius-ad
radacctdir = ${logdir}/radacct
name = freeradius-ad
user = dadrad
group = dadrad
Create the directory for the logs.
mkdir /var/log/freeradius-ad
mkdir /var/log/freeradius-ad/radacct
touch /var/log/freeradius-ad/radius.log
chown -R dadrad:dadrad /var/log/freeradius-ad
chmod 0755 /var/log/freeradius-ad
7.7 Create a freeradius-ad service.
7.7.1 Create the /run/freeradius-ad folder at startup.
vi /usr/lib/tmpfiles.d/freeradius-ad.conf
#Type Path Mode UID GID Age Argument
d /run/freeradius-ad 0775 root dadrad - -
You must restart to activate
"/usr/lib/tmpfiles.d/freeradius-ad.conf"
reboot
Copy the service radiusd.service to freeradius-ad.service.
See InstanceDefault chapter 4.1.
cp /opt/freeradius/redhat/radiusd.service /usr/lib/systemd/system/freeradius-ad.service
Edit the file.
vi /usr/lib/systemd/system/freeradius-ad.service
[Service]
Type=forking
WatchdogSec=0
NotifyAccess=all
EnvironmentFile=-/etc/sysconfig/radiusd
# FreeRADIUS can do static evaluation of policy language rules based
# on environmental variables which is very useful for doing per-host
# customization.
# Unfortunately systemd does not allow variable substitutions such
# as %H or $(hostname) in the EnvironmentFile.
# We provide HOSTNAME here for convenience.
Environment=HOSTNAME=%H
# Limit memory to 2G this is fine for %99.99 of deployments. FreeRADIUS
# is not memory hungry, if it's using more than this, then there's probably
# a leak somewhere.
MemoryLimit=2G
RuntimeDirectory=radiusd radiusd/tmp
RuntimeDirectoryMode=0775
User=dadrad
Group=dadrad
PIDFile=/run/freeradius-ad/freeradius-ad.pid
#ExecStartPre=/usr/sbin/radiusd $FREERADIUS_OPTIONS -Cx -lstdout
ExecStart=/usr/sbin/radiusd -d /etc/freeradius-ad -l /var/log/freeradius-ad/radius.log
Restart=on-failure
RestartSec=5
ExecReload=/usr/sbin/radiusd -d /etc/freeradius-ad -l /var/log/freeradius-ad/radius.log
ExecReload=/bin/kill -HUP $MAINPID
# Don't elevate privileges after starting
NoNewPrivileges=true
# Allow binding to secure ports, broadcast addresses, and raw interfaces.
#
# This list of capabilities may not be exhaustive, and needs
# further testing. Please uncomment, test, and report any issues.
#CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SETUID CAP_SETGID CAP_CHOWN CAP_DAC_OVERRIDE
# Private /tmp that isn't shared by other processes
PrivateTmp=true
# cgroups are readable only by radiusd, and child processes
ProtectControlGroups=true
# don't load new kernel modules
ProtectKernelModules=true
# don't tune kernel parameters
ProtectKernelTunables=true
# Only allow native system calls
SystemCallArchitectures=native
# We shouldn't be writing to the configuration directory
ReadOnlyDirectories=/etc/freeradius-ad/
# We can read and write to the log directory.
ReadWriteDirectories=/var/log/freeradius-ad/
[Install]
WantedBy=multi-user.target
sites-available/default
.
7.7.2 Change ports of Replace the port 0 by 3812 and accounting port 0 by 3813.
Replace all "-ldap" by "#-ldap" and "-sql" by "#-sql".
vi /etc/freeradius-ad/sites-available/default
server default {
listen {
type = auth
ipaddr = *
port = 3812
}
# This second "listen" section is for listening on the accounting
listen {
ipaddr = *
# ipv6addr = ::
port = 3813
type = acct
limit {
}
}
....
# The ldap module reads passwords from the LDAP database.
#-ldap
....
# See "Authorization Queries" in mods-available/sql
# -sql
....
# See "Accounting queries" in mods-available/sql
# -sql
....
# See "Authentication Logging Queries" in mods-available/sql
# -sql
....
# log failed authentications in SQL, too.
# -sql
sites-available/inner-tunnel
.
7.7.3 Change port of vi /etc/freeradius-ad/sites-available/inner-tunnel
Replace the port 18120 by 38120.
Replace all "-ldap" by "#-ldap" and "-sql" by "#-sql".
Instead of "use_tunneled_reply", change this "if (0)" to an "if (1)".
server inner-tunnel {
listen {
ipaddr = 127.0.0.1
port = 38120
type = auth
}
....
# The ldap module reads passwords from the LDAP database.
# -ldap
....
# See "Authorization Queries" in `mods-config/sql/main/$driver/queries.conf`
# -sql
....
# See "Authentication Logging Queries" in `mods-config/sql/main/$driver/queries.conf`
# -sql
....
# log failed authentications in SQL, too.
# -sql
....
# Instead of "use_tunneled_reply", change this "if (0)" to an
# "if (1)".
#
if (1) {
....
Restart the server.
reboot
or init 6
7.8 Join to domain controller.
The prerequisite to join a server in an AD domain is to put the AD server in DNS.
This is not possible because there are 3 MySQL, LDAP and AD instances on the freeradius server.
The domain by default is ol26modk.com
manage by the dns1 server.
The pdns-recursor service on the dns1 server attributes the good server for every domain.
dw.learn.lan
is the SambaAd server192.168.40.47
,ol26modk.com
is the dns1 server192.168.90.41
,- the other domain is the Cloudflare
1.1.1.1
.
From the freeradius server.
cat /etc/resolv.conf
# Generated by NetworkManager
search ol26modk.com
nameserver 192.168.90.41
nslookup dns1.ol26modk.com
Server: 192.168.90.41
Address: 192.168.90.41#53
Non-authoritative answer:
Name: dns1.ol26modk.com
Address: 192.168.90.41
nslookup thot.dw.learn.lan
Server: 192.168.90.41
Address: 192.168.90.41#53
Non-authoritative answer:
Name: thot.dw.learn.lan
Address: 192.168.40.47
nslookup cloudflare.com
Server: 192.168.90.41
Address: 192.168.90.41#53
Non-authoritative answer:
Name: cloudflare.com
Address: 104.16.132.229
7.8.1 Installation.
dnf install krb5-workstation samba samba-winbind-clients samba-winbind samba-client
Add dadrad to the wbpriv group.
usermod -aG wbpriv dadrad
The procedure follows this wiki.
https://wiki.freeradius.org/guide/freeradius-active-directory-integration-howto
7.8.2 Samba.
Edit the file smb.conf.
Modify or add only the lines.
vi /etc/samba/smb.conf
[global]
workgroup = DW.LEARN
security = ads
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
##================ Share Definitions =============
winbind use default domain = no
password server = thot.dw.learn.lan
realm = dw.learn.lan
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
writable = yes
inherit acls = Yes
7.8.3 Krb5.
Edit the file krb5.conf.
Modify or add only the lines.
Respect capital and tiny.
vi /etc/krb5.conf
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
spake_preauth_groups = edwards25519
dns_canonicalize_hostname = fallback
qualify_shortname = ""
default_realm = DW.LEARN.LAN
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
DW.LEARN.LAN = {
kdc = thot.dw.learn.lan:88
admin_server = thot.dw.learn.lan:749
default_domain = dw.learn.lan
}
[domain_realm]
.dw.learn.lan = DW.LEARN.LAN
dw.learn.lan = DW.LEARN.LAN
[kdc]
profile = /var/kerberos/krb5ikdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
7.8.4 Nsswitch.
cp /etc/nsswitch.conf /etc/nsswitch.conf_ori
Edit the file nsswitch.conf.
Modify or add only the lines.
vi /etc/nsswitch.conf
# In order of likelihood of use to accelerate lookup.
passwd: files winbind systemd
shadow: files winbind
group: files winbind systemd
hosts: files dns myhostname
services: files winbind
netgroup: files winbind
automount: files winbind
aliases: files
ethers: files
gshadow: files
# Allow initgroups to default to the setting for group.
# initgroups: files
networks: files dns
protocols: files winbind
publickey: files
rpc: files
7.8.5 Start services.
systemctl enable --now smb
systemctl enable --now nmb
7.8.6 Hosts.
Edit the file hosts.
vi /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 localhost
192.168.50.41 freeradius.dw.learn.lan freeradius.ol26modk.com freeradius
7.8.7 Firewall.
ufw allow OUT CIFS
ufw allow OUT 'Kerberos Full'
ufw reload
ufw status verbose
Status: active
Logging: on (medium)
Default: deny (incoming), deny (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN 192.168.20.0/29
1812,1813/tcp (RADIUS 1812) ALLOW IN Anywhere
1812,1813/udp (RADIUS 1812) ALLOW IN Anywhere
2812,2813/tcp (RADIUS 2812) ALLOW IN Anywhere
2812,2813/udp (RADIUS 2812) ALLOW IN Anywhere
3812,3813/tcp (RADIUS 3812) ALLOW IN Anywhere
3812,3813/udp (RADIUS 3812) ALLOW IN Anywhere
80,443/tcp (WWW Full) ALLOW OUT Anywhere
25/tcp (SMTP) ALLOW OUT Anywhere
53 (DNS) ALLOW OUT Anywhere
67,68/udp (DHCP) ALLOW OUT Anywhere
123/udp (NTP2) ALLOW OUT Anywhere
465/tcp (SMTP SSL) ALLOW OUT Anywhere
587/tcp (SMTP TLS) ALLOW OUT Anywhere
993/tcp (IMAP SSL) ALLOW OUT Anywhere
143/tcp (IMAP TLS) ALLOW OUT Anywhere
3306/tcp (MYSQL) ALLOW OUT Anywhere
389 ALLOW OUT Anywhere
137,138/udp (CIFS) ALLOW OUT Anywhere
139,445/tcp (CIFS) ALLOW OUT Anywhere
88,749/tcp (Kerberos Full) ALLOW OUT Anywhere
464/udp (Kerberos Full) ALLOW OUT Anywhere
3812,3813/tcp (RADIUS 3812) ALLOW OUT Anywhere
3812,3813/udp (RADIUS 3812) ALLOW OUT Anywhere
1812,1813/tcp (RADIUS 1812) ALLOW OUT Anywhere
1812,1813/udp (RADIUS 1812) ALLOW OUT Anywhere
2812,2813/tcp (RADIUS 2812) ALLOW OUT Anywhere
2812,2813/udp (RADIUS 2812) ALLOW OUT Anywhere
Restart the server.
reboot
or init 6
7.8.8 Join to domain.
Before you begin, please check the DNS resolution of the domain controller.
nslookup thot.dw.learn.lan
Join freeradius in the dw.learn.lan domain.
- samba ad server ( it's not Microsoft)
- domain : dw.learn.lan
- user: administrator
net join -U administrator
Using short domain name -- DW.LEARN
Joined 'FREERADIUS' to dns domain 'dw.learn.lan'
If you have an error message.
DNS update failed: NT_STATUS_UNSUCCESSFUL
My solution is manually created freeradius in the samba-ad dns.
samba-tool dns add thot dw.learn.lan freeradius A 192.168.50.41 -Uadministrator
Now:
net join -U administrator
Password for [DW.LEARN\administrator]:
Using short domain name -- DW.LEARN
Joined 'FREERADIUS' to dns domain 'dw.learn.lan'
Winbind allows a Linux machine with installed samba to make a link between them and an active directory controller.
systemctl enable --now winbind
From a computer joined to the domain dw.learn.lan.
Open Active Directory Users and Computers
.
Search OU Computers
.
You have FREERADIUS
.
Open DNS
.
Search in thot.dw.learn.lan
and Forward Lookup Zones
dw.learn.lan
.
You have freeradius Host(A) 192.168.40.41
.
That means everything is ok.
7.9 Verification after joining the domain.
The wbinfo program queries and returns information created and used by the winbindd.
Check users and groups list.
wbinfo -u
wbinfo -g
From a computer joined to the domain dw.learn.lan.
Open Active Directory Users and Computers
.
Add a user.
Username : teacher password :Anibal2!
From Freeradius server.
Check users.
Username : teacher password :Anibal2!
Watch out for special characters like this "!" .
You have to put a "\
" before.
wbinfo -a [email protected]%Anibal2\!
plaintext password authentication succeeded
challenge/response password authentication succeeded
Kinit is used to obtain and cache Kerberos ticket-granting tickets.
kinit [email protected]
If no answer, that means it's good.
kinit -f --> user reminder.
klist --> list the tickets.
kdestroy - -> list empty.
Authenticates users using NT/LM authentication.
ntlm_auth --request-nt-key --domain=DW.LEARN --username=teacher --password=Anibal2\!
. (0x0)
7.10 Mods-available.
Edit the eap file.
Resume the configuration of the default instance.
vi /etc/freeradius-ad/mods-available/eap
# users then cannot use ANY other authentication method.
#
eap {
default_eap_type = peap
# authenticate via EAP-TLS! This is likely not what you want.
#
tls-config tls-common {
private_key_file = /etc/pki/tls/private/freeradius.key
certificate_file = /etc/pki/tls/certs/freeradius.crt
ca_file = /etc/pki/tls/certs/CA.crt
random_file = /dev/urandom
ca_path = /etc/pki/tls/certs
# EAP-TTLS -- Tunneled TLS
ttls {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
# EAP-PEAP
#
peap {
copy_request_to_tunnel = yes
use_tunneled_reply = yes
Edit the mschap file.
Authorized users must belong to the freeradius group.
You need to know the SID of group freeradius.
From a computer joined to the domain dw.learn.lan.
Open Active Directory Users and Computers
.
Add a goup freeradius
.
Add member freeradius
for teacher user
.
Username : teacher password :Anibal2!
Open administrator powershell
.
The command to find the SID of the freeradius group is:
Get-WmiObject -Query "SELECT * FROM Win32_group where name = 'freeradius'"|foreach-object { $_.sid}
S-1-5-21-420514156-3432241956-2849451653-1107
vi /etc/freeradius-ad/mods-available/mschap
# This module supports MS-CHAP and MS-CHAPv2 authentication.
# It also enforces the SMB-Account-Ctrl attribute.
#
mschap {
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
## It's only one line
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --allow-mschapv2 --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00} --require-membership-of='S-1-5-21-420514156-3432241956-2849451653-1107'"
7.11 Check if there are any other errors.
To this step, freeradius-ad must not announce an error.
If there are errors, review the configuration.
systemctl stop freeradius-ad
radiusd -d /etc/freeradius-ad -l /var/log/freeradius-ad/radius.log -X
Ctrl
+C
exit.
If it's good.
systemctl enable --now freeradius-ad
systemctl status freeradius-ad
Check the ports.
netstat -tunlp | grep radiusd
udp 0 0 127.0.0.1:38120 0.0.0.0:* 2575/radiusd
udp 0 0 0.0.0.0:53552 0.0.0.0:* 2575/radiusd
udp 0 0 0.0.0.0:3812 0.0.0.0:* 2575/radiusd
udp 0 0 0.0.0.0:3813 0.0.0.0:* 2575/radiusd
7.12 Nas.
The nas is a device that makes its authentication request to freereadius.
In my example, it's a dd-wrt wifi router.
We need a secret key shared between nas and freeradius.
First change all "secret" by another password.
cat /etc/freeradius-ad/clients.conf| grep secret
Example: new secret = 3bd45df3-3bd45df3
sed -i -e "s/testing123/3bd45df3-3bd45df3/g" /etc/freeradius-ad/clients.conf
Put a "#" in front of the Ipv6 configurations.
vi /etc/freeradius-ad/clients.conf
# IPv6 Client
##client localhost_ipv6 {
## ipv6addr = ::1
## secret = 3bd45df3-3bd45df3
##}
Add a new "nas" at the end of the file.
vi /etc/freeradius-ad/clients.conf
client linksys2 {
#ip du linksys2.
ipaddr = 192.168.5.1
# Shared key.
secret = ABjA#3r3bAB6n
}
7.13 Proxy.
First change all "secret" by another password.
cat /etc/freeradius-ad/proxy.conf| grep secret
Example: new secret = 3bd45df3-3bd45df3
sed -i -e "s/testing123/3bd45df3-3bd45df3/g" /etc/freeradius-ad/proxy.conf
Replace port 1812 by 3812.
vi /etc/freeradius-ad/proxy.conf
home_server localhost {
type = auth
ipaddr = 127.0.0.1
port = 3812
Add a new realm.
vi /etc/freeradius-ad/proxy.conf
Add at the end of proxy.conf file.
realm dw.learn.lan {
type = radius
authhost = LOCAL
accthost = LOCAL
}
Delete example.com
.
Put a "#" in front.
vi /etc/freeradius-ad/proxy.conf
## realm example.com {
## auth_pool = my_auth_failover
## }
7.14 Logs.
vi /etc/freeradius-ad/radiusd.conf
Change only these lines.
log {
auth = yes
auth_badpass = yes
auth_goodpass = yes
}
Read the logs under conditions of opening a wifi session.
tail -200 /var/log/freeradius-ad/radius.log
Auth: (2) Login OK: [teacher/<via Auth-Type = mschap>] (from client localhost port 3812)
7.15 Check user AD connection.
-
dc1.
Active Directory.
User: teacher
Password: Anibal2!
Group: freeradius -
Freeradius server.
1-Open a terminal console.
systemctl stop freeradius-ad
radiusd -d /etc/freeradius-ad -l /var/log/freeradius-ad/radius.log -X
2-Open another terminal console.
radtest -t mschap teacher "Anibal2!" localhost:3812 0 3bd45df3-3bd45df3
Sent Access-Request Id 119 from 0.0.0.0:44386 to 127.0.0.1:3812 length 133
User-Name = "teacher"
MS-CHAP-Password = "Anibal2!"
NAS-IP-Address = 127.0.0.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "Anibal2!"
MS-CHAP-Challenge = 0xf296027caa8fc703
MS-CHAP-Response = 0x000100000000000000000000000000000000000000000000000006af1d7dfdbfeb0ff715aa861952dedde8f7e23afc05698b
Received Access-Accept Id 119 from 127.0.0.1:3812 to 127.0.0.1:44386 length 84
MS-CHAP-MPPE-Keys = 0x00000000000000001f0cff0f254bb5967eacdab6bb59b621
MS-MPPE-Encryption-Policy = Encryption-Required
MS-MPPE-Encryption-Types = 4