SSH en Debian/Ubuntu (modo puente): servidor sshd, usuarios y sudo
🔐 SSH en Debian (1/3): el servidor sshd, usuarios y sudo
2º ASIR · Cliente SSH: MADLinuX (host) · Servidor SSH: Debian o Ubuntu (VM en VirtualBox, modo puente) Guías: 1 (esta) · RETO 1 en parejas · RETO 1 vlb36 · 2 scp y rsync (próximamente) · 3 sftp, túneles y fail2ban (próximamente)
Objetivo: convertir la VM en un servidor de verdad (sin escritorio), accesible por SSH **solo por clave cifrada 🔐 **, con dos usuarios con sudo (pepa y compa).
Cada sección tiene un camino básico (a la vista) y, a veces, un bloque 🚀 Ampliación plegado: ábrelo solo si vas sobrado.
🗺️ ¿Qué tengo que hacer, en orden? Esta guía es el paso 1, tú solo/a en tu VM:
Paso Dónde Con quién 1. Esta guía servidor-ssh.md(secciones 1-8 + mini-reto + ejercicios 1-3)tú solo/a 2. RETO 1 en parejas /blog/reto1-ssh-compa/ tú + tu compañero/a, en el aula 3. RETO 1 vlb36 /blog/reto1-ssh-compa-vlb36/ igual, pero contra Internet (ValdeLAB36) El 🏁 Mini-reto del punto 8 de esta guía no es el RETO 1 de verdad: es un ensayo en solitario para llegar preparado/a al paso 2.
✅ Objetivos de esta guía
Al terminar, serás capaz de:
- Dar a tu usuario permisos de
sudoy arrancar la VM sin escritorio. - Poner la VM en modo puente y averiguar su IP en la red.
- Crear un segundo usuario (
compa) consudo. - Instalar y comprobar que
sshdestá escuchando. - Conectarte por SSH y verificar la huella del servidor.
- Entrar con clave en vez de contraseña.
- Blindar el servidor: sin
root, sin contraseñas, solo usuarios autorizados.
📦 Antes de empezar necesitas
- Una VM con Debian o Ubuntu instalada en VirtualBox (puede tener o no escritorio todavía).
- Tu MADLinuX (el host) con
sshinstalado — ya lo tienes. - Tu MADLinuX y la VM conectados a la misma red: el modo puente lo necesita.
- La contraseña de
rootde la VM (o que tu usuario ya tengasudo, si elegiste esa opción al instalar). - 45-60 minutos sin prisa la primera vez.
0. Escenario inicial y convenciones
MAX: MADridLinuX (HOST) Debian (VM VirtualBox, en modo puente)
┌──────────────┐ ┌──────────────────────┐
│ cliente: ssh │ ───────────────────────► │ servidor: sshd (:22) │
│ tú │ misma red (IP propia) │ usuarios: pepa/compa │
└──────────────┘ └──────────────────────┘
| Prompt | Significa |
|---|---|
HOST$ |
terminal de tu MADLinuX (cliente) |
VM$ |
terminal de la VM (servidor) |
VM# |
la VM como root (tras su -; solo en el punto 2) |
IP_VM |
la IP de tu VM en la red (la averiguamos en el punto 3; ej. 192.168.1.57) |
🟠 ¿Ubuntu en la VM? Todo funciona igual. Las pocas diferencias van marcadas con 🟠.
🧯 Kit de supervivencia en la terminal
| Tecla / comando | Para qué |
|---|---|
Tab |
autocompleta nombres de comandos y archivos (¡úsalo siempre!) |
↑ / ↓ |
recupera comandos anteriores |
Ctrl+C |
aborta lo que se está ejecutando |
nano archivo |
editor sencillo: Ctrl+O guarda, Ctrl+X sale |
sudo comando |
ejecuta ese comando como administrador (pide tu contraseña) |
Regla de oro del administrador de sistemas: nunca cierres tu única sesión sin haber probado otra nueva. Con una VM tienes red de seguridad extra: la consola de VirtualBox siempre entra, aunque SSH esté roto.
1. ¿Qué es SSH? (2 minutos)
SSH (Secure Shell) es un protocolo que cifra la comunicación entre dos máquinas. Sustituyó a telnet, que enviaba todo en texto plano, contraseñas incluidas.
- Servidor:
sshd(paqueteopenssh-server), escucha en el puerto 22/tcp. - Cliente:
ssh(ya instalado en MADLinuX).
2. Punto de partida: root, tu usuario y una VM «de servidor»
Tu VM tiene dos tipos de cuenta (aquí tu usuario se llama pepa; usa el tuyo):
root (administrador) |
tu usuario (pepa) |
|
|---|---|---|
| Prompt | termina en # |
termina en $ |
| Puede | todo (también romperlo todo) | solo lo suyo (/home/pepa) |
| Contraseña | la de root | la tuya |
Como al instalar pusimos contraseña de root, Debian no le dio sudo a tu usuario. Compruébalo:
VM$ sudo whoami
# pepa is not in the sudoers file. ← esperado: aún no tienes sudo
Arreglo: usamos root una última vez para darte sudo y, de paso, quitar el escritorio:
VM$ su - # pide la contraseña de ROOT; el prompt pasa a #
VM# whoami # → root
VM# apt install sudo # por si no estaba
VM# usermod -aG sudo pepa # añade pepa al grupo sudo (-a: sin quitar los demás)
VM# systemctl set-default multi-user.target # arrancar en modo texto, sin escritorio
VM# reboot
Tras reiniciar verás una pantalla negra con debian login:. Entra con tu usuario y comprueba:
VM$ groups # debe aparecer: sudo
VM$ sudo whoami # pide TU contraseña → root
⚠️
su -con guion. Sin el guion sigues con el entorno depepa, y verásusermod: orden no encontrada.
🤔
suosudo:
su -: te conviertes en root (contraseña de root) hasta que hacesexit. Es peligroso olvidarse dentro.sudo comando: solo ese comando como root (contraseña tuya), y queda registrado quién lo hizo.A partir de aquí usamos siempre
sudo.
¿Por qué sin escritorio? Un servidor real no tiene pantalla ni ratón: está en un armario (o en la nube) y se administra a distancia, por SSH. Tener escritorio en la VM de prácticas es, como dice David, «como jugar al solitario y hacer trampas» 🙂: funciona, pero no aprendes nada.
Y lo vas a notar enseguida: en la consola de texto de VirtualBox no hay copiar y pegar, la ventana es pequeña y solo hay una. Desde la terminal de tu MADLinuX, con SSH, tendrás todo eso. Esa es la gracia de esta guía.
💡 La consola tiene 6 terminales:
Ctrl derecho + F1…F6cambia entre ellas. ¿Echas de menos el escritorio?sudo systemctl set-default graphical.targetysudo reboot(no se ha borrado nada).
🟠 Ubuntu no tiene contraseña de root y tu usuario ya tiene
sudo: haz solosudo systemctl set-default multi-user.targetysudo reboot.
🚀 Ampliación: instalar una VM «de servidor» desde cero
Con la ISO debian-13.x-amd64-netinst.iso:
- En el asistente Nueva VM de VirtualBox 7, marca «Omitir instalación desatendida» (Skip Unattended Installation). Si no, VirtualBox instala Debian solo y con escritorio.
- 1 GB de RAM, 1 CPU y 10 GB de disco son suficientes.
- Contraseña de root: si la dejas en blanco, el instalador instala
sudoy te lo da (te ahorras elsu -). - En Selección de programas: desmarca «Entorno de escritorio Debian» y GNOME; marca «Servidor SSH» y «Utilidades estándar del sistema».
3. Red: la VM en modo puente
Con Conectado a: Adaptador puente (Configuración → Red → Adaptador 1), la VM deja de estar aislada: obtiene su propia IP en tu red, como un ordenador más (igual que tu móvil o tu MADLinuX).
Enciende (o reinicia) la VM y averigua su IP:
VM$ ip -br a
# enp0s3 UP 192.168.1.57/24 ... ← esta es la IP de tu VM (IP_VM)
Comprueba desde el HOST que se ven:
HOST$ ping -c 2 192.168.1.57 # sustituye por tu IP_VM
💡 El
pingdebe funcionar: la VM tiene una IP real en tu red, visible desde cualquier equipo de esa red. Si no responde, la VM no está realmente en modo puente: revisa el adaptador.
A partir de aquí, tu VM es IP_VM (por ejemplo 192.168.1.57): nada de puertos especiales, siempre el 22 por defecto. Por ejemplo: ssh pepa@192.168.1.57.
⚠️ Al estar en la misma red, tu VM es accesible para cualquiera que esté en esa red, no solo para ti. Por eso blindar el servidor (punto 8) importa de verdad.
💡 Si cambias de red (otra aula, tu casa) la IP de tu VM puede cambiar: repite
ip -br apara comprobarla.
4. Usuarios: pepa (ya existe) y compa (nuevo)
VM$ id pepa # tu usuario: debe aparecer el grupo sudo
VM$ sudo adduser compa # asistente: contraseña, nombre... (Enter para saltar)
VM$ sudo usermod -aG sudo compa # compa también tendrá sudo
VM$ groups compa # debe aparecer: sudo
🤔 Nombres de usuario en minúsculas, sin
ñni acentos:adduserrechazacompañero. Por eso usamoscompa.
🚀 Ampliación: sudo con reglas explícitas (visudo) y NOPASSWD
Meter a alguien en el grupo sudo funciona porque /etc/sudoers trae esta línea de serie:
%sudo ALL=(ALL:ALL) ALL
Se lee: «los miembros del grupo sudo, en cualquier host, pueden ejecutar como cualquier usuario:grupo cualquier comando».
La alternativa es una regla por usuario, en un archivo propio y siempre con visudo, que comprueba la sintaxis al guardar (un error en sudoers puede dejarte sin sudo para todos):
VM$ sudo visudo -f /etc/sudoers.d/aula
# compa ALL=(ALL:ALL) ALL
VM$ sudo -l -U compa # qué puede hacer compa
A investigar 😉: la etiqueta NOPASSWD: (man sudoers). ¿Qué comodidad aporta? ¿Qué pasa si roban tu clave SSH? ¿Cuándo es legítima (scripts, cron)? ¿Se puede limitar a un solo comando? No la pongas en tu servidor hasta saber responder.
5. Instalar y comprobar sshd
Si no marcaste «servidor SSH» al instalar:
VM$ sudo apt install openssh-server
Comprobación:
VM$ systemctl status ssh # debe poner: active (running) (q para salir)
VM$ ss -tln | grep :22 # alguien escucha en el puerto 22
🟠 Ubuntu arranca SSH «bajo demanda» (
ssh.socket):statuspuede decirinactivehasta la primera conexión. Lo que cuenta es quessmuestre el puerto 22.
6. Primera conexión
HOST$ ssh pepa@IP_VM
# The authenticity of host 'IP_VM' can't be established.
# ED25519 key fingerprint is SHA256:xxxxxxxx...
# Are you sure you want to continue connecting (yes/no/[fingerprint])?
Esa huella es el «DNI» del servidor. Compruébala en la consola de la VM:
VM$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Si coinciden, escribe yes y luego tu contraseña. Para salir de la sesión remota: exit.
⚠️ Si algún día ves WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!: o has reinstalado la VM / otra máquina ha heredado esa IP (normal) o alguien se interpone (ataque man-in-the-middle). Si es lo primero: HOST$ ssh-keygen -R IP_VM.
7. Entrar con clave en vez de contraseña
Una contraseña se puede adivinar probando millones. Con un par de claves: la privada se queda en tu máquina y la pública se copia al servidor.
HOST$ ssh-keygen -t ed25519 # Enter a todo; pon una passphrase si quieres
HOST$ ssh-copy-id pepa@IP_VM # copia la pública (pide la contraseña, última vez)
HOST$ ssh pepa@IP_VM # ¡ya entra con la clave!
| Dónde | Archivo | Qué es |
|---|---|---|
HOST ~/.ssh/id_ed25519 |
clave privada | ¡NUNCA se comparte! |
HOST ~/.ssh/id_ed25519.pub |
clave pública | se puede repartir |
VM ~/.ssh/authorized_keys |
públicas autorizadas | una por línea |
🚀 Ampliación: alias ssh vm y comandos remotos
¿Cansado de teclear la IP cada vez? En ~/.ssh/config del HOST (chmod 600 ~/.ssh/config):
Host vm
HostName IP_VM
User pepa
HOST$ ssh vm # ¡sin recordar IP ni usuario!
HOST$ ssh vm 'hostname; uptime' # ejecuta un comando y sale
HOST$ ssh -v vm # modo detallado: para depurar fallos
8. Blindar el servidor
No tocamos el archivo principal (/etc/ssh/sshd_config): creamos nuestro propio archivo en sshd_config.d/, que se lee antes y manda.
VM$ sudo nano /etc/ssh/sshd_config.d/10-aula.conf
PermitRootLogin no
PasswordAuthentication no
AllowUsers pepa compa
| Directiva | Para qué sirve |
|---|---|
PermitRootLogin no |
nadie entra como root: se entra como usuario y se usa sudo |
PasswordAuthentication no |
prohíbe contraseñas: solo claves |
AllowUsers pepa compa |
lista blanca: solo estos usuarios pueden entrar |
⚠️ Antes de guardar esto, comprueba que
pepaycompaya entran con clave. Si no, te quedas fuera (la consola de VirtualBox te rescata).
✅ Checklist de seguridad (lo que se exige en esta guía)
-
PermitRootLogin no -
PasswordAuthentication no -
AllowUsers pepa compa
Aplicar los cambios, siempre en este orden:
VM$ sudo sshd -t # 1) ¿sintaxis correcta? (sin mensajes = OK)
VM$ sudo systemctl reload ssh # 2) recargar (no corta la sesión abierta)
HOST$ ssh pepa@IP_VM # 3) probar en OTRA terminal, sin cerrar la actual
🚀 Ampliación: más directivas y herramientas de diagnóstico
MaxAuthTries 3 # intentos por conexión
LoginGraceTime 30 # segundos para autenticarse
X11Forwarding no # sin reenvío gráfico
VM$ sudo sshd -T | grep -i passwordauthentication # valor REAL activo
VM$ sudo journalctl -u ssh -f # log en vivo (Ctrl+C para salir)
¿Por qué 10-aula.conf «manda»? En sshd_config gana el primer valor que se lee, y el archivo principal empieza con Include /etc/ssh/sshd_config.d/*.conf. 🟠 En Ubuntu puede existir un 50-cloud-init.conf con PasswordAuthentication yes: nuestro 10- se lee antes.
Cambiar el puerto de sshd (directiva Port) reduce ruido en los logs, no da seguridad real. Lo veremos con fail2ban en la guía 3.
🏁 Mini-reto (ensayo en solitario): dar acceso SSH a compa
ℹ️ Esto no es el RETO 1 oficial (ese es en parejas, con un compañero de verdad: ver el mapa al principio de la guía). Aquí simulas tú solo/a el papel de
compapara comprobar que sabes hacerlo antes de depender de otra persona.
Enunciado: compa necesita entrar por SSH a tu VM con su clave y tener sudo. Solo vosotros dos podéis entrar, sin contraseñas ni root.
compaexiste y está en el gruposudo.compagenera su par de claves. (Simúlalo en tu HOST:ssh-keygen -t ed25519 -f ~/.ssh/id_compa.)- Su pública está instalada en la VM (
ssh-copy-id). 10-aula.confaplicado.- Pruebas:
| Prueba | Resultado esperado |
|---|---|
ssh -i ~/.ssh/id_compa compa@IP_VM |
✅ entra |
ssh pepa@IP_VM |
✅ entra |
ssh root@IP_VM |
❌ Permission denied |
ssh intruso@IP_VM |
❌ Permission denied |
▶ Ver solución
# 1) Usuario y sudo
VM$ sudo adduser compa
VM$ sudo usermod -aG sudo compa
# 2-3) Claves de compa (con las contraseñas aún activas)
HOST$ ssh-keygen -t ed25519 -f ~/.ssh/id_compa
HOST$ ssh-copy-id -i ~/.ssh/id_compa.pub compa@IP_VM
# 4) Blindar
VM$ sudo nano /etc/ssh/sshd_config.d/10-aula.conf # (contenido del punto 8)
VM$ sudo sshd -t && sudo systemctl reload ssh
# 5) Probar (en otra terminal)
HOST$ ssh -i ~/.ssh/id_compa compa@IP_VM 'sudo whoami' # → root
HOST$ ssh root@IP_VM # → Permission denied
🏁 RETO 2: servidor sin pantalla (headless)
Enunciado: un servidor de verdad está en un armario, sin monitor. Arranca tu VM sin ventana y adminístrala solo desde MADLinuX.
- Apaga la VM desde SSH: entra con
ssh pepa@IP_VMy ejecutasudo poweroff. - En VirtualBox: botón Iniciar ▾ → «Inicio sin interfaz» (Headless Start). No se abre ninguna ventana.
- Espera unos 30 segundos (está arrancando «a ciegas») y conéctate.
- Pruebas:
| Prueba | Resultado esperado |
|---|---|
ssh pepa@IP_VM 'hostname; uptime' |
✅ responde sin abrir sesión |
Dentro de la VM: systemctl get-default |
✅ multi-user.target |
Dentro de la VM: sudo poweroff |
✅ VirtualBox muestra la VM como Apagada |
🆘 ¿No conecta? Selecciona la VM en VirtualBox y pulsa Mostrar: aparece la consola y puedes investigar (¿arrancó? ¿
sshdactivo? ¿cambióIP_VM?).
🚀 Ampliación: controlar VirtualBox desde la terminal (VBoxManage)
HOST$ VBoxManage list vms # nombres de tus VMs
HOST$ VBoxManage startvm "NOMBRE_VM" --type headless # arrancar sin ventana
HOST$ VBoxManage list runningvms # ¿cuáles están encendidas?
HOST$ VBoxManage controlvm "NOMBRE_VM" acpipowerbutton # apagado limpio (como pulsar el botón)
Con esto ya no necesitas ni la ventana de VirtualBox: todo desde la terminal.
✏️ Ejercicios
- Red. Pon la VM en modo puente y conéctate. Comprobación:
ssh pepa@IP_VMy dentro,hostname. - Huella. Compara la huella del cliente con la de la VM. ¿Qué ataque evita esta comprobación?
- sudo. Como
compa:cat /etc/shadow→ Permission denied;sudo cat /etc/shadow→ funciona. Explica por qué. - Mini-reto completo, con la tabla de pruebas en verde.
- RETO 2. Una sesión de clase entera con la VM en headless, sin abrir la consola ni una vez.
- Hecho lo anterior, ya puedes empezar el RETO 1 en parejas (ver el mapa al principio de la guía): no forma parte de esta lista, es el siguiente paso.
⚠️ Errores frecuentes
| Síntoma | Causa probable | Solución |
|---|---|---|
Connection refused |
sshd parado, o conectas a un puerto que no es el 22 |
systemctl status ssh (punto 5); revisa que usas el puerto por defecto |
ping a la VM no responde |
la VM no está realmente en modo puente | revisa el adaptador de red (punto 3) |
Connection timed out |
IP_VM equivocada o cambió (DHCP) |
ip -br a en la VM; repite el ping |
Permission denied (publickey) |
clave no instalada, o usuario no está en AllowUsers |
ssh-copy-id antes de blindar; revisa 10-aula.conf |
pepa is not in the sudoers file |
no hiciste el punto 2, o no reiniciaste después | punto 2; groups debe mostrar sudo |
REMOTE HOST IDENTIFICATION HAS CHANGED |
VM reinstalada, otra máquina con la misma IP (o ataque) | ssh-keygen -R IP_VM |
| Me he quedado fuera | blindaste antes de instalar las claves | consola de VirtualBox → corrige 10-aula.conf → sshd -t → reload |
🧾 Chuleta
ssh usuario@IP_VM ssh-copy-id usuario@IP_VM
ssh-keygen -t ed25519 ssh-keygen -R IP_VM
sudo adduser NOMBRE sudo usermod -aG sudo NOMBRE
sudo sshd -t sudo systemctl reload ssh
sudo systemctl set-default multi-user.target # servidor sin escritorio
VBoxManage startvm "NOMBRE_VM" --type headless # VM sin ventana (en el HOST)
Documentación: man ssh, man sshd_config, man sudoers.
➡️➡️ ⚠️ Esta guía es meramente informativa: puede contener errores. Por favor, si encuentras un error, hazmelo saber. ❤ Gracias
RUBRICA (BORRADOR) DE CALIFICACIÓN
Criterios de contenido (100%)
| Criterio | Peso | Qué se valora |
|---|---|---|
| Servidor SSH operativo y blindado (guía 1) | 50% | VM en modo puente, accesible por IP propia · usuario con sudo y compa creado · sshd activo · entra con clave (sin contraseña) · 10-aula.conf aplicado: PermitRootLogin no, PasswordAuthentication no, AllowUsers pepa compa |
RETO 1 en parejas (reto1-ssh-compa.md) |
35% | El compañero entra con su clave, sin contraseña · tabla de pruebas superada (root denegado, intruso denegado) · roles intercambiados (los dos han sido servidor y cliente) |
| Ejercicios y reflexión | 15% | Respuestas razonadas a las preguntas de cierre (huella, sudo, IP del atacante en journalctl…) — no se exige precisión técnica perfecta, basta con que se note que lo han pensado |
Eesta práctica se evalúa sobre todo viendo el servidor funcionar (en clase o por captura/demo), no sobre un documento entregable formal.
Escala orientativa (benévola)
- Excelente (9-10): servidor blindado y RETO 1 completo con los dos roles probados, aunque falte pulir alguna respuesta de reflexión.
- Notable (7-8.9): servidor blindado pero el RETO 1 solo se hizo en un sentido (no se cambiaron los papeles), o alguna prueba de la tabla no se verificó explícitamente.
- Suficiente (5-6.9): servidor accesible por clave pero el blindado incompleto (falta alguna de las 3 directivas), o el RETO 1 no llegó a completarse con un compañero real.
- Insuficiente (<5): no se consigue acceso por SSH con clave, o no hay ningún intento documentado del RETO 1.