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

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.

GNS3 : FreeRadius et Active Directory

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *