Automatiza la Seguridad Básica con Ansible: Hardening de Servidores Linux

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?

  1. Guarda el contenido arriba como hardening_linux.yml.
  2. Define en tu inventory los servidores donde quieres aplicar el hardening.
  3. 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.
Avatar

Por Mid