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:

MODEFiltre les trames illicitesIncrémente le compteur de violation
Génère un message de LOG et SNMP
Place le port en « error-disabled »
ProtectOUINONNON
RestrictOUIOUINON
ShutdownOUIOUIOUI

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é:

PortsVlanPortSecurity MaxPortSecurity ModeSticky
Gi0/0 – Gi0/3101ShutdownOui
Gi1/0 – Gi1/3201RestrictNon
Gi2/0 – Gi2/3302ProtectNon
Gi3/0 – Gi/3/3403RestrictOui

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.

1 Comment on “Comprendre et configurer le Port-Security sur un switch Cisco.