Partimos de un servidor recién creado al que todavía se entra como root y con contraseña.
El objetivo es terminar con un usuario propio, acceso solo por clave y el login de root cerrado.
1. Crear un usuario con permisos de administrador
Conviene no trabajar directamente como root, pero sí tener permisos de administrador
cuando hagan falta.
adduser usuario
usermod -aG sudo usuario
Comprobamos que el usuario pertenece al grupo sudo:
groups usuario
2. Generar el par de claves
Las claves se crean en el equipo local, no en el servidor:
ssh-keygen -t ed25519 -C "mi_equipo"
Quedan guardadas en C:\Users\usuario\.ssh en Windows, o en ~/.ssh en
Linux y macOS. Después, en el servidor, creamos la carpeta .ssh dentro de
/home/usuario/, y dentro un fichero authorized_keys con el contenido de la
clave pública (el fichero .pub).
Hay que subir la clave por SFTP conectándose con el usuario creado, no como root. Si no,
la clave quedará en el directorio de root y solo servirá para entrar como root.
3. Ajustar los permisos
SSH ignora las claves si los permisos son demasiado abiertos:
chmod 700 /home/usuario/.ssh
chmod 600 /home/usuario/.ssh/authorized_keys
Para verificarlo:
ls -la /home/usuario/.ssh
drwx------ 2 usuario usuario 4096 ... .
-rw------- 1 usuario usuario 100 ... authorized_keys
4. Probar la conexión
Desde el equipo local, antes de cerrar nada. Si entra sin pedir la contraseña del usuario —o pidiendo solo la passphrase de la clave, si le pusiste una— está funcionando:
ssh usuario@IP_DEL_SERVIDOR
Para configurar las claves en Termius y Filezilla, ver Configurar claves SSH en Termius y Filezilla.
5. Bloquear el login de root y por contraseña
Deja la sesión actual abierta hasta haber comprobado que entras por clave desde otra ventana. Si te equivocas aquí, puedes quedarte fuera del servidor.
Editamos la configuración de SSH:
sudo nano /etc/ssh/sshd_config
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
6. Comprobar que nada pisa la configuración
sshd_config incluye los ficheros de sshd_config.d/, y lo que digan ellos
puede ganar. Vamos a ver qué hay:
grep -r -E "PermitRootLogin|PasswordAuthentication" /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config.d/50-cloud-init.conf:PasswordAuthentication yes
Ese fichero estaba activando de nuevo el acceso por contraseña, daba igual lo que pusiéramos en
sshd_config. Lo cambiamos:
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
Ponemos PasswordAuthentication no y guardamos. Como lo más probable es que se regenere
tras un reinicio, añadimos además un fichero propio que se lee antes y por tanto gana:
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
Y confirmamos que ese directorio se incluye:
grep -i "^Include" /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
7. Validar y recargar
Primero validamos la sintaxis; si hay un error, mejor saberlo antes de recargar:
sudo sshd -t
sudo systemctl reload ssh
Y comprobamos la configuración que de verdad está aplicando el servidor:
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication|pubkeyauthentication"
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
A partir de aquí, al servidor solo se entra con la clave privada.
Tecnologías
- SSH
- ed25519
- Linux
- Hardening