Authentification Wi‑Fi NPS : cumuler comptes AD locaux et RADIUS distant (UniFi, Windows Server)

Faites cohabiter, sur un même NPS Windows Server 2016, l’authentification Wi‑Fi des comptes AD locaux et celle d’un second serveur RADIUS : compréhension du flux, règles NPS, astuces UniFi, journalisation et tests pour une configuration robuste et facilement maintenable.

Sommaire

Problématique

Votre contrôleur de domaine Windows Server 2016 héberge également Network Policy Server (NPS) et sert d’autorité RADIUS pour un réseau Wi‑Fi UniFi (WPA2/3‑Enterprise). Les comptes Active Directory s’authentifient correctement tant que NPS décide localement. Mais dès que vous créez un Remote RADIUS Server Group et modifiez votre Connection Request Policy (CRP) pour Forwarding to remote server, seuls les comptes distants fonctionnent ; les comptes AD locaux sont refusés.

La cause est structurelle : une CRP décide soit d’authentifier localement, soit de transférer. Pour « faire les deux », il faut segmenter les demandes via deux CRP distinctes, ordonnées et filtrées par des conditions précises (attributs RADIUS, format d’identité, SSID, etc.).

Architecture et prérequis

  • Un serveur Windows Server 2016 membre du domaine, rôle NPS installé et inscrit dans Active Directory pour autoriser l’authentification des utilisateurs du domaine.
  • Un réseau Wi‑Fi UniFi configuré en WPA2/3‑Enterprise (802.1X) pointant vers le NPS.
  • Un second serveur RADIUS (NPS, FreeRADIUS, appliance, etc.) hébergeant un autre référentiel d’identités.
  • Secrets partagés cohérents, ports UDP 1812 (auth) et 1813 (accounting) ouverts, horloge synchronisée (NTP).
  • Certificat serveur valide pour PEAP/EAP‑TLS : les clients doivent faire confiance à l’AC qui a émis ce certificat.

Solution récapitulative

ÉtapeActionDétails clés
1Configurer le groupe de serveurs RADIUS distantsDéclarez l’adresse IP/nom, ports UDP 1812/1813, secret partagé identique des deux côtés. Activez Accounting si vous tenez des journaux centralisés.
2Créer deux Connection Request Policies et les ordonnerCRP‑Local (priorité haute) : conditions qui caractérisent vos comptes AD (ex. identifiants sans suffixe, DOMAIN\user, SSID interne). Action : Authenticate requests on this server.
CRP‑Remote (priorité suivante) : conditions inverses (ex. user@exemple.com, SSID invité). Action : Forward to <Remote RADIUS Server Group>.
3Vérifier/Créer les Network PoliciesPour la partie locale : groupes AD autorisés, méthodes PEAP/EAP‑TLS, contraintes cryptographiques. Pour la partie distante : aucune Network Policy locale requise (c’est le serveur distant qui tranche).
4Contrôler l’ordre d’évaluationNPS lit les CRP de haut en bas et s’arrête à la première correspondance. Si CRP‑Remote est au‑dessus, toutes les demandes seront proxyfiées.
5Activer et lire la journalisation NPSActivez le journal texte et le canal d’événements Microsoft‑Windows‑NPS/Operational. Les événements indiquent la CRP et la Network Policy appliquées.
6Ouvrir les ports et synchroniser l’heureUDP 1812/1813 entre AP/contrôleur ↔ NPS ↔ serveur distant. NTP impératif (sinon échec EAP‑TLS).
7Tester et ajusterEnvoyez des identités représentatives : alice (local) et bob@example.com (distant). Analysez les journaux et l’appariement des CRP.
8Activer les options avancéesRéécriture d’attributs, délais/relances côté groupe distant, scénarios de délestage/fallback, classification par SSID/VLAN/NAS‑ID.

Étapes détaillées

Déclarer le groupe de serveurs RADIUS distants

  1. Ouvrez Network Policy ServerRADIUS Clients and ServersRemote RADIUS Server GroupsNew.
  2. Ajoutez le serveur distant : IP ou FQDN, port 1812 (authentification) et 1813 (accounting), secret partagé.
  3. Dans l’onglet Load Balancing : configurez Timeout (ex. 5 s) et Number of seconds between requests, ainsi que le nombre d’Attempts. Si vous avez plusieurs serveurs distants, ajustez l’ordre et la pondération.
  4. Si vous collectez l’accounting sur le serveur distant, activez l’onglet Accounting.

Définir une logique de répartition claire

Le cœur de la solution est de différencier les demandes. Choisissez des critères observables et stables :

SignalComment l’obtenirExemple de conditionUsage typique
Format de l’identité (User‑Name)Les clients envoient user, DOMAIN\user ou user@realmRegex .+@exemple\.com$ → distantSéparer UPN externe vs comptes AD internes
SSID / Called‑Station‑IDUniFi inclut MAC:SSID dans Called‑Station‑ID*:INVITES → distantRéseau invité géré par un RADIUS externe
NAS‑Identifier (NAS‑ID)Profil RADIUS UniFi ou AP affecte un NAS‑IDNAS‑ID guest‑gw → distantIdentifier une passerelle/contrôleur spécifique
VLAN attribué par le WLANCondition Tunnel‑Private‑Group‑ID après authentificationSSID interne → local, guest → distantSéparation de trafic
Origine des AP (RADIUS Client)Adresse IP des AP déclarés dans NPSAP bâtiment A → localMulti‑sites

Créer les Connection Request Policies

Dans Policies → Connection Request Policies :

CRP‑Local (priorité la plus haute)

  1. New → Nom : CRP‑Local, Type : Unspecified.
  2. Conditions : ajoutez un ou plusieurs critères qui captent vos identités locales, par exemple :
    • User‑Name does not match .+@exemple\.com$ (pas de suffixe externe)
    • OU User‑Name matches ^[^@\\]+$ (chaîne sans @ ni \)
    • OU Called‑Station‑ID contient votre SSID interne (ex. MAC:ENTREPRISE)
  3. Settings : Authenticate requests on this server.
  4. Authentication : laissez Authenticate on this server et passez à la configuration des Network Policies.

CRP‑Remote (priorité juste en dessous)

  1. New → Nom : CRP‑Remote.
  2. Conditions : définissez l’inverse des précédentes, par exemple :
    • User‑Name matches .+@exemple\.com$, ou Realm = exemple.com
    • OU Called‑Station‑ID contient le SSID invité (ex. MAC:INVITES)
    • OU NAS‑Identifier = guest‑gw
  3. Settings : Forward requests to the following remote RADIUS server group → choisissez votre groupe créé plus haut.
  4. Attribute manipulation (optionnel) : si nécessaire, ajoutez une règle pour User‑Name (ex. retirer un suffixe @ext ou en ajouter un) afin que le serveur distant reçoive le format d’identité attendu.

Créer/Vérifier les Network Policies locales

Les Network Policies ne s’appliquent que si la CRP décide « Authenticate on this server ». Créez au moins une policy « Accès Wi‑Fi interne » :

  1. Conditions : groupes AD autorisés (Windows Groups), NAS‑Port‑Type = Wireless – IEEE 802.11, SSID interne via Called‑Station‑ID si vous voulez affiner.
  2. Constraints : PEAP (EAP‑MSCHAPv2) et/ou EAP‑TLS selon votre stratégie. Assurez‑vous que le certificat serveur NPS est émis par une AC approuvée par les postes.
  3. Settings : chiffrement requis, éventuels attributs RADIUS (VLAN, session‑timeout) si vous affectez de la QoS ou des VLAN dynamiques depuis NPS.

Pour le trafic proxyfié (CRP‑Remote), aucune Network Policy locale n’est nécessaire ; c’est le serveur distant qui décide.

Contrôle de l’ordre et logique d’évaluation

NPS évalue d’abord les Connection Request Policies de haut en bas. À la première correspondance, il arrête l’évaluation et applique l’action (local vs proxy). Ce n’est qu’ensuite, si et seulement si l’action est « Authenticate on this server », que NPS évalue les Network Policies. Placez donc CRP‑Local au‑dessus de CRP‑Remote si vous souhaitez privilégier les identités AD quand l’intention n’est pas explicite.

if (CRP‑Local.conditions match) {
    authenticate_on_this_server();
} else if (CRP‑Remote.conditions match) {
    proxy_to_remote_group();
} else {
    reject("No matching Connection Request Policy");
}

Journalisation et diagnostic

Activez une visibilité maximale dès le début :

  • Fichier de log NPS : AccountingLog to a text file. Par défaut : %SystemRoot%\System32\LogFiles (format IAS). Vous pouvez convertir ces logs en CSV pour analyser les attributs.
  • Journal d’événements : Applications and Services Logs → Microsoft → Windows → NPS → Operational.
ID d’événementSignificationCe que vous devez vérifier
6272Accès accordéConfirme la CRP et la Network Policy utilisées, le type d’EAP et l’identité.
6273Accès refuséRaison du refus (groupes, contraintes EAP, certificat, mot de passe), CRP appliquée.
6278Requête ignoréeProblèmes de formulation (attributs manquants, stratégie non applicable) ou proxy non joignable.

Exemples PowerShell utiles :

# Derniers événements NPS pertinents
Get-WinEvent -LogName 'Microsoft-Windows-NPS/Operational' |
  Where-Object {$_.Id -in 6272,6273,6278} |
  Select-Object TimeCreated, Id, Message -First 30

# Export de la configuration NPS (sauvegarde)

netsh nps export filename="C:\Backup\nps-config.xml" exportPSK=YES 

Cas d’école UniFi

Dans l’interface UniFi (Network/Application), vérifiez :

  • RADIUS profile : adresse IP du NPS, secret, ports. Décidez si les AP envoient directement au NPS, ou si la passerelle/contrôleur proxy. Déclarez chaque émetteur dans RADIUS Clients du NPS (IP, secret, vendor = RADIUS Standard ou Ubiquiti si vous utilisez des attributs vendor‑specific).
  • SSID : activez WPA‑Enterprise et associez le profil RADIUS correct. Optionnel : définissez un NAS‑Identifier par SSID pour différencier la CRP (ex. NAS‑ID = ENTREPRISE vs NAS‑ID = INVITES).
  • Accounting : si vous centralisez l’accounting ailleurs, cochez‑le et envoyez vers le serveur concerné (local ou distant) selon votre architecture.

Attributs courants qu’UniFi inclut :

AttributExempleIntérêt pour la CRP
NAS‑Port‑TypeWireless‑IEEE 802.11Limiter aux requêtes Wi‑Fi (exclure VPN/dial‑in)
Called‑Station‑IDAA‑BB‑CC‑DD‑EE‑FF:ENTREPRISEIdentifier l’SSID (chaîne après :)
Calling‑Station‑ID11‑22‑33‑44‑55‑66 (MAC client)Audit, corrélation
NAS‑Identifierguest‑gwDécision CRP par profil/site

Tests et validations

Pour valider la mécanique CRP (sans nécessairement réaliser un EAP complet), vous pouvez utiliser des outils RADIUS « simples » qui envoient PAP/CHAP ; ils ne simulent pas PEAP/EAP‑TLS mais suffisent pour vérifier quelle CRP s’applique et quel serveur reçoit la demande.

  • NTRadPing sous Windows : envoyez User-Name/User-Password et observez la réponse.
  • radtest/radclient (FreeRADIUS) : # Test basique (PAP) - utile pour vérifier le routage CRP radtest alice "MotDePasse!" 192.0.2.10:1812 0 MonSecretPartage # Test MSCHAPv2 (toujours sans PEAP) - selon compilation radtest -t mschap [bob@exemple.com](mailto:bob@exemple.com) "MotDePasse!" 192.0.2.10 0 MonSecretPartage

Ensuite, testez depuis un client réel (Windows/macOS/iOS/Android) pour valider la couche EAP et la chaîne de certificats.

Options avancées

Réécriture d’attributs (User‑Name)

Dans la CRP‑Remote (onglet SettingsAttributeManipulation Rules), vous pouvez :

  • Retirer un suffixe : Find = @ext$, Replace = .
  • Ajouter un realm attendu par le serveur distant : si le client envoie bob, remplacez par bob@exemple.com.

Exemple de règle de remplacement :

# Pseudo-règle (documentation)
IF User-Name matches ^([^@]+)$ THEN
    SET User-Name = ${1}@exemple.com

Délais, relances et disponibilité du serveur distant

Dans le Remote RADIUS Server Group :

  • Timeout : gardez‑le court (3–5 s) pour éviter des latences perçues par l’utilisateur.
  • Attempts : 2–3 tentatives maximum, surtout via WAN.
  • Plusieurs serveurs distants : ajoutez un second nœud pour la haute disponibilité et activez l’ordonnancement adéquat.

Stratégie de fallback

Rappel important : NPS n’évalue pas les CRP suivantes si une CRP a déjà fait correspondance, même si le proxy en aval ne répond pas. Le « fallback local » n’est donc pas automatique en cas de panne du serveur distant. Les approches réalistes sont :

  • Prévoir un second serveur distant dans le groupe (HA en amont).
  • Conserver la possibilité d’inverser l’ordre des CRP (ou de désactiver temporairement la CRP‑Remote) lors d’un incident.
  • Réduire Timeout/Attempts pour que l’échec soit rapide et contrôlé côté utilisateur.

Erreurs fréquentes et corrections

  • La CRP‑Remote est au‑dessus de la CRP‑Local : toutes les demandes partent en proxy, les comptes AD échouent → remontez la CRP‑Local.
  • Le NPS n’est pas « Register in Active Directory » : les comptes AD ne s’authentifient pas → enregistrez le serveur dans AD.
  • Certificat serveur non approuvé : les clients refusent PEAP/EAP‑TLS → déployez la chaîne via GPO, utilisez un modèle serveur NPS et un CN/SAN adapté.
  • RADIUS Client non déclaré : AP/contrôleur inconnu du NPS → ajoutez chaque IP d’AP/passerelle avec le bon secret.
  • Format d’identité inattendu : la regex ne matche pas → ajustez les conditions (journalisez User‑Name pour voir le flux réel).

Matrice de décision et d’essais

Identité testAttributs pertinentsCRP attendueRésultat escompté
aliceUser‑Name sans @ ni \, SSID = ENTREPRISECRP‑LocalAuthentifié par NPS local, Network Policy AD appliquée
DOMAIN\aliceUser‑Name avec \CRP‑LocalAuthentifié localement (PEAP/EAP‑TLS)
bob@example.comSuffixe @exemple.com, SSID = ENTREPRISECRP‑RemoteProxy au serveur RADIUS distant, décision déléguée
carol@extSuff. @ext, SSID = INVITESCRP‑Remote + réécritureLe proxy reçoit carol@exemple.com après rewriting

Annexe : modèles de conditions CRP prêts à l’emploi

Dans la fenêtre des conditions d’une CRP, ajoutez User‑Name avec l’opérateur Matches the regular expression :

# Local (accepte user ou DOMAIN\user)
^[^@\\]+$|^[^@]+\\[^@]+$

# Distant (UPN vers domaine externe)

[.+@exemple.com](mailto:.+@exemple.com)$ 

Conditions SSID (via Called‑Station‑ID) :

# Interne
^([0-9A-F]{2}-){5}[0-9A-F]{2}:ENTREPRISE$

# Invités

^([0-9A-F]{2}-){5}[0-9A-F]{2}:INVITES$ 

Annexe : checklist opérationnelle

  • Le groupe Remote RADIUS Server Group contient l’IP/port corrects et le secret partagé est identique.
  • Deux CRP existent, CRP‑Local au‑dessus de CRP‑Remote, avec conditions stables.
  • Les Network Policies locales autorisent les groupes AD, PEAP/EAP‑TLS sont configurés et le certificat serveur est valide.
  • Tous les AP/contrôleurs sont ajoutés dans RADIUS Clients sur le NPS, ainsi que sur le serveur RADIUS distant si l’accounting est envoyé là‑bas.
  • Les journaux NPS (texte + événements) sont activés et contrôlés après chaque changement.
  • Les ports UDP 1812/1813 sont ouverts et NTP est opérationnel sur l’ensemble des nœuds (clients compris).
  • Des tests représentatifs (alice, bob@example.com) réussissent et la CRP appariée est celle attendue.

Questions fréquentes

Peut‑on utiliser une seule CRP pour authentifier localement et faire du proxy ?
Non. Une CRP impose un comportement exclusif : local ou proxy. Il faut donc plusieurs CRP avec des conditions distinctives, et un ordre cohérent.

Mes Network Policies locales ne s’appliquent pas aux comptes distants, est‑ce normal ?
Oui. Dès que la CRP choisit « Forward to remote server », la décision d’accès appartient au serveur distant ; vos Network Policies locales ne sont pas évaluées.

Comment séparer proprement « interne » et « invité » ?
Le plus simple est d’utiliser des SSID dédiés (ENTREPRISE vs INVITES) et d’exploiter Called‑Station‑ID ou NAS‑Identifier dans vos CRP.

J’obtiens des erreurs PEAP côté clients après l’ajout du proxy ; pourquoi ?
Vérifiez la chaîne de certificats du NPS et/ou du serveur distant. Les clients doivent a priori faire confiance à l’AC qui signe le certificat serveur présenté durant EAP.

Comment diagnostiquer un mauvais aiguillage CRP ?
Regardez les événements 6272/6273 dans Microsoft‑Windows‑NPS/Operational et les logs IAS ; vous y verrez l’identité reçue, la CRP appliquée et, le cas échéant, le serveur distant contacté.

Conclusion

La clé pour faire cohabiter comptes Active Directory locaux et identités d’un RADIUS distant sur un même NPS est d’orchestrer l’aiguillage en amont : deux Connection Request Policies bien pensées, des conditions simples et fiables (format d’identité, SSID, NAS‑ID), un ordre d’évaluation maîtrisé et une journalisation bavarde. En procédant ainsi, vous offrez aux utilisateurs une expérience unifiée (un seul SSID si vous le souhaitez) tout en gardant le contrôle côté sécurité et supervision. Cette méthode s’applique particulièrement bien aux déploiements UniFi mais reste valable avec d’autres infrastructures 802.1X. Une fois stabilisée, votre Wi‑Fi Enterprise acceptera indifféremment les comptes du domaine et ceux du serveur RADIUS externe, sans conflit ni surprise.

En appliquant cette méthode (deux CRP ordonnées + groupe RADIUS distant correctement déclaré), vos utilisateurs pourront s’authentifier indifféremment via le domaine local ou via le serveur RADIUS externe, sans conflit.

Sommaire