---
title: "Hardening infrastructure réseau"
domain: security
subdomain: hardening
type: snippet
tags: [hardening, network, cisco, switch, router, snmp, ntp, management, acl, security]
difficulty: intermediate
status: stable
updated: "2025-05-14"
---
## Accès de gestion

```text
! Désactiver Telnet, SSH v2 uniquement
line vty 0 15
 transport input ssh
 exec-timeout 5 0
 login local
 logging synchronous

! Générer les clés RSA (minimum 2048, recommandé 4096)
crypto key generate rsa modulus 4096
ip ssh version 2
ip ssh time-out 60
ip ssh authentication-retries 3

! ACL de restriction sur les VTY (accès uniquement depuis sous-réseau de gestion)
ip access-list standard MGMT-ACL
 permit {{MGMT_SUBNET}} {{WILDCARD_MASK}}
 deny   any log

line vty 0 15
 access-class MGMT-ACL in

! Authentification AAA avec TACACS+
aaa new-model
aaa authentication login default group tacacs+ local
aaa authorization exec default group tacacs+ local
aaa accounting exec default start-stop group tacacs+
tacacs-server host {{TACACS_IP}} key {{TACACS_KEY}}
```

```text
! Mots de passe sécurisés
service password-encryption
enable secret {{ENABLE_SECRET}}
! enable secret utilise bcrypt (type 9) depuis IOS 15.3+
! enable password {{PLAIN}} ← JAMAIS (stocké en clair)

! Username avec privilege level et secret (type 9)
username {{ADMIN_USER}} privilege 15 algorithm-type sha256 secret {{PASSWORD}}

! Bannière légale (obligatoire pour les poursuites légales en cas d'intrusion)
banner motd ^
  *** AUTHORIZED ACCESS ONLY ***
  This system is for authorized use only. All activity is logged and monitored.
  Unauthorized access is prohibited and subject to legal prosecution.
^
```

## SNMP

```text
! Désactiver SNMP v1 et v2c (non chiffrés, community string = mot de passe en clair)
no snmp-server community public
no snmp-server community private
no snmp-server community {{ANY_COMMUNITY}}

! Si SNMP non utilisé — désactiver complètement
no snmp-server

! SNMPv3 avec authPriv (authentification SHA + chiffrement AES)
snmp-server group {{GROUP_NAME}} v3 priv
snmp-server user {{SNMP_USER}} {{GROUP_NAME}} v3 auth sha {{AUTH_PASS}} priv aes 256 {{PRIV_PASS}}
snmp-server view {{VIEW_NAME}} iso included

! ACL sur les requêtes SNMP (autoriser uniquement le serveur NMS)
ip access-list standard SNMP-ACL
 permit {{NMS_SERVER_IP}}
 deny   any log

snmp-server community {{COMMUNITY}} RO SNMP-ACL   ! Si v2c obligatoire
snmp-server host {{NMS_IP}} version 3 priv {{SNMP_USER}}

! Désactiver les traps inutiles, activer les critiques
snmp-server enable traps config
snmp-server enable traps envmon
snmp-server enable traps bgp
```

<Warning>
SNMP v1/v2c transmettent la community string en clair dans chaque paquet. Sur un réseau sniffable, tout attaquant peut capturer la community string et lire/écrire la configuration complète de vos équipements réseau. Migrer vers SNMPv3 authPriv est non-négociable.
</Warning>

## NTP

```text
! Serveurs NTP internes (hiérarchie)
ntp server {{NTP_SERVER_1}} prefer
ntp server {{NTP_SERVER_2}}

! Authentification NTP (empêche l'usurpation de serveur NTP)
ntp authenticate
ntp authentication-key 1 md5 {{NTP_KEY}}
ntp trusted-key 1
ntp server {{NTP_SERVER_1}} key 1

! Restreindre qui peut interroger ce routeur comme source NTP
ntp access-group peer NTP-PEERS
ntp access-group serve-only NTP-CLIENTS
ntp access-group query-only NTP-QUERY

ip access-list standard NTP-PEERS
 permit {{INTERNAL_NTP_SERVERS}}

ip access-list standard NTP-CLIENTS
 permit {{MANAGEMENT_SUBNET}}

! Vérifier la synchronisation NTP
! show ntp status
! show ntp associations
```

## Sécurité des ports switch

```text
! Désactiver les ports inutilisés
interface range GigabitEthernet1/0/{{UNUSED_PORTS}}
 shutdown
 switchport access vlan 999
 description DISABLED_PORT
 spanning-tree bpduguard enable

! VLAN 999 = Black Hole VLAN (non routé, non trunk)
vlan 999
 name BLACKHOLE

! Désactiver CDP sur les ports vers les utilisateurs
interface GigabitEthernet1/0/{{ACCESS_PORT}}
 no cdp enable
 no lldp transmit
 no lldp receive

! BPDU Guard — protège contre les switches non autorisés
! (envoyer un BPDU sur un port access = erreur, port bloqué immédiatement)
spanning-tree portfast bpduguard default   ! Globalement sur tous les ports PortFast

interface GigabitEthernet1/0/{{ACCESS_PORT}}
 spanning-tree portfast
 spanning-tree bpduguard enable

! DHCP Snooping — empêche les DHCP servers non autorisés (rogue DHCP)
ip dhcp snooping
ip dhcp snooping vlan {{USER_VLAN}}
no ip dhcp snooping information option   ! Eviter les problèmes avec certains DHCP servers

! Ports de confiance (uplinks vers le vrai serveur DHCP)
interface GigabitEthernet1/0/{{UPLINK}}
 ip dhcp snooping trust

! Dynamic ARP Inspection — empêche ARP spoofing/poisoning
ip arp inspection vlan {{USER_VLAN}}
ip arp inspection validate src-mac dst-mac ip

interface GigabitEthernet1/0/{{UPLINK}}
 ip arp inspection trust
```

## Sécurité des interfaces routeur

```text
! Désactiver les fonctions inutiles sur les interfaces internes
interface GigabitEthernet0/0
 no ip proxy-arp                    ! Evite les attaques de type man-in-the-middle
 no ip redirects                    ! Pas de redirection ICMP (peut révéler la topologie)
 no ip unreachables                 ! Limiter les infos données à un attaquant sur WAN

! Interface WAN — protection supplémentaire
interface GigabitEthernet0/1
 no ip directed-broadcast           ! Empêche Smurf amplification attacks
 no ip proxy-arp
 no ip redirects
 no ip unreachables
 ip access-group WAN-IN in

! uRPF — Unicast Reverse Path Forwarding (anti-spoofing)
interface GigabitEthernet0/1
 ip verify unicast source reachable-via rx

! ACL anti-spoofing sur l'interface WAN (bloquer RFC 1918 entrant depuis Internet)
ip access-list extended WAN-IN
 deny   ip 10.0.0.0 0.255.255.255 any log
 deny   ip 172.16.0.0 0.15.255.255 any log
 deny   ip 192.168.0.0 0.0.255.255 any log
 deny   ip 127.0.0.0 0.255.255.255 any log
 deny   ip 0.0.0.0 0.255.255.255 any log
 deny   ip 169.254.0.0 0.0.255.255 any log
 deny   ip 224.0.0.0 31.255.255.255 any log
 permit ip any any
```

## Plan de contrôle (Control Plane Policing)

```text
! CoPP — protège le CPU du routeur contre les attaques par flood vers le plan de contrôle
! (BGP, OSPF, SSH, ICMP, etc. — limiter le trafic qui atteint le CPU)

class-map match-any CRITICAL-TRAFFIC
 match access-group name CRITICAL-ACL

class-map match-any IMPORTANT-TRAFFIC
 match access-group name ROUTING-PROTOCOLS

class-map match-any NORMAL-TRAFFIC
 match access-group name SSH-TRAFFIC

policy-map COPP-POLICY
 class CRITICAL-TRAFFIC
  police rate 8000 bps burst 1500
 class IMPORTANT-TRAFFIC
  police rate 64000 bps burst 8000
 class NORMAL-TRAFFIC
  police rate 32000 bps burst 4000
 class class-default
  drop

control-plane
 service-policy input COPP-POLICY

! Protections TCP
ip tcp synwait-time 10
service tcp-keepalives-in
service tcp-keepalives-out

! Désactiver les services legacy inutiles
no service pad
no service udp-small-servers
no service tcp-small-servers
no ip bootp server
no service finger
no ip source-route              ! Empêche le source routing (peut bypasser les ACLs)
no ip gratuitous-arps
no ip http server               ! Interface web HTTP non chiffrée
no ip http secure-server        ! Désactiver aussi HTTPS si non nécessaire
```

## Logging

```text
! Configurer le syslog centralisé
logging host {{SYSLOG_IP}}
logging trap informational
logging source-interface Loopback0   ! Source d'IP stable pour les logs
logging on

! Format des timestamps (critiques pour la forensique)
service timestamps log datetime msec show-timezone
service timestamps debug datetime msec show-timezone

! Buffer local (en cas de perte de connectivité vers le syslog)
logging buffered 1048576 informational

! Vérifier les logs locaux
! show logging | tail 50

! Activer les logs sur les ACL (ajouter le mot-clé 'log' aux règles critiques)
ip access-list extended WAN-IN
 deny   ip any any log   ! Loguer les refus
```

## Sauvegarde et gestion de configuration

```text
! Sauvegarder la configuration via TFTP/SCP (automatisé)
archive
 path scp://{{BACKUP_USER}}@{{BACKUP_SERVER}}/configs/$h-$t
 write-memory

! Chiffrer les mots de passe dans la config
service password-encryption

! Après toute modification — sauvegarder
write memory
! ou : copy running-config startup-config
```

## Checklist hardening réseau

<Checklist
  storageKey="hardening-network"
  items={[
    { id: "telnet-disabled", label: "Telnet désactivé (transport input ssh sur toutes les lignes VTY)", critical: true },
    { id: "ssh-v2", label: "SSH v2 uniquement, clés RSA 4096 bits", critical: true },
    { id: "vty-acl", label: "ACL restrictive sur les VTY (access-class MGMT-ACL in)" },
    { id: "snmpv3", label: "SNMPv3 authPriv configuré (SHA + AES256), SNMP v1/v2c supprimés", critical: true },
    { id: "ntp-auth", label: "NTP authentifié (ntp authenticate + trusted-key)" },
    { id: "unused-ports", label: "Ports inutilisés : shutdown + VLAN black hole (999)" },
    { id: "cdp-restricted", label: "CDP/LLDP désactivé sur les ports access utilisateurs" },
    { id: "bpdu-guard", label: "BPDU Guard activé sur tous les ports PortFast" },
    { id: "dhcp-snooping", label: "DHCP Snooping activé sur les VLANs utilisateurs" },
    { id: "dai", label: "Dynamic ARP Inspection activé (protection ARP spoofing)" },
    { id: "no-directed-broadcast", label: "no ip directed-broadcast sur toutes les interfaces" },
    { id: "urpf", label: "uRPF activé sur l'interface WAN (anti-spoofing)" },
    { id: "copp", label: "Control Plane Policing (CoPP) configuré pour protéger le CPU" },
    { id: "legacy-disabled", label: "Services legacy désactivés : no service pad, no ip bootp server, no service finger" },
    { id: "syslog", label: "Syslog configuré vers serveur centralisé avec timestamps msec" },
    { id: "config-saved", label: "write memory après chaque modification, configuration sauvegardée hors équipement" }
  ]}
/>

<Tip>
`no service pad`, `no service udp-small-servers`, `no service tcp-small-servers` — ces services legacy Cisco (echo, chargen, discard) sont actifs par défaut sur les vieux IOS et créent une surface d'attaque inutile (amplification UDP, test de connectivité pour les attaquants). Les désactiver systématiquement dans tout template de configuration initiale.
</Tip>
