El acceso remoto a servidores a través de SSH es una práctica habitual en la administración de sistemas, pero también representa un vector de ataque común si no se configura adecuadamente. En particular, permitir el inicio de sesión como usuario root
o habilitar claves públicas sin una gestión cuidadosa puede comprometer la seguridad del sistema.
Este artículo describe cómo automatizar, mediante Ansible, la desactivación del acceso SSH como root
y la autenticación por clave pública, reforzando así la seguridad del servicio SSH. Se incluye un playbook listo para ser utilizado en sistemas Debian/Ubuntu y CentOS/RHEL.
Objetivos
- Detectar automáticamente la distribución del sistema.
- Realizar una copia de seguridad del archivo de configuración SSH (
sshd_config
). - Modificar las directivas
PermitRootLogin
yPublicKeyAuthentication
para deshabilitarlas. - Reiniciar el servicio SSH con el nombre correcto según la distribución detectada.
Consideraciones previas
Antes de ejecutar este playbook, asegúrate de:
- Tener una cuenta de usuario con privilegios
sudo
o de root para ejecutar las tareas necesarias. - Establecer una conexión Ansible funcional hacia los hosts objetivo.
- Disponer de un método alternativo de acceso (por ejemplo, consola local o KVM) en caso de errores que impidan acceder por SSH después de aplicar los cambios.
Playbook de Ansible
---
- name: Deshabilitar login root y claves públicas en SSH
hosts: all
become: yes
tasks:
- name: Detectar distribución
ansible.builtin.setup:
filter: ansible_distribution
- name: Copia de seguridad de sshd_config
ansible.builtin.copy:
src: /etc/ssh/sshd_config
dest: /etc/ssh/sshd_config.bak
remote_src: yes
mode: '0644'
- name: Deshabilitar acceso root
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin no'
backup: yes
- name: Deshabilitar autenticación por clave pública
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PublicKeyAuthentication'
line: 'PublicKeyAuthentication no'
create: yes
backup: yes
- name: Reiniciar servicio SSH
ansible.builtin.service:
name: "{{ 'ssh' if ansible_distribution in ['Debian', 'Ubuntu'] else 'sshd' }}"
state: restarted
Descripción de tareas
- Detección de distribución
Se utiliza el módulosetup
para recopilar información del sistema y detectar la distribución. Esto permite adaptar el nombre del servicio SSH según el sistema operativo. - Copia de seguridad del archivo
sshd_config
Se realiza una copia del archivo actual antes de modificarlo, lo que permite restaurar la configuración original en caso necesario. - Desactivación del login como root
Se modifica (o crea) la líneaPermitRootLogin no
para evitar el acceso directo del usuarioroot
vía SSH. - Desactivación de autenticación por clave pública
Se asegura que la opciónPublicKeyAuthentication
esté deshabilitada, cerrando el acceso por esta vía incluso si existen claves autorizadas en el sistema. - Reinicio del servicio SSH
Se reinicia el servicio SSH con el nombre correcto para que los cambios surtan efecto de inmediato.
Conclusión
Este playbook de Ansible proporciona una forma sencilla y reutilizable de aplicar políticas de endurecimiento del servicio SSH en múltiples servidores. Su uso es especialmente recomendable en entornos donde la administración se realiza mediante herramientas de orquestación o en sistemas expuestos a Internet.
Como buena práctica, se recomienda realizar auditorías periódicas de los servicios expuestos, y mantener medidas adicionales como autenticación multifactor (MFA) o VPN para el acceso remoto.
Compartir: