Este tema reúne cómo proteger el acceso al dispositivo: la contraseña del modo privilegiado, las contraseñas de las líneas de acceso (consola, VTY, auxiliar), la base de usuarios local, el cifrado de contraseñas y la desactivación de servicios innecesarios que amplían la superficie de ataque.

Conceptos previos

Pasos típicos:

  1. Proteger el modo privilegiado con enable secret.
  2. Crear usuarios locales con contraseña con hash (si se usará login local o SSH).
  3. Proteger las líneas (consola y VTY) con contraseña y método de login.
  4. Cifrar las contraseñas restantes y deshabilitar servicios innecesarios.
Ejemplo rapido para refrescar memoria

Con mi configuración de Obsidian, ConsolaLab1 no se usa. l

Configuración

1. Protección de la línea de consola

  • Comando:
Router(config)# username <Usuario> privilege <0-15> algorithm-type <md5|sha256|scrypt> secret <Clave>
Router(config)# enable algorithm-type <md5|sha256|scrypt> secret <Clave>
  • Ejemplo:
! Un username por persona
SW1(config)# username Admin privilege 15 algorithm-type scrypt secret AdminLab2026

SW1(config)# username maria privilege 15 algorithm-type scrypt secret Cl4ve-Maria22!
SW1(config)# username soporte privilege 1 algorithm-type scrypt secret Cl4ve-Soporte3!

! Enable secret: uno solo, compartido
SW1(config)# enable algorithm-type scrypt secret Kassini#2026

En caso de ser un solo Administrador, solo usar un username.
Si quisieras que pida las dos claves, usa privilege 1. Con privilege 1 el usuario entra en SW1> (modo usuario), y para llegar a SW1# tiene que escribir enable. Ese comando pide el enable secret.

Una vez terminado eso, hacer los pasos de abajo:

  • Comando:
SW1(config)# line console 0
SW1(config-line)# login local
SW1(config-line)# exec-timeout <minutos> <segundos>
SW1(config-line)# logging synchronous
SW1(config-line)# exit

R1(config)# service password-encryption
  • Ejemplo:
SW1(config)# line console 0
SW1(config-line)# login local
SW1(config-line)# exec-timeout 5 0
SW1(config-line)# logging synchronous
SW1(config-line)# exit

R1(config)# service password-encryption
ComandoQué hace
login localPide usuario y contraseña de la base local (username)
exec-timeout <min> <seg>Cierra la sesión inactiva.
logging synchronousEvita que los mensajes del sistema corten lo que escribes

Crea el usuario antes de activar login local. (Paso 1, hay que hacerlo primero.)

2. Desactivación de servicios innecesarios

Recomendados

ComandoAplica en routerAplica en switchQué evita
no ip domain-lookupSíSíCongelamiento al escribir mal un comando (si no usas DNS)
no ip http serverSíSíAdministración web en texto plano
no ip http secure-serverSíSíSuperficie web HTTPS (si no usas GUI/RESTCONF)
no ip source-routeSíSí (L3)Paquetes con ruta manipulada por el origen
no ip bootp serverSíSíServicio BOOTP heredado
no service padSíSíPAD (X.25), heredado
no service configSíSíCarga de configuración desde la red (TFTP) al arrancar
no vstackNoSí (Catalyst)Smart Install (puerto 4786), vulnerabilidad conocida
no ip fingerSíSíSolo IOS antiguos; en los nuevos ya no existe
no service tcp-small-servers y no service udp-small-serversSíSíEcho, chargen, etc. Ya apagados por defecto en IOS modernos
Opcionales (según lo que uses)
ComandoAplica en routerAplica en switchCuándo dejarlo activo
no service dhcpSíSíSi el equipo es servidor DHCP o relay (ip helper-address)
no cdp runSíSíTeléfonos IP, APs Cisco o troubleshooting
no lldp runSíSíTeléfonos IP no Cisco o LLDP-MED
no snmp-serverSíSíSi usas monitoreo SNMP (en ese caso, SNMPv3 con ACL)
no ip proxy-arp (por interfaz)SíSí (L3)Redes con equipos mal configurados que dependan de él
no ip redirects y no ip unreachables (por interfaz)SíSí (L3)Apágalos en interfaces hacia redes no confiables
no mop enabledSíNoProtocolo heredado de DEC, apagado en la mayoría de IOS

CDP y LLDP: decisión por interfaz

Revelan modelo, versión de IOS, IPs y puertos a quien escuche en el enlace. Una solución intermedia es dejarlos activos globalmente y apagarlos donde no deben estar:

Tipo de puertoCDP / LLDP
Hacia usuarios finales, WAN o internetApagado (recomendado)
Entre switches y routers propiosActivo (útil para troubleshooting)
Hacia teléfonos IP o APsActivo, si los necesitan
Específico del switch
MedidaComandoPrioridad
Apagar puertos sin usoshutdownRecomendado
Moverlos a una VLAN sin enrutarswitchport access vlan 999Recomendado
Forzar modo acceso (sin DTP)switchport mode access + switchport nonegotiateRecomendado
Limitar VTPvtp mode transparent (u off)Recomendado
Cambiar la VLAN nativa de las troncalesswitchport trunk native vlan 99Recomendado
Proteger puertos de usuariospanning-tree portfast + spanning-tree bpduguard enableOpcional
Limitar MACs por puertoswitchport port-securityOpcional
Específico del router
MedidaComandoPrioridad
Deshabilitar el puerto auxiliarline aux 0 + no exec + transport input noneRecomendado
Ejemplo para el puerto auxiliar:
Router(config)# line aux 0
Router(config-line)# no exec
Router(config-line)# transport input none

Verificación

1. Ver las líneas

R1# show running-config | section line
line con 0
 exec-timeout 5 0
 logging synchronous
 login local
line aux 0
 no exec
 transport input none
line vty 0 4
 access-class 1 in
 exec-timeout 5 0
 login local
 transport input ssh

Si tu equipo tiene 16 líneas vty (switches), verás también:

line vty 5 15
 access-class 1 in
 exec-timeout 5 0
 login local
 transport input ssh

2. Ver enable, usuarios y service password-encryption

R1# show running-config | include enable|username|service password
service password-encryption
enable secret 9 $9$Lq7fT2mXc8RkWy$p3Nn0eVhZ5uJ1aGdYtB6oS4xKcQwE9rMiUvA2lDfHzs
username admin privilege 15 secret 9 $9$3Xk2vN8yQ1pLfE$wZ4hT6mJ0cRbA7sKdU9eYgV2nHqXoP5iLtM8aBjC1rE

3. Ver solo los usuarios locales

R1# show running-config | include username
username admin privilege 15 secret 9 $9$3Xk2vN8yQ1pLfE$wZ4hT6mJ0cRbA7sKdU9eYgV2nHqXoP5iLtM8aBjC1rE

Con varios usuarios:

R1# show running-config | include username
username admin privilege 15 secret 9 $9$3Xk2vN8yQ1pLfE$wZ4hT6mJ0cRbA7sKdU9eYgV2nHqXoP5iLtM8aBjC1rE
username operador secret 9 $9$7Hd1pQ4rTz9WnB$uC3kVx8LmY2eNfG6aSjR0oIbDhZtKw5PqXyE1vAcMlo

Cómo se ve cada tipo de contraseña

PrefijoTipoCómo se ve en la configuraciónSeguridad
(ninguno)Texto planoenable password Clave123Mala
7Ofuscada (service password-encryption)password 7 0822455D0A16Mala, se revierte en segundos
5 / $1$MD5secret 5 $1$mERr$hx5rVt7rPNoS4wqbXKX7m0Débil
8 / $8$SHA-256secret 8 $8$dsYGNam3K1SIJO$7nv/35M/qr6t.dVc7UY9zrJDWRVqncHub1PE9UlMQFsBuena
9 / $9$scryptsecret 9 $9$nhEmQVczB7dqsO$X.HsgL6x1il0RxkOSSvyQYwucySCt7qFm4v7pqCxkKMLa mejor

Señales de que algo está mal

Contraseñas en texto plano:

R1# show running-config | include enable|username
enable password Clave123
username admin password Clave456

Corrección: no enable password, y crear el usuario otra vez con secret o algorithm-type. Si queda el username ... password, bórralo con no username admin antes de volver a crearlo.

Contraseñas ofuscadas con tipo 7 (por password en una línea con service password-encryption):

R1# show running-config | section line con
line con 0
password 7 0822455D0A16
login

Corrección: pasar a login local y quitar la clave de línea con no password.

Usuario con login local pero sin ningún username:

R1# show running-config | include username
R1#

Sin salida significa que no hay usuarios, y login local te dejaría sin acceso por consola.

Filtros extra útiles

R1# show running-config | include secret
R1# show running-config | include password
R1# show running-config | section line vty
R1# show running-config | section line con

El segundo comando no debería mostrar ninguna línea con contraseña en texto plano; si aparece password 7 ..., es ofuscación reversible, no un hash.

Nota sobre tu texto: donde dices “login local (o login)” en las vty, con SSH usa solo login local, como vimos antes.