Automatiza la Seguridad Básica con Ansible: Hardening de Servidores Linux
Dificultad: Media
¿Por qué implementar hardening básico con Ansible?
El hardening o endurecimiento de servidores es esencial para reducir la superficie de ataque y proteger tus sistemas frente a amenazas habituales.
Manualmente es tedioso y susceptible a errores, pero Ansible permite aplicar las mejores prácticas de seguridad de forma rápida, homogénea y repetible en múltiples servidores sin agentes[1][3].
¿Qué vamos a automatizar?
- Actualización de paquetes y parches críticos.
- Deshabilitar servicios innecesarios y eliminar paquetes de riesgo.
- Ajustar opciones seguras en SSH (
sshd
). - Implementar políticas de contraseñas más robustas.
- Asegurar permisos de archivos críticos.
- Registrar logs de los cambios realizados.
Todo ello, listo para extenderlo o personalizarlo según tus necesidades.
Playbook completo hardening_linux.yml
Este playbook está diseñado para Ubuntu/Debian, pero puedes adaptarlo fácilmente a CentOS u otros sabores.
---
- name: Hardening básico de servidores Linux
hosts: all
become: true
vars:
sshd_ports: [22]
ssh_permit_root_login: 'no'
ssh_password_auth: 'no'
packages_to_remove:
- telnet
- rsh-client
- xinetd
- nfs-common
- vsftpd
min_pass_len: 12
tasks:
- name: Actualizar todos los paquetes instalados
apt:
upgrade: dist
update_cache: yes
- name: Eliminar paquetes inseguros y no utilizados
apt:
name: "{{ packages_to_remove }}"
state: absent
- name: Asegurar la configuración de SSH - prohibir login por root y password
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
state: present
create: yes
backrefs: yes
with_items:
- { regexp: '^#?PermitRootLogin\s+.*', line: 'PermitRootLogin {{ ssh_permit_root_login }}' }
- { regexp: '^#?PasswordAuthentication\s+.*', line: 'PasswordAuthentication {{ ssh_password_auth }}' }
notify: Restart SSH
- name: Cambiar el puerto SSH (opcional, modifica sshd_ports si lo deseas)
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?Port [0-9]+'
line: "Port {{ item }}"
state: present
create: yes
backrefs: yes
with_items: "{{ sshd_ports }}"
notify: Restart SSH
- name: Asegurar permisos en archivos críticos
file:
path: "{{ item.path }}"
owner: root
group: root
mode: "{{ item.mode }}"
loop:
- { path: '/etc/passwd', mode: '0644' }
- { path: '/etc/shadow', mode: '0400' }
- { path: '/etc/ssh/sshd_config', mode: '0600' }
- name: Establecer una política de contraseñas robusta (pam)
lineinfile:
path: /etc/pam.d/common-password
regexp: '^(password\s+requisite\s+pam_pwquality.so.*$)'
line: 'password requisite pam_pwquality.so retry=3 minlen={{ min_pass_len }} ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1'
state: present
insertafter: EOF
- name: Registrar cambios realizados
shell: "echo 'Hardening aplicado el {{ ansible_date_time.iso8601 }} por Ansible' >> /var/log/hardening_ansible.log"
¿Cómo usar este playbook?
- Guarda el contenido arriba como
hardening_linux.yml
. - Define en tu
inventory
los servidores donde quieres aplicar el hardening. - Lanza el playbook con:
ansible-playbook -i inventory hardening_linux.yml
Puedes customizar fácilmente los servicios, parámetros y paquetes según tus políticas de seguridad.
Consejos extra y troubleshooting 👨💻
- Siempre prueba en un entorno de preproducción antes de desplegar en servidores clave.
- Si pierdes la conexión SSH tras aplicar el playbook, verifica que tu usuario está autorizado via llave pública y ten acceso físico o consola virtual para recuperación.
- Revisa
/var/log/hardening_ansible.log
para ver los cambios aplicados. - Para hardening muy avanzado, existen roles completos como devsec.hardening en Ansible Galaxy.