Comprendre et configurer le Port-Security sur un switch Cisco.
Le « port-security » est une fonctionnalité des switches Cisco permettant de sécuriser un port d’accès (auquel est connecté une station de travail, un serveur,…) en contrôlant les adresses MAC source des trames Ethernet qui arrivent sur le port en question. En cas de violation une action sera prise.
Les application de cette fonctionnalité sont multiples:
- Limiter le nombre de machines pouvant être connectées à un port du switch.
- Restreindre l’accès au réseau à une machine spécifique.
- Empêcher le spoofing d’adresse MAC.
- etc.
Imaginons par exemple le cas d’un switch d’accès auquel ne devrait en principe être connecté une et une seule machine à chaque port, mais qu’un utilisateur ait décidé d’intercaler un autre switch pour pouvoir connecter plus de machines dans son bureau.
Du point de vue de switch de l’entreprise, il ne devrait y avoir qu’une seule adresse MAC associée à chacun des différents ports, l’adresse MAC de la machine connectée. Hors ici, sur l’interface Gi0/4, le switch recevra des trames de trois adresses MAC sources différentes.
Pour empêcher ce genre de détournement, on utilisera le « port-security » notamment pour limiter le nombre d’adresse MAC que le switch peut apprendre sur un port donnée, et si cette limite est transgressée, des mesures seront prises.
Le principe du port-security
Lorsque le port-security est activé sur un port du switch, chaque trame qui y entre sera vérifiée sur base de son adresse MAC source pour déterminer si une violation de sécurité a eu lieu ou non.
Les violations de sécurités peuvent être déterminées sur bases de plusieurs éléments:
- Le nombre maximal d’adresses MAC source que le switch peut accepter sur le port concerné.
- La « valeur » de l’adresse MAC
Le port-security offre trois modes de réaction qui définissent les actions effectuées lorsqu’une violation est détectée:
- Filtrer (bloquer) les trames illicites.
- Incrémenter un compteur de violations pour le port concerné.
- Générer un message de LOG et SNMP.
- Désactiver le port du switch et le placer dans un état spécifique: « error-disabled ».
Le tableau ci-dessous reprend les actions prises par chacun des trois modes existants:
MODE | Filtre les trames illicites | Incrémente le compteur de violation Génère un message de LOG et SNMP | Place le port en « error-disabled » |
Protect | OUI | NON | NON |
Restrict | OUI | OUI | NON |
Shutdown | OUI | OUI | OUI |
Notez qu’il est important de comprendre qu’un port placé en état « error-disabled » est réellement désactivé, plus aucun trafic ne passera, il faudra réinitialiser le port en question pour qu’il redevienne actif.
Configuration du port-security
Avant toute chose il faut définir statiquement le mode de fonctionnement du port, soit en mode « access », soit en mode « trunk ». Si vous essayez de configurer le port-security sur un port en mode dynamique (par défaut les ports sont généralement en mode « dynamic auto ») le switch vous affichera le message d’erreur suivant:
SW1(config)#interface g0/1
SW1(config-if)#switchport port-security
Command rejected: GigabitEthernet0/1 is a dynamic port.
SW1(config-if)#
Bien qu’il soit possible de configurer du port-security sur un trunk, c’est, la plupart du temps, une entreprise très délicate. Il faut être en mesure de connaître exactement le nombre d’adresses MAC qui peuvent passer sur le lien, ce qui, pour un trunk, est plutôt rare. Donc généralement, le port-security sera appliqué sur un port en mode « access ».
Première étape: définir le mode de fonctionnement du port
switch(config-if)# switchport mode <access|trunk>
Deuxième étape: activer le port-security
switch(config-if)# switchport port-security
Sans cette commande le port-security ne sera pas actif.
Troisième étape: définir les paramètres et mode du port-security
switch(config-if)# switchport port-security maximum <n>
switch(config-if)# switchport port-security violation <protect|restrict|shutdown>
Le première commande défini le nombre maximum d’adresses MAC source pouvant être acceptées par le switch sur le port. La seconde commande défini le mode de réaction (voir plus haut).
Par défaut le nombre maximum d’adresse MAC est de 1 et le mode est « shutdown ».
Etapes optionnelles
En soi le port-security n’empêche pas de déconnecter une machine et d’en mettre une autre à la place et ce tout simplement parce que les entrées de la table d’adresses MAC associées à une interface sont vidées lorsque l’interface passe « down ».
Pour palier à ce problème, il est possible de configurer le port pour que le switch enregistre dans sa configuration (running-config) toute adresse apprise sur un port où le port-security est activé.
switch(config-if)# switchport port-security mac-address sticky
Une fois activée, cette fonctionnalité permettra au switch d’enregistrer de manière statique dans sa configuration les entrées d’adresses MAC jusqu’au nombre maximum autorisé sur l’interface. Moyennant une sauvegarde de la configuration, ces entrées perdureront même en cas de redémarrage de l’équipement.
Notez qu’il faut que de trafic entre sur l’interface du switch pour que le sticky puisse faire effet, et dans le cas présent, premier arrivé, premier servi. Donc il est nécessaire de s’assurer que ce sont bien les machines légitimes qui sont connectées au switch.
Voici un exemple d’entrées ajoutées par la fonctionnalité sticky dans la configuration d’un switch:
interface GigabitEthernet0/1
switchport mode access
switchport port-security maximum 2
switchport port-security violation restrict
switchport port-security mac-address sticky
switchport port-security mac-address sticky 0050.7966.6800
switchport port-security mac-address sticky 0050.7966.6801
switchport port-security
Il est également possible de configurer manuellement les adresses MAC à autoriser. C’est un travail fastidieux mais qui peut prendre du sens si on parle de ports auxquels sont attachés des machines fixes comme des serveurs.
switch(config-if)# switchport port-security mac-address <mac-address>
L’effet sera exactement le même que les adresses auto enregistrées avec l’option sticky mais ne dépend pas du trafic qui passer pour la découverte de l’adresse MAC.
Vérification du port-security
La commande « show port-security » vous permet rapidement de résumer la configuration du port-security et de l’état actuel des interfaces:
SW1#show port-security
Secure Port MaxSecureAddr CurrentAddr SecurityViolation Security Action
(Count) (Count) (Count)
---------------------------------------------------------------------------
Gi0/0 1 1 0 Shutdown
Gi0/1 2 2 0 Restrict
Gi0/2 3 0 0 Restrict
Gi0/3 1 0 0 Protect
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port) : 1
Max Addresses limit in System (excluding one mac per port) : 4096
SW1#
Les différentes colonnes:
- Secure Port: le nom de l’interface
- MaxSecureAddr: le nombre d’adresses autorisées sur le port
- CurrentAddr: le nombre d’adresses MAC actuellement associées au port
- SecurityViolation: le compteur de violations du port
- Security Action: le mode de réaction configuré
Une interface qui n’apparaît pas dans cette liste n’a pas de port-security activé.
Mise en pratique
Voici un récapitulatif de ce qu’il faut configurer sur un switch donné:
Ports | Vlan | PortSecurity Max | PortSecurity Mode | Sticky |
Gi0/0 – Gi0/3 | 10 | 1 | Shutdown | Oui |
Gi1/0 – Gi1/3 | 20 | 1 | Restrict | Non |
Gi2/0 – Gi2/3 | 30 | 2 | Protect | Non |
Gi3/0 – Gi/3/3 | 40 | 3 | Restrict | Oui |
La configuration correspondante:
SW1(config)#interface range g0/0-3
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 10
SW1(config-if-range)#switchport port-security
SW1(config-if-range)#switchport port-security maximum 1
SW1(config-if-range)#switchport port-security violation shutdown
SW1(config-if-range)#switchport port-security mac-address sticky
SW1(config-if-range)#exit
SW1(config)#
SW1(config)#interface range g1/0-3
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 20
SW1(config-if-range)#switchport port-security
SW1(config-if-range)#switchport port-security maximum 1
SW1(config-if-range)#switchport port-security violation restrict
SW1(config-if-range)#exit
SW1(config)#
SW1(config)#interface range g2/0-3
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 30
SW1(config-if-range)#switchport port-security
SW1(config-if-range)#switchport port-security maximum 2
SW1(config-if-range)#switchport port-security violation protect
SW1(config-if-range)#exit
SW1(config)#
SW1(config)#interface range g3/0-3
SW1(config-if-range)#switchport mode access
SW1(config-if-range)#switchport access vlan 40
SW1(config-if-range)#switchport port-security
SW1(config-if-range)#switchport port-security maximum 3
SW1(config-if-range)#switchport port-security violation restrict
SW1(config-if-range)#switchport port-security mac-address sticky
SW1(config-if-range)#end
SW1#
Dans le cas présent, j’ai inclus les commandes pour définir le maximum à 1 ou le mode à shutdown par souci de clarté, mais dans les faits, vu que ce sont les valeurs par défaut, il n’est pas nécessaire de les configurer.
Et voici la vérification de la configuration:
SW1#show port-security
Secure Port MaxSecureAddr CurrentAddr SecurityViolation Security Action
(Count) (Count) (Count)
---------------------------------------------------------------------------
Gi0/0 1 0 0 Shutdown
Gi0/1 1 0 0 Shutdown
Gi0/2 1 0 0 Shutdown
Gi0/3 1 0 0 Shutdown
Gi1/0 1 0 0 Restrict
Gi1/1 1 0 0 Restrict
Gi1/2 1 0 0 Restrict
Gi1/3 1 0 0 Restrict
Gi2/0 2 0 0 Protect
Gi2/1 2 0 0 Protect
Gi2/2 2 0 0 Protect
Gi2/3 2 0 0 Protect
Gi3/0 3 0 0 Restrict
Gi3/1 3 0 0 Restrict
Gi3/2 3 0 0 Restrict
Gi3/3 3 0 0 Restrict
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port) : 0
Max Addresses limit in System (excluding one mac per port) : 4096
SW1#
Que se passe-t-il en cas de violation de sécurité ?
Bien évidemment tout dépend du mode de fonctionnement:
- En mode « protect », les trames illicites seront rejetées. C’est tout.
- En mode « restrict », en plus de rejeter les trames, le compteur de violation sera incrémenté et un message de log sera généré.
- En mode « shutdown », en plus des précédentes actions, le port sera placé dans un état spécial: « error-disabled ».
Voici un exemple de message de log d’une violation de sécurité sur un port configuré en mode « restrict »:
*Jun 11 20:28:50.094: %PORT_SECURITY-2-PSECURE_VIOLATION: Security violation occurred, caused by MAC address 0050.7966.6801 on port GigabitEthernet1/1.
On retrouve alors le nombre de violations avec la commande « show port-security »
SW1#show port-security
Secure Port MaxSecureAddr CurrentAddr SecurityViolation Security Action
(Count) (Count) (Count)
---------------------------------------------------------------------------
Gi0/0 1 1 1 Shutdown
Gi0/1 1 0 0 Shutdown
Gi0/2 1 0 0 Shutdown
Gi0/3 1 0 0 Shutdown
Gi1/0 1 0 0 Restrict
Gi1/1 1 1 5 Restrict
Gi1/2 1 0 0 Restrict
Gi1/3 1 0 0 Restrict
Gi2/0 2 0 0 Protect
Gi2/1 2 0 0 Protect
Gi2/2 2 0 0 Protect
Gi2/3 2 0 0 Protect
Gi3/0 3 0 0 Restrict
Gi3/1 3 0 0 Restrict
Gi3/2 3 0 0 Restrict
Gi3/3 3 0 0 Restrict
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port) : 0
Max Addresses limit in System (excluding one mac per port) : 4096
SW1#
Comme vous pouvez le voir dans cette dernière commande l’interface Gi0/0 a également un compteur de violation qui a été incrémenté. Mais de une unité seulement. Etant donné que cette interface est en mode « shutdown » elle devrait être placée en état « error-disabled ». On peut le vérifier avec la commande « show interfaces status err-disabled »:
SW1#show interfaces status err-disabled
Port Name Status Reason Err-disabled Vlans
Gi0/0 err-disabled psecure-violation
SW1#
L’état est visible avec n’importe quelle variante du « show interface »:
SW1#show interfaces g0/0
GigabitEthernet0/0 is down, line protocol is down (err-disabled)
Hardware is iGbE, address is 0cd8.fffc.0000 (bia 0cd8.fffc.0000)
MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Auto Duplex, Auto Speed, link type is auto, media type is RJ45
output flow-control is unsupported, input flow-control is unsupported
ARP type: ARPA, ARP Timeout 04:00:00
Last input 00:07:32, output 00:07:33, output hang never
Last clearing of "show interface" counters never
Input queue: 0/75/0/0 (size/max/drops/flushes); Total output drops: 0
Queueing strategy: fifo
Output queue: 0/0 (size/max)
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
14 packets input, 1098 bytes, 0 no buffer
Received 6 broadcasts (6 multicasts)
0 runts, 0 giants, 0 throttles
0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
0 watchdog, 6 multicast, 0 pause input
1734 packets output, 135925 bytes, 0 underruns
0 output errors, 0 collisions, 2 interface resets
0 unknown protocol drops
0 babbles, 0 late collision, 0 deferred
3 lost carrier, 0 no carrier, 0 pause output
0 output buffer failures, 0 output buffers swapped out
SW1#
SW1#show interfaces status
Port Name Status Vlan Duplex Speed Type
Gi0/0 err-disabled 10 auto auto RJ45
Gi0/1 notconnect 10 a-full auto RJ45
Gi0/2 notconnect 10 a-full auto RJ45
Gi0/3 notconnect 10 a-full auto RJ45
Gi1/0 notconnect 20 a-full auto RJ45
Gi1/1 connected 20 a-full auto RJ45
Gi1/2 notconnect 20 a-full auto RJ45
Gi1/3 notconnect 20 a-full auto RJ45
Gi2/0 notconnect 30 a-full auto RJ45
Gi2/1 notconnect 30 a-full auto RJ45
Gi2/2 notconnect 30 a-full auto RJ45
Gi2/3 notconnect 30 a-full auto RJ45
Gi3/0 notconnect 40 a-full auto RJ45
Gi3/1 notconnect 40 a-full auto RJ45
Gi3/2 notconnect 40 a-full auto RJ45
Gi3/3 notconnect 40 a-full auto RJ45
SW1#
Réactiver une interface « err-disabled »
Pour réactiver une interface placée en « err-disabled », il y a deux solutions, manuellement ou à l’aide du mécanisme « err-disable recovery ».
Réactiver manuellement
Avant toute chose il faut s’assurer que la cause a été identifiée et éliminée. Sans quoi l’interface repassera rapidement en « err-disabled ».
Une fois celà fait, il suffit d’effectuer un « shutdown/no shutdown » sur l’interface.
SW1(config)#interface g0/0
SW1(config-if)#shutdown
SW1(config-if)#no shutdown
Le « shutdown » a son importance. Il faut passer l’interface en « shutdown » sans quoi le « no shutdown » n’aura pas d’effet.
Réactiver automatiquement à intervalle régulier
Les switches Cisco disposent d’un mécanisme de réactivation automatique à intervalle régulier pour les ports qui seraient placés en « err-disabled » (que ce soir par le port-security, BPDUGuard ou autres).
Il faut définir les causes de « err-disabled » à prendre en charge et l’intervalle entre les tentatives (entre 30 et 86400 secondes):
SW1(config)#errdisable recovery cause psecure-violation
SW1(config)#errdisable recovery interval 30
Ces commandes définissent la tentative de réactivation des ports en « err-disabled » pour cause de violation de port-security avec un intervalle de 30 secondes entre chaque vérification.
Merci beaucoup pour cette fiche très claire et concise !