Restricción de Acceso SSH con SSSD y Grupos de Active Directory usando Ansible

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

En entornos corporativos donde la autenticación centralizada es esencial, integrar sistemas Linux con Active Directory (AD) mediante SSSD (System Security Services Daemon) permite una administración eficiente y segura. Además, limitar el acceso SSH únicamente a los usuarios de un grupo de AD específico mejora la postura de seguridad del sistema.

Este artículo describe cómo automatizar esta configuración usando Ansible, gestionando tanto sistemas Debian/Ubuntu como CentOS/RHEL, para:

  • Instalar los paquetes necesarios.
  • Configurar el servicio sssd.
  • Activar la creación automática de directorios home (mkhomedir).
  • Restringir el acceso SSH según pertenencia a un grupo de AD.

Requisitos previos

  • Nodo gestionado unido previamente a Active Directory (por ejemplo, usando realm join).
  • Inventario de Ansible con privilegios de root.
  • Variables definidas:
    • ad_domain: dominio AD (ej. empresa.local)
    • realm: nombre del realm Kerberos (ej. EMPRESA.LOCAL)
    • ad_group: nombre del grupo de AD autorizado
    • ou_filter: ruta DN de la OU (ej. OU=Grupos,DC=empresa,DC=local)
    • pam_common_session, sssd_config_path, y sshd_config: rutas adaptadas a la distribución

Playbook de Ansible

A continuación se presenta el playbook completo:

---
- name: Configurar acceso SSH mediante SSSD y grupo de AD
  hosts: all
  become: true
  vars:
    ad_domain: empresa.local
    realm: EMPRESA.LOCAL
    ad_group: sshusers
    ou_filter: OU=Grupos,DC=empresa,DC=local
    pam_common_session: /etc/pam.d/common-session
    sssd_config_path: /etc/sssd/sssd.conf
    sshd_config: /etc/ssh/sshd_config

  tasks:

    - name: Detectar distribución
      ansible.builtin.setup:
        gather_subset: min

    - name: Instalar paquetes en Debian/Ubuntu
      ansible.builtin.apt:
        name:
          - sssd
          - sssd-tools
          - libnss-sss
          - libpam-sss
          - oddjob
          - oddjob-mkhomedir
        state: present
        update_cache: yes
      when: ansible_facts['os_family'] == "Debian"

    - name: Instalar paquetes en RHEL/CentOS
      ansible.builtin.yum:
        name:
          - sssd
          - sssd-tools
          - oddjob
          - oddjob-mkhomedir
          - authselect
        state: present
      when: ansible_facts['os_family'] == "RedHat"

    - name: Activar mkhomedir en Debian/Ubuntu
      ansible.builtin.lineinfile:
        path: "{{ pam_common_session }}"
        line: "session required pam_mkhomedir.so skel=/etc/skel umask=0077"
        state: present
      when: ansible_facts['os_family'] == "Debian"

    - name: Activar mkhomedir en RHEL/CentOS
      ansible.builtin.command: authselect select sssd with-mkhomedir --force
      when: ansible_facts['os_family'] == "RedHat"
      ignore_errors: true

    - name: Configurar archivo sssd.conf
      ansible.builtin.template:
        dest: "{{ sssd_config_path }}"
        mode: '0600'
        content: |
          [sssd]
          domains = {{ ad_domain }}
          config_file_version = 2
          services = nss, pam, ssh

          [domain/{{ ad_domain }}]
          ad_domain = {{ ad_domain }}
          krb5_realm = {{ realm }}
          realmd_tags = manages-system joined-with-samba
          cache_credentials = True
          id_provider = ad
          access_provider = ldap
          ldap_access_order = filter
          ldap_access_filter = (memberOf=CN={{ ad_group }},{{ ou_filter }})
          default_shell = /bin/bash
          fallback_homedir = /home/%u
          ldap_id_mapping = true

    - name: Reiniciar SSSD
      ansible.builtin.service:
        name: sssd
        state: restarted
        enabled: true

    - name: Asegurar que UsePAM yes está en sshd_config
      ansible.builtin.lineinfile:
        path: "{{ sshd_config }}"
        regexp: "^UsePAM"
        line: "UsePAM yes"
        state: present

    # - name: (Opcional) Restringir también con AllowGroups en SSH
    #   ansible.builtin.lineinfile:
    #     path: "{{ sshd_config }}"
    #     line: "AllowGroups domain^{{ ad_group }}@{{ realm }}"
    #     state: present

    - name: Reiniciar SSH
      ansible.builtin.service:
        name: sshd
        state: restarted
        enabled: true

Consideraciones adicionales

  • Seguridad del archivo sssd.conf: debe tener permisos 0600 o el servicio fallará.
  • mkhomedir: garantiza que al iniciar sesión por primera vez, el usuario de AD tendrá su directorio /home creado automáticamente.
  • ldap_access_filter: permite un control granular del acceso mediante un filtro LDAP, muy útil si quieres limitar aún más a nivel de grupo/OU.
  • AllowGroups en SSH (comentado): útil como doble validación si quieres añadir una capa más restrictiva al servicio SSH.

Conclusión

Automatizar la restricción de acceso SSH mediante Ansible, SSSD y Active Directory permite a los equipos de IT estandarizar configuraciones críticas de seguridad de forma eficiente. Esta metodología resulta especialmente útil en entornos híbridos o con múltiples servidores donde se requiere control de acceso centralizado.

Compartir:

Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.