Conexión SSH segura en Ubuntu

En el servidor (Ubuntu Server)

Comprueba que SSH está activo:

sudo systemctl status ssh

Si no estuviera activo:

sudo systemctl enable --now ssh

Averigua la IP del servidor:

ip a

Quédate con algo como 192.168.1.50.

En el cliente

  • Si el alumno está en Linux/macOS: ya tiene ssh.
  • Si está en Windows: puede usar PowerShell (trae ssh) o Windows Terminal.

1) Primera conexión “normal” (para ver que funciona)

En el cliente, conecta:

ssh usuario@192.168.1.50

Ejemplo:

ssh alumno@192.168.1.50

La primera vez saldrá el aviso de huella:

  • Are you sure you want to continue connecting (yes/no/[fingerprint])?

Escribe:

yes

Mete la contraseña del usuario.

✅ Resultado esperado: entras y ves el prompt del servidor.


2) Crear usuario “de trabajo” y evitar usar root

En el servidor, crea un usuario nuevo (si no existe):

sudo adduser operario

Dale permisos de administración (sudo):

sudo usermod -aG sudo operario

Prueba desde el cliente entrar con ese usuario:

ssh operario@192.168.1.50

✅ Objetivo: que el alumno use siempre un usuario normal + sudo, no root.


3) Generar claves SSH (cliente) y copiarlas (servidor)

3.1 Generar clave en el CLIENTE

En el cliente:

ssh-keygen -t ed25519 -C "operario@lab"

Cuando pregunte dónde guardarla, ENTER.
Cuando pregunte passphrase, pon una (recomendado). Ejemplo: ClaveMuySecreta123!

Esto crea:

  • ~/.ssh/id_ed25519 (privada, NO se comparte)
  • ~/.ssh/id_ed25519.pub (pública, sí se comparte)

3.2 Copiar clave pública al SERVIDOR

Desde el cliente:

ssh-copy-id operario@192.168.1.50

Luego prueba entrar sin contraseña (solo con passphrase si la pusiste):

ssh operario@192.168.1.50

✅ Resultado esperado: ya no te pide la contraseña del usuario (solo la passphrase de la clave si existe).


4) Endurecer SSH: desactivar root y contraseñas

Ahora viene lo serio: si alguien intenta fuerza bruta, no hay contraseña que adivinar.

En el servidor, edita configuración:

sudo nano /etc/ssh/sshd_config

Busca (o añade) estas líneas:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

Opcional (muy recomendable): restringir a un usuario concreto:

AllowUsers operario

Guarda y reinicia SSH:

sudo systemctl restart ssh

Prueba crítica (NO saltársela)

  1. Mantén una sesión SSH abierta por si la lías (salvavidas).
  2. Abre otra terminal nueva e intenta entrar:
ssh operario@192.168.1.50

✅ Debe entrar con clave.
❌ Si pide contraseña y ya la desactivaste, es que la clave no está bien instalada.


5) Cambiar el puerto SSH (reduce ruido automático)

Esto no es “seguridad mágica”, pero quita miles de bots tontos.

En el servidor:

sudo nano /etc/ssh/sshd_config

Cambia o añade:

Port 2222

Reinicia:

sudo systemctl restart ssh

Ahora para entrar desde cliente:

ssh -p 2222 operario@192.168.1.50

6) Activar firewall UFW y permitir solo SSH

En el servidor:

sudo ufw allow 2222/tcp
sudo ufw enable
sudo ufw status verbose

✅ Debe verse permitido el puerto 2222/tcp.


7) Verificación y “pruebas de ataque” controladas

7.1 Ver qué está escuchando

Servidor:

ss -tulpn | grep ssh

Debería verse :2222.

7.2 Probar que root NO entra

Cliente:

ssh -p 2222 root@192.168.1.50

✅ Debe fallar.

7.3 Probar que contraseña NO sirve

Cliente (forzando password):

ssh -p 2222 -o PreferredAuthentications=password -o PubkeyAuthentication=no operario@192.168.1.50

✅ Debe fallar.


8) Extras opcionales de seguridad (si te da tiempo)

A) Desactivar acceso por usuario/contraseña en el propio sistema (no solo SSH)

No siempre interesa en clase, pero es un plus.

B) Fail2ban (bloquea IPs tras intentos)

Instalar:

sudo apt update
sudo apt install fail2ban -y

Comprobar:

sudo systemctl status fail2ban

Esto es “el portero del garito”: si alguien insiste, lo echa.