I Objectif
L’objectif est de faire la vérification du compte ordinateur et utilisateur Windows via FreeRadius qui lui même demandera auprès d’un annuaire Active Directory de Microsoft.
II Serveur de temps
Pour communiquer avec un contrôleur de domaine et dans le cadre de l’authentification KERBEROS il faut une synchronisation horaire parfaite.
Pour cela, le service NTP sera monté sur le serveur windows et le serveur Linux se synchronisera dessus.
Sur Windows en tant que serveur NTP :
#enable NTP Server
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\w32time\TimeProviders\NtpServer" -Name "Enabled" -Value 1
#flag 5
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\services\W32Time\Config" -Name "AnnounceFlags" -Value 5
#Restart NTP Server
Restart-Service w32Time
Sous Linux en tant que client NTP récupérant l’heure :
apt install ntp
Modifier le fichier de configuration /etc/ntp.conf en ajoutant le serveur 192.168.30.101, adresse IP du serveur AD

relancer le service
systemctl restat ntp
Pour vérifier :
date
Bref : se synchroniser sur W32time d’un serveur AD ne fonctionne pas … Sans perdre de temps à installer un serveur de temps pour les 2 serveurs, je suis passé par les virtualsbox tool pour effecteur cette synchronisation….
III Intégrer le serveur Linux dans un domaine AD
Ceci est nécessaire pour que Linux puisse vérifier des identifiants Windows.
III.1 Définir la résolution DNS sur le serveur Linux
Modifier sur le serveur Linux le fichier /etc/resolv.conf. Y renseigner les valeurs suivantes :
domain domaine.local
search domaine.local
nameserver 192.168.30.101
III.2 Outil samba et kerberos
Installer les outils suivants :
apt install samba winbind samba-common-bin krb5-user -y
III.3 Kerberos
Modifier le fichier /etc/krb5.conf

Initier un ticket kerberos avec le contrôleur de domaine :
kinit Administrateur@DOMAINE.LOCAL
Renseigner le mot de passe. Si pas de retour, c’est que c’est bon.
Vérifier si ticket obtenu :
klist
Exemple de résultat ci-dessous :

III.4 SAMBA
Modifier le fichier /etc/samba/smb.conf comme suivant :

redémarrer le service samba :
systemctl restart smbd
III.5 Intégrer le serveur Linux dans le domaine
Taper la commande suivante :
net ads join -U Administrateur
si dans le résultat la ligne suivante apparaît, alors le PC est bien enregistré dans le domaine :
...
Joined 'DEBIANGNS3' to realm 'domaine.local'
...
Côté serveur windows :

III.6 Interrogation de l’AD
Pour vérifier si on obtient des informations du contrôleur AD :
wbinfo -t
ce qui donne le résultat suivant :

Exemple pour retrouver les comptes utilisateurs :
wbinfo -u

Pour tester un identifiant Windows :
wbinfo -a Xavior%motdepasse

La deuxième ligne indique que l’authentification a réussie.
IV Configuration du serveur FreeRadius
IV.1 Préambule
Un client Windows 10 va envoyer 2 types de requêtes Radius :
- une requête de type « Host » pour authentifier le PC : le nom d’utilisateur sera de la forme « host/nom_PC.domaine ». Dans notre cas ce sera « host/PC1.domaine.local »
- une requête de type « User » pour authentifier l’utilisateur une fois que la session Windows est ouverte : le nom d’utilisateur aura la forme « Nom_DOMAINE_NT/utilisateur ». Dans notre cas ce sera « DOMAINE/Xavior »
Lors de l’authentification du PC réussie, le PC sera placé dans le VLAN 20. Dans ce VLAN, l’Active Directory est accessible ce qui permettra au PC de vérifier le compte de session. Une fois le compte vérifié (surtout lors de la première ouverture de session), une trame radius est envoyée. Pas avant.
Et lors de l’authentification de l’utilisateur, l’ordinateur sera placé dans le VLAN 10.
Ce paragraphe ne vas pas traiter la gestion des certificats. En revanche il va être étudier les 2 types d’authentifications.
IV.2 Droits pour utiliser winbind pour FreeRadius
sudo usermod -a -G winbindd_priv freerad
sudo chgrp winbindd_priv /var/lib/samba/winbindd_privileged/
IV.3 Modification des fichiers de configuration des modules eap et mschap
Fichier /etc/freeradius/3.0/mods-enable/eap :
eap {
default_eap_type = mschapv2
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
max_sessions = ${max_requests}
md5 {
}
leap {
}
gtc {
auth_type = PAP
}
tls-config tls-common {
private_key_password = whatever
private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
ca_file = /etc/ssl/certs/ca-certificates.crt
dh_file = ${certdir}/dh
random_file = /dev/urandom
ca_path = ${cadir}
cipher_list = "DEFAULT"
cipher_server_preference = no
ecdh_curve = "prime256v1"
cache {
lifetime = 24 # hours
}
verify {
}
ocsp {
enable = no
override_cert_url = yes
url = "http://127.0.0.1/ocsp/"
}
}
tls {
tls = tls-common
}
ttls {
tls = tls-common
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "inner-tunnel"
}
peap {
tls = tls-common
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
virtual_server = "inner-tunnel"
}
mschapv2 {
}
}
Fichier /etc/freeradius/3.0/mods-enable/mschap :
mschap {
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
# en rouge : permet l'authentification des comptes ordinateurs
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --DOMAIN=DOMAINE --userr
name=%{%{Stripped-User-Name}:-%{%{mschap:User-Name}:-None}} --challenge=%{%{mschh
ap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
pool {
start = ${thread[pool].start_servers}
min = ${thread[pool].min_spare_servers}
max = ${thread[pool].max_servers}
spare = ${thread[pool].max_spare_servers}
uses = 0
retry_delay = 30
lifetime = 86400
cleanup_interval = 300
idle_timeout = 600
}
passchange {
}
}
IIV.4 Module NTLM_AUTH
Modifier le fichier suivant : /etc/freeradius/3.0/ntlm_auth :
exec ntlm_auth {
wait = yes
program = "/usr/bin/ntlm_auth --request-nt-key --domain=DOMAINE --usernaa
me=%{mschap:User-Name} --password=%{User-Password}"
}
Pour le domaine il faut indiquer le nom de domaine court de l »AD : ici « DOMAINE ».
IV.5 Configuration de « default » et « inner »
Modifier le fichier /etc/freeradius/3.0/sites-enabled/default
server default {
listen {
type = auth
ipaddr = *
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
listen {
ipaddr = *
port = 0
type = acct
limit {
}
}
listen {
type = auth
ipv6addr = :: # any. ::1 == localhost
port = 0
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
listen {
ipv6addr = ::
port = 0
type = acct
limit {
}
}
authorize {
# NE SURTOUT PAS METTRE NTLM_AUTH ICI !!!
#ntlm_auth
filter_username
mschap
digest
# Utilisation multiple de type de realms : modifier le fichier realm et mettre la directive "ignore_null = yes"
ntdomain # compte de type DOMAINE/Xavior
suffix # compte de type xavior@domaine.local
eap {
# ok = return
# updated = return
}
files
-sql
-ldap
expiration
logintime
pap
}
authenticate {
ntlm_auth
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
eap
}
preacct {
preprocess
suffix
# ntdomain
files
}
accounting {
detail
unix
-sql
exec
attr_filter.accounting_response
}
session {
}
post-auth {
update {
&reply: += &session-state:
}
-sql
exec
remove_reply_message_if_eap
Post-Auth-Type REJECT {
-sql
attr_filter.access_reject
eap
remove_reply_message_if_eap
}
Post-Auth-Type Challenge {
}
}
pre-proxy {
}
post-proxy {
eap
}
}
Modifier le fichier /etc/freeradius/3.0/sites-enabled/inner-tunnel :
server inner-tunnel {
listen {
ipaddr = 127.0.0.1
port = 18120
type = auth
}
authorize {
filter_username
chap
mschap
# Utilisation multiple de type de realms : modifier le fichier realm et mettre la directive "ignore_null = yes"
ntdomain
suffix
update control {
&Proxy-To-Realm := LOCAL
}
eap {
ok = return
}
files
-sql
-ldap
expiration
logintime
pap
}
authenticate {
ntlm_auth
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
mschap
eap
}
session {
radutmp
}
post-auth {
-sql
if (0) {
update reply {
User-Name !* ANY
Message-Authenticator !* ANY
EAP-Message !* ANY
Proxy-State !* ANY
MS-MPPE-Encryption-Types !* ANY
MS-MPPE-Encryption-Policy !* ANY
MS-MPPE-Send-Key !* ANY
MS-MPPE-Recv-Key !* ANY
}
update {
&outer.session-state: += &reply:
}
}
Post-Auth-Type REJECT {
-sql
attr_filter.access_rejet
update outer.session-state {
&Module-Failure-Message := &request:Module-Failure-Messaa
ge
}
}
}
pre-proxy {
}
post-proxy {
eap
}
}
IV.6 Modification du module REALM :
Modifier le le fichier /etc/freeradius/3.0/mods-enabled/realm :
realm IPASS {
format = prefix
delimiter = "/"
ignore_null=yes
}
realm suffix {
format = suffix
delimiter = "@"
}
realm realmpercent {
format = suffix
delimiter = "%"
}
realm ntdomain {
format = prefix
delimiter = "\\"
ignore_null = yes
}
remarque : on peut mettre aussi ignore_null=yes dans le realm suffix
IV.7 Authorisation des clients à effectuer des requêtes (NAS) :
Modifier le fichier /etc/freeradius/3.0/clients.conf :
# Requêtes venant du Routeur CISCO
client 192.168.30.254 {
secret = test
nastype = cisco
shortname = routeur3
}
# Requêtes effectuées ennnn local
client localhost {
ipaddr = 127.0.0.1
proto = *
secret = testing123
require_message_authenticator = no
nas_type = other # localhost isn't usually a NAS...
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
client localhost_ipv6 {
ipv6addr = ::1
secret = testing123
}
IV.8 Configuration de proxy.conf
Modifier le fichier /etc/freeradius/3.0/proxy.conf :
proxy server {
default_fallback = no
}
home_server localhost {
type = auth
ipaddr = 127.0.0.1
port = 1812
secret = testing123
response_window = 20
zombie_period = 40
revive_interval = 120
status_check = status-server
check_interval = 30
check_timeout = 4
num_answers_to_alive = 3
max_outstanding = 65536
coa {
irt = 2
mrt = 16
mrc = 5
mrd = 30
}
limit {
max_connections = 16
max_requests = 0
lifetime = 0
idle_timeout = 0
}
}
home_server_pool my_auth_failover {
type = fail-over
home_server = localhost
}
# Définition du royaume "DOMAINE" : si rencontré l'authentification se fait en local
realm DOMAINE {
authhost = LOCAL
accthost = LOCAL
#nostrip
}
# Définition du royaume "DOMAINE" : si rencontré l'authentification se fait en local
realm domaine.local {
authhost = LOCAL
accthost = LOCAL
}
# Par défaut : l'authentification se fait en local
realm DEFAULT {
type = radius
authhost = LOCAL
accthost = LOCAL
secret = testing123
nostrip
}
realm LOCAL {
# If we do not specify a server pool, the realm is LOCAL, and
# requests are not proxied to it.
}
IV.9 Définition des users
Modifier le fichier /etc/freeradius/3.0/users :
# Compte de test
test Cleartext-password :="test"
Service-Type = NAS-Prompt-User,
cisco-avpair = "shell:priv-lvl=15"
# Pour les comptes utilisateurs. On prend comme filtre le royaume DOMAINE
DEFAULT Realm == DOMAINE
Auth-Type = ntlm_auth,
Tunnel-Type = 13,
Tunnel-Medium-type=6,
Tunnel-private-Group-Id = 10
# Pour les autres comptes (va prendre les autres comptes dont principalement les comptes ordinateurs)
DEFAULT Auth-Type = ntlm_auth
Tunnel-Type = 13,
Tunnel-Medium-type=6,
Tunnel-private-Group-Id = 20
DEFAULT Framed-Protocol == PPP
Framed-Protocol = PPP,
Framed-Compression = Van-Jacobson-TCP-IP
DEFAULT Hint == "CSLIP"
Framed-Protocol = SLIP,
Framed-Compression = Van-Jacobson-TCP-IP
DEFAULT Hint == "SLIP"
Framed-Protocol = SLIP
C’est ici que nous définnissons la politique d’attribution des VLAN en fonction :
- des comptes utilisateurs : VLAN 10
- des comptes ordinateurs : VLAN 20
IV.10 Tests
Pour tester le fonctionnement général il faut utiliser l’outil radtest.
Exemple pour un compte avec interrogation MSCHAP
root@debianGNS3:/etc/freeradius/3.0# radtest -t mschap DOMAINE\\xavior bonmotdepasse 127.0.0.1 0 testing123
Sent Access-Request Id 93 from 0.0.0.0:52425 to 127.0.0.1:1812 length 140
User-Name = "DOMAINE\\xavior"
MS-CHAP-Password = "Quentin94#!"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "Quentin94#!"
MS-CHAP-Challenge = 0x4175b072178baf54
MS-CHAP-Response = 0x00010000000000000000000000000000000000000000000000009b55cc859f0cf687300661bf0015db33c94dbca3182fb078
Received Access-Accept Id 93 from 127.0.0.1:1812 to 127.0.0.1:52425 length 100
Tunnel-Type:0 = VLAN
Tunnel-Medium-Type:0 = IEEE-802
Tunnel-Private-Group-Id:0 = "10"
MS-CHAP-MPPE-Keys = 0x00000000000000000e6c59acb5726f152ecc9e23a180b550
MS-MPPE-Encryption-Policy = Encryption-Required
MS-MPPE-Encryption-Types = 4
root@debianGNS3:/etc/freeradius/3.0#
Autre exemple lorsque les idientifiants sont incorrects :
root@debianGNS3:/etc/freeradius/3.0# radtest -t mschap DOMAINE\\xavior mauvaismdp 127.0.0.1 0 testing123
Sent Access-Request Id 141 from 0.0.0.0:38652 to 127.0.0.1:1812 length 140
User-Name = "DOMAINE\\xavior"
MS-CHAP-Password = "Quentin94#"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "Quentin94#"
MS-CHAP-Challenge = 0xf1560c7caad5892d
MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000334175190830b74ee71fb9f6e135534d6fe15d52b447b790
Received Access-Reject Id 141 from 127.0.0.1:1812 to 127.0.0.1:38652 length 61
MS-CHAP-Error = "\000E=691 R=1 C=b75d0ff87c645e4d V=2"
(0) -: Expected Access-Accept got Access-Reject
Pour voir le détail des erreurs, il faut lancer le serveur radius en mode debug :
systemctl stop freeradius
freeradius -X
Extrait :
(0) Received Access-Request Id 221 from 127.0.0.1:49684 to 127.0.0.1:1812 length 140
(0) User-Name = "DOMAINE\\Xavior"
(0) NAS-IP-Address = 127.0.1.1
(0) NAS-Port = 0
(0) Message-Authenticator = 0xe0a9a7c295d3c830d3d064eee1461e78
(0) MS-CHAP-Challenge = 0xf6748267f1c3811d
(0) MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000688b47f11888782c4af798e104f740b90ea770e0fc6d1b28
(0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default
(0) authorize {
(0) policy filter_username {
(0) if (&User-Name) {
(0) if (&User-Name) -> TRUE
(0) if (&User-Name) {
(0) if (&User-Name =~ / /) {
(0) if (&User-Name =~ / /) -> FALSE
(0) if (&User-Name =~ /@[^@]*@/ ) {
(0) if (&User-Name =~ /@[^@]*@/ ) -> FALSE
(0) if (&User-Name =~ /\.\./ ) {
(0) if (&User-Name =~ /\.\./ ) -> FALSE
(0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) {
(0) if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/)) -> FALSE
(0) if (&User-Name =~ /\.$/) {
(0) if (&User-Name =~ /\.$/) -> FALSE
(0) if (&User-Name =~ /@\./) {
(0) if (&User-Name =~ /@\./) -> FALSE
(0) } # if (&User-Name) = notfound
(0) } # policy filter_username = notfound
(0) [preprocess] = ok
(0) [chap] = noop
(0) mschap: Found MS-CHAP attributes. Setting 'Auth-Type = mschap'
(0) [mschap] = ok
(0) [digest] = noop
(0) ntdomain: Checking for prefix before "\"
(0) ntdomain: Looking up realm "DOMAINE" for User-Name = "DOMAINE\Xavior"
(0) ntdomain: Found realm "DOMAINE"
(0) ntdomain: Adding Stripped-User-Name = "Xavior"
(0) ntdomain: Adding Realm = "DOMAINE"
(0) ntdomain: Authentication realm is LOCAL
(0) [ntdomain] = ok
(0) suffix: Request already has destination realm set. Ignoring
(0) [suffix] = noop
(0) eap: No EAP-Message, not doing EAP
(0) [eap] = noop
(0) files: users: Matched entry DEFAULT at line 90
(0) [files] = ok
(0) [expiration] = noop
(0) [logintime] = noop
(0) pap: WARNING: No "known good" password found for the user. Not setting Auth-Type
(0) pap: WARNING: Authentication will fail unless a "known good" password is available
(0) [pap] = noop
(0) } # authorize = ok
(0) Found Auth-Type = mschap
(0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default
(0) authenticate {
(0) mschap: Client is using MS-CHAPv1 with NT-Password
(0) mschap: Executing: /usr/bin/ntlm_auth --request-nt-key --DOMAIN=DOMAINE --username=%{%{Stripped-User-Name}:-%{%{mschap:User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}:
(0) mschap: EXPAND --username=%{%{Stripped-User-Name}:-%{%{mschap:User-Name}:-None}}
(0) mschap: --> --username=Xavior
(0) mschap: mschap1: f6
(0) mschap: EXPAND --challenge=%{%{mschap:Challenge}:-00}
(0) mschap: --> --challenge=f6748267f1c3811d
(0) mschap: EXPAND --nt-response=%{%{mschap:NT-Response}:-00}
(0) mschap: --> --nt-response=688b47f11888782c4af798e104f740b90ea770e0fc6d1b28
(0) 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)'
(0) mschap: External script failed
(0) mschap: ERROR: External script says: The attempted logon is invalid. This is either due to a bad username or authentication information. (0xc000006d)
(0) mschap: ERROR: MS-CHAP2-Response is incorrect
(0) [mschap] = reject
(0) } # authenticate = reject
(0) Failed to authenticate the user
(0) Using Post-Auth-Type Reject
(0) # Executing group from file /etc/freeradius/3.0/sites-enabled/default
(0) Post-Auth-Type REJECT {
(0) attr_filter.access_reject: EXPAND %{User-Name}
(0) attr_filter.access_reject: --> DOMAINE\\Xavior
(0) attr_filter.access_reject: Matched entry DEFAULT at line 11
(0) [attr_filter.access_reject] = updated
(0) [eap] = noop
(0) policy remove_reply_message_if_eap {
(0) if (&reply:EAP-Message && &reply:Reply-Message) {
(0) if (&reply:EAP-Message && &reply:Reply-Message) -> FALSE
(0) else {
(0) [noop] = noop
(0) } # else = noop
(0) } # policy remove_reply_message_if_eap = noop
(0) } # Post-Auth-Type REJECT = updated
(0) Login incorrect (mschap: Program returned code (1) and output 'The attempted logon is invalid. This is either due to a bad username or authentication information. (0xc000006d)'): [DOMAINE\Xavior/<via Auth-Type = mschap>] (from client localhost port 0)
(0) Delaying response for 1.000000 seconds
Waking up in 0.1 seconds.
Waking up in 0.8 seconds.
(0) Sending delayed response
(0) Sent Access-Reject Id 221 from 127.0.0.1:1812 to 127.0.0.1:49684 length 61
(0) MS-CHAP-Error = "\000E=691 R=1 C=a60b650e4b95b559 V=2"
Waking up in 3.9 seconds.
(0) Cleaning up request packet ID 221 with timestamp +61
Ready to process requests
Pour tester avec le protocole mschapV2, ce n’est pas possible avec l’outil « radtest ». Cependant si cela fonctionne en mschap cela devrait fonctionner avec mschapv2. Ne pas oublier de mettre la directive « with_ntdomain_hack=yes » dans le ficher /etc/freeradius/3.0/mods-enable/mschap.
Enfin ci dessous les traces de log observées dans le fichier /var/log/freeradius/radius.log pour 4 connexions :
Sat Jan 2 17:50:12 2021 : Auth: (14) Login OK: [host/PC1.domaine.local/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40 via TLS tunnel)
Sat Jan 2 17:50:12 2021 : Auth: (15) Login OK: [host/PC1.domaine.local/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40)
Sat Jan 2 17:50:44 2021 : Auth: (24) Login OK: [DOMAINE\xavior/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40 via TLS tunnel)
Sat Jan 2 17:50:44 2021 : Auth: (25) Login OK: [DOMAINE\xavior/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40)
Sat Jan 2 17:51:06 2021 : Auth: (34) Login OK: [host/PC1.domaine.local/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40 via TLS tunnel)
Sat Jan 2 17:51:06 2021 : Auth: (35) Login OK: [host/PC1.domaine.local/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40)
Sat Jan 2 17:51:38 2021 : ERROR: (43) 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)'
Sat Jan 2 17:51:38 2021 : Auth: (43) Login incorrect (mschap: Program returned code (1) and output 'The attempted logon is invalid. This is either due to a bad username or authentication information. (0xc000006d)'): [Xavior/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40 via TLS tunnel)
Sat Jan 2 17:51:38 2021 : Info: (44) eap_peap: This means you need to read the PREVIOUS messages in the debug output
Sat Jan 2 17:51:38 2021 : Info: (44) eap_peap: to find out the reason why the user was rejected
Sat Jan 2 17:51:38 2021 : Info: (44) eap_peap: Look for "reject" or "fail". Those earlier messages will tell you
Sat Jan 2 17:51:38 2021 : Info: (44) eap_peap: what went wrong, and how to fix the problem
Sat Jan 2 17:51:38 2021 : Auth: (44) Login incorrect (eap_peap: The users session was previously rejected: returning reject (again.)): [Xavior/<via Auth-Type = eap>] (from client routeur3 port 3 cli 08-00-27-91-55-40)
Ici pour les 4 connexions on s’apercoit que :
- la première correspond à l’authentification du compte d’ordinateur ;
- la deuxième à l’authentification d’une compte de domaine suite à une ouverture de session ;
- la troisième est l’authentification du compte d’ordinateur suite à la fermeture de la session utilisateur ;
- la quatrième est l’authentification (non réussie) d’un compte utilisateur local au PC.
IV.11 Quelques liens qui ont permis de comprendres les rôles et fonctions de chaque fichier de configuration
- https://blog.stevedong.com/post/how-to-install-and-configure-freeradius-with-active-directory-allow-allow-specific-group-of-users-to-authenticate-in-debian-10/
- https://www.dangtrinh.com/2017/03/wpa2-enterprise-with-freeradius-and-ad.html
- https://keep.tylenn.fr/2018/03/14/guide-freeradius-vlan-active-directory/
- https://blog.fenrir.fr/2013/09/07/freeradius-activedirectory/
- http://deployingradius.com/documents/configuration/active_directory.html
- https://cric.grenoble.cnrs.fr/Administrateurs/Documentations/SiteWebAuthentification/InstallationFreeRadius.php
V Configuration du routeur CISCO
V.1 Schéma du labo de test sous GNS3

V.2 Configuration du Routeur R1
Les ports et le changement de Vlan ne sont ouverts que pour des ordinateurs ou utilisateurs authentifiés. Pour les autres pas de communications possibles.
Ci dessous :
- en bleu les configurations importantes concerant le RADIUS
- en violet les configurations importantes concerant le DHCP
Extrait du running config :
R1#show running-config
Building configuration...
Current configuration : 2150 bytes
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R1
!
boot-start-marker
boot-end-marker
!
!
aaa new-model
!
!
aaa authentication dot1x default group radius
aaa authorization network default group radius
!
!
aaa session-id common
memory-size iomem 5
no ip icmp rate-limit unreachable
!
!
ip cef
no ip domain lookup
!
!
multilink bundle-name authenticated
!
!
...
!
!
dot1x system-auth-control
archive
log config
hidekeys
!
!
!
!
ip tcp synwait-time 5
!
!
!
!
interface FastEthernet0/0
no ip address
shutdown
duplex auto
speed auto
!
interface FastEthernet0/1
no ip address
shutdown
duplex auto
speed auto
!
interface FastEthernet1/0
!
interface FastEthernet1/1
switchport access vlan 10
!
interface FastEthernet1/2
switchport access vlan 20
!
interface FastEthernet1/3
dot1x pae authenticator
dot1x port-control auto
!
interface FastEthernet1/4
!
interface FastEthernet1/5
!
interface FastEthernet1/6
!
interface FastEthernet1/7
!
interface FastEthernet1/8
!
interface FastEthernet1/9
!
interface FastEthernet1/10
!
interface FastEthernet1/11
!
interface FastEthernet1/12
!
interface FastEthernet1/13
!
interface FastEthernet1/14
switchport access vlan 30
!
interface FastEthernet1/15
switchport access vlan 30
!
interface Vlan1
no ip address
!
interface Vlan10
ip address 192.168.10.254 255.255.255.0
ip helper-address 192.168.30.101
!
interface Vlan20
ip address 192.168.20.254 255.255.255.0
ip helper-address 192.168.30.101
!
interface Vlan30
ip address 192.168.30.254 255.255.255.0
!
!
no ip http server
no ip http secure-server
ip forward-protocol nd
!
!
!
no cdp log mismatch duplex
!
!
!
radius-server host 192.168.30.100 auth-port 1812 acct-port 1813
radius-server key test
!
control-plane
!
...
!
!
line con 0
exec-timeout 0 0
privilege level 15
logging synchronous
line aux 0
exec-timeout 0 0
privilege level 15
logging synchronous
line vty 0 4
!
!
end
VI Configuration du serveur DHCP
Le serveur DHCP est supporté par le contrôleur de domaine Windows. Suivant le VLAN 10 ou 20, les adresses ip seront soit 192.168.10.0/24 ou 192.168.20.0/24.
Sans entrer dans le détail de la configuration, ci-dessous un extrait du serveur DHCP configuré :

VII Pour aller plus loin
L’objectif de n’ouvrir que les ports et de basculer les VLAN en fonction des comptes Utilisateurs ou Ordinateurs fonctionne.
Pour aller plus loin et obtenir plus de sécurité il faut :
- définir des ACL sur le VLAN n’authorisant que l’accès au controleur de domaine (et pas le reste des ressources reséaux) ;
- ajouter un contrôleur de domaine en lecteure seule (RODC) et renvoyer les requêtes RADIUS dessus (du moins lors de l’authentification des comptes d’ordinateurs) ;
- implémenter les certificats lors des communications PEAP ;
- forcer la mise à jour des adresses IP des postes Windows après ouverture de session – voir comment faire à la fermeture de session.