Campus Network as a Service
CNaaS NAC (RADIUS) felsökning
Introduktion
Varje kund har två stycken RADIUS-servrar, t.ex. kmh-nac1.cnaas.sunet.se och kmh-nac2.cnaas.sunet.se. Båda servrarna kan vara aktiva samtidigt och autentisera klienter, det finns alltså ingen form av HA-lösning utom switcharna och accesspunkterna i nätet väljer själv vilken server dom vill prata med för stunden.
Båda servrarna har en RADIUS-server som för nyare kunder kör direkt på systemet och för äldre kunder kör i en container. Båda servrarna har också en Postgres-databas som alltid kör i en container.
Felsökning
På varje server finns det ett script ("/root/radiustest.sh") som testar det mesta som rör inloggning av klienter. Exempel hos KMH:
: 07:50 root@kmh-nac1: ~ # ./radiustest.sh
[Fri Oct 27 07:50:15 UTC 2023] Container nac_nac_api_1: PASS: Container nac_nac_api_1 is running!
[Fri Oct 27 07:50:15 UTC 2023] Container nac_nac_postgres_1: PASS: Container nac_nac_postgres_1 is running!
[Fri Oct 27 07:50:15 UTC 2023] Container nac_front_nac_front_1: PASS: Container nac_front_nac_front_1 is running!
[Fri Oct 27 07:50:15 UTC 2023] Disk: PASS: Enough free space on "/dev/root (29% used)"
[Fri Oct 27 07:50:15 UTC 2023] Disk: PASS: Enough free space on "/dev/vda15 (6% used)"
[Fri Oct 27 07:50:15 UTC 2023] EAP: PASS: Eduroam with user testuser1@sunet.se works!
[Fri Oct 27 07:50:15 UTC 2023] EAP: PASS: AD/LDAP with user xxx works!
[Fri Oct 27 07:50:16 UTC 2023] RADIUS: PASS: Port-auth to RADIUS-server works!
[Fri Oct 27 07:50:17 UTC 2023] Ping: PASS: Could ping Eduroam R1 (192.36.171.226)!
[Fri Oct 27 07:50:18 UTC 2023] Ping: PASS: Could ping Eduroam R2 (192.36.171.227)!
[Fri Oct 27 07:50:19 UTC 2023] Ping: PASS: Could ping KMH NAC2 (10.103.1.13)!
: 07:50 root@kmh-nac1: ~ #
Varje server har en Postgres-databas med information om klienter. Det att kolla i databasen om några klienter lyckas autentisera. I databasen finns en tabell som heter radpostauth som innehåller information om när en klient senast försökte autentisera och om det gick bra eller ej. Databasen består av en Docker-container med Postgres och går att ansluta till:
: 07:53 root@kmh-nac1: ~ # docker exec -it nac_nac_postgres_1 psql -U cnaas nac
psql (11.16 (Debian 11.16-1.pgdg90+1))
Type "help" for help.
nac=#
För att se vilka klienter som senast loggat in:
nac=# select username,reply,authdate from radpostauth order by id desc limit 100;
username | reply | authdate
-------------------------------------------+---------------+-------------------------------
aaa@vassar.edu | Access-Accept | 2023-10-27 07:56:35.817391+00
bbb@student.kmh.se | Access-Reject | 2023-10-27 07:56:34.513482+00
50:a0:30:08:27:18 | Access-Reject | 2023-10-27 07:56:27.071413+00
78:7b:8a:e1:b1:40 | Access-Reject | 2023-10-27 07:56:26.94749+00
ccc@kmh.se | Access-Accept | 2023-10-27 07:56:26.225286+00
ddd@kmh.se | Access-Accept | 2023-10-27 07:56:26.192282+00
Som man ser ovan syns användarnamnet eller MAC-adressen som försökt autentisera, resultatet och tidpunkten. Det är helt normalt att användare både lyckas (Access-Accept) och misslyckas (Access-Reject). Om en användare t.ex. försöker med fel lösenord får dom en reject. Det viktiga är att det kommer in nya användare och att någon får en accept.
Disable debug from radiator:
: 13:03 root@kmh-nac1: /var/log # radmin radmin version 3.0.26, built on Jan 4 2023 at 03:23:09 - FreeRADIUS Server administration tool. Copyright (C) 2008-2019 The FreeRADIUS server project and contributors. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. You may redistribute copies of FreeRADIUS under the terms of the GNU General Public License v2. radmin> debug level 0 radmin> exit
Active Directory
GIH, KMH och MDH kör Active Directory och vi ansluter till deras AD för att autentisera och auktorisera klienter. För att kunna prata med AD-servern måste våra NAC-servrar finnas med i samma domän och vara ansluten till AD-servern. Anslutningen överlever en omstart av servrarna och ska inte behöva göras igen men för att kolla så kopplingen till AD fungerar går det att använda "wbinfo". Om en ping lyckas och alla grupper går att lista fungerar AD-kopplingen:
: 08:02 root@kmh-nac1: ~ # wbinfo -p
Ping to winbindd succeeded
: 08:25 root@kmh-nac1: ~ # wbinfo -g
...
För att kunna göra detta använder vi kundens DNS-servrar och konfigurerar dom i resolv.conf. Om kunden av någon anledning byter namnservrar måste detta uppdateras.
: 08:02 root@kmh-nac1: ~ # cat /etc/resolv.conf
# This is /run/systemd/resolve/resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 10.10.1.62
nameserver 10.10.1.63
search cnaas.io
: 08:02 root@kmh-nac1: ~ #
För att felsöka en klient som autentiserar via FreeRADIUS
Börja med att slå på mer loggning i servern, detta kan göras med kommandot "radmin" och sedan "debug level 3". Detta kommer att skriva ut mer information till loggen i Docker-containern som FreeRADIUS körs i och på dom system som inte kör FreeRADIUS i en Docker-container så hamnar det i /var/log/freeradius/radius.log.
OBS: Glöm inte att sätta tillbaka debug level till 0 när du är klar annars kommer loggen att växa väldigt fort och riskrera att fylla upp allt ledigt diskutrymme.
När du har mer loggning så kan du se vad som händer när klienten försöker autentisera. Om det är något som inte fungerar så kommer det att stå i loggen. Leta börja med att leta i loggen efter det användarnamn klienten försöker autentisera med och se om det finns något felmeddelande där. Alternativt den MAC-adress som klienten försöker autentisera med.
Om klienten lyckas autentisera ska FreeRADIUS skicka en Access-Accept annars en Access-Reject.
De vanligaste orsakerna till att en klient inte kan autentisera är:
1. Klienten har inte anslutit alls. Det går att se i en SQL-databas
om en klient har försökt ansluta eller ej och om det gick.
Exempel:
: 07:53 root@kmh-nac1: ~ # docker exec -it nac_nac_postgres_1 psql -U cnaas nac
nac=# select * from radpostauth where username = 'aa:bb:cc:dd:ee:ff' order by id desc limit 10;
id | username | pass | reply | calledstationid | callingstationid | authdate
-----------+-------------------+-------------------+---------------+-----------------+------------------+-------------------------------
206113678 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 07:51:22.690465+00
206111387 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 07:34:04.695947+00
206108626 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 07:13:18.493735+00
206107827 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 07:09:38.110926+00
206105267 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:55:35.675794+00
206104981 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:53:36.973087+00
206104905 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:53:04.352627+00
206104677 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:51:26.458762+00
206104572 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:50:33.779772+00
206103755 | aa:bb:cc:dd:ee:ff | aa:bb:cc:dd:ee:ff | Access-Accept | | | 2024-09-10 06:43:46.589659+00
(10 rows)
MAC-adressen aa:bb:cc:dd:ee:ff ovan kan bytas ut mot godtyckligt
användarnamn, t.ex. kristofer@sunet.se.
2. Klienten skickar fel användarnamn eller lösenord. Kolla i loggen om
det står något om att lösenordet är fel. Exempel med ntlm_auth:
(295552725) mschap: Creating challenge hash with username: aan22023@mdu.se
(295552725) mschap: Client is using MS-CHAPv2
(295552725) mschap: Executing: /usr/bin/ntlm_auth --allow-mschapv2 --request-nt-key --domain=ad.mdu.se --username=%{%{Stripped-User-Name}:-%{%{mschap:User-Name}:-%{%{User-Name}:-None}}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}:
(295552725) mschap: EXPAND --username=%{%{Stripped-User-Name}:-%{%{mschap:User-Name}:-%{%{User-Name}:-None}}}
(295552725) mschap: --> --username=aan22023
(295552725) mschap: Creating challenge hash with username: aan22023@mdu.se
(295552725) mschap: EXPAND --challenge=%{%{mschap:Challenge}:-00}
(295552725) mschap: --> --challenge=0e1fc4babff7259c
(295552725) mschap: EXPAND --nt-response=%{%{mschap:NT-Response}:-00}
(295552725) mschap: --> --nt-response=108846d60534ed84e88eb03b822affeb20bf66e5bb246a78
(295552577) Cleaning up request packet ID 7 with timestamp +25374511
(295552725) mschap: ERROR: Program returned code (1) and output 'The attempted logon is invalid. This is either due to a bad username or authentication information. (0xc000006d)'
(295552725) mschap: External script failed
(295552725) mschap: ERROR: External script says: The attempted logon is invalid. This is either due to a bad username or authentication information. (0xc000006d)
(295552725) mschap: ERROR: MS-CHAP2-Response is incorrect
3. Klienten använder ett certifikat som inte är giltigt. Kolla i loggen
om det står något om att certifikatet är ogiltigt. T.ex:
(295553470) Received Access-Request Id 198 from 10.130.10.31:46426 to 172.31.0.20:1812 length 259
(295553470) User-Name = "pelle123@mdu.se"
(295553470) NAS-IP-Address = 1.2.3.4
(295553470) NAS-Identifier = "30:86:XX:XX:B2:7F-eduroam"
(295553470) Called-Station-Id = "30-86-XX-XX-B2-7F-eduroam"
(295553470) NAS-Port-Type = Wireless-802.11
(295553470) NAS-Port = 12
...
(295553470) eap_peap: Initiating new EAP-TLS session
(295553470) eap_peap: [eaptls start] = request
...
(295552725) eap: ERROR: TLS Alert write:fatal:unknown CA