# Control de Acceso SSH Basado en Active Directory mediante SSSD en Linux

- Link: https://binariocero.com/linux/control-de-acceso-ssh-basado-en-active-directory-mediante-sssd-en-linux
- Published: 2025-08-10T12:20:28+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

En entornos empresariales donde se integra Linux con Active Directory (AD), es común
que se quiera restringir el acceso SSH solo a determinados usuarios o grupos. Este
artículo presenta un script Bash que automatiza la integración de un sistema Linux
con un dominio AD y restringe el acceso SSH únicamente a los miembros de un grupo
específico ubicado dentro de una unidad organizativa (OU) concreta.

## **Objetivo del Script**

El propósito del script es:

 * Unir un sistema Linux a un dominio de Active Directory.
 * Configurar **SSSD (System Security Services Daemon)** como proveedor de identidades
   y autenticación.
 * Restringir el acceso SSH a usuarios pertenecientes a un grupo determinado dentro
   de una OU específica.
 * Asegurar la creación automática de directorios home para usuarios de dominio 
   al iniciar sesión.

    ```wp-block-code
    #!/bin/bash

    set -e

    DOMINIO="midominio.local"
    REALM="${DOMINIO^^}"
    OU_PERMITIDA="OU=PermitidosSSH,DC=midominio,DC=local"  # Ajusta según tu AD
    GRUPO_AD="PermitidosSSH"  # CN del grupo dentro de la OU

    echo "[INFO] Detectando distribución..."
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        DISTRO=$ID
    else
        echo "[ERROR] No se puede detectar la distribución."
        exit 1
    fi

    echo "[INFO] Instalando paquetes necesarios..."
    if [[ "$DISTRO" == "debian" || "$DISTRO" == "ubuntu" ]]; then
        apt update
        apt install -y sssd sssd-tools libnss-sss libpam-sss oddjob oddjob-mkhomedir
    elif [[ "$DISTRO" == "centos" || "$DISTRO" == "rhel" || "$DISTRO" == "rocky" || "$DISTRO" == "almalinux" ]]; then
        yum install -y sssd sssd-tools oddjob oddjob-mkhomedir authselect
    else
        echo "[ERROR] Distribución no soportada: $DISTRO"
        exit 1
    fi

    echo "[INFO] Configurando creación automática de directorios home..."
    if [[ "$DISTRO" == "debian" || "$DISTRO" == "ubuntu" ]]; then
        pam_file="/etc/pam.d/common-session"
        if ! grep -q "pam_mkhomedir.so" "$pam_file"; then
            echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" >> "$pam_file"
        fi
    else
        # En RHEL/CentOS
        authselect select sssd with-mkhomedir --force || true
    fi

    echo "[INFO] Configurando SSSD para restringir acceso SSH a grupo en OU específica..."

    cat >/etc/sssd/sssd.conf <<EOF
    [sssd]
    domains = ${DOMINIO}
    config_file_version = 2
    services = nss, pam, ssh

    [domain/${DOMINIO}]
    ad_domain = ${DOMINIO}
    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=${GRUPO_AD},${OU_PERMITIDA})
    default_shell = /bin/bash
    fallback_homedir = /home/%u
    ldap_id_mapping = true
    EOF

    chmod 600 /etc/sssd/sssd.conf

    echo "[INFO] Reiniciando servicios de SSSD..."
    systemctl restart sssd

    echo "[INFO] Configurando SSH para permitir inicio de sesión con usuarios de dominio..."
    sshd_config="/etc/ssh/sshd_config"

    if ! grep -q "^UsePAM yes" "$sshd_config"; then
        echo "UsePAM yes" >> "$sshd_config"
    fi

    # Puedes descomentar si quieres restringir por AllowGroups en SSH además del filtro de SSSD
    # echo "AllowGroups domain^${GRUPO_AD}@${REALM}" >> "$sshd_config"

    systemctl restart ssh

    echo "[INFO] Configuración completada. Solo los usuarios del grupo '${GRUPO_AD}' en la OU '${OU_PERMITIDA}' pueden iniciar sesión SSH."
    ```

## **Características del Script**

### 1. **Detección de la Distribución**

El script comienza detectando si el sistema operativo es una distribución basada
en Debian (como Ubuntu) o en RHEL (como CentOS, AlmaLinux o Rocky Linux), lo cual
determina el gestor de paquetes y algunas configuraciones específicas.

    ```wp-block-preformatted
    . /etc/os-releaseDISTRO=$ID
    ```

### 2. **Instalación de Paquetes Requeridos**

Dependiendo de la distribución, instala los paquetes necesarios para la autenticación
basada en AD:

 * `sssd`, `sssd-tools`, `libnss-sss`, `libpam-sss`, `oddjob`, `oddjob-mkhomedir`
 * En RHEL/CentOS, también incluye `authselect` para gestionar PAM.

### 3. **Creación Automática de Directorios Home**

Se configura `pam_mkhomedir.so` para crear automáticamente el directorio `/home/
usuario` la primera vez que un usuario inicia sesión.

    ```wp-block-preformatted
    echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" >> /etc/pam.d/common-session
    ```

En sistemas RHEL/CentOS se utiliza `authselect` para aplicar esta configuración.

### 4. **Configuración de SSSD**

Se genera un archivo `/etc/sssd/sssd.conf` con una configuración que:

 * Define el dominio y el proveedor de identidades (`id_provider = ad`).
 * Activa la caché de credenciales.
 * Establece un filtro LDAP para permitir el acceso **solo a los miembros de un 
   grupo específico dentro de una OU**:

    ```wp-block-preformatted
    ldap_access_filter = (memberOf=CN=PermitidosSSH,OU=PermitidosSSH,DC=midominio,DC=local)
    ```

Esto asegura que solo usuarios pertenecientes al grupo "PermitidosSSH" dentro de
la OU "PermitidosSSH" podrán iniciar sesión por SSH.

### 5. **Configuración del Servidor SSH**

El script valida que `UsePAM yes` esté presente en `sshd_config` para permitir la
autenticación mediante PAM y reinicia el servicio SSH.

## **Resultado Final**

Una vez ejecutado el script:

 * El sistema Linux está configurado para autenticarse contra un dominio de Active
   Directory.
 * Solo los usuarios que pertenezcan al grupo AD configurado pueden acceder por 
   SSH.
 * Los directorios home se crean automáticamente al iniciar sesión.

## **Consideraciones**

 * Asegúrate de que el sistema esté **previamente unido al dominio** mediante `realm
   join`, `adcli join` o una herramienta similar.
 * El script no configura la unión al dominio, sino el acceso restringido posterior.
 * Puedes añadir validaciones extra para verificar si el servicio SSSD está activo
   o si la unión al dominio fue exitosa.
 * Es recomendable realizar pruebas en un entorno controlado antes de aplicar en
   producción.

## **Conclusión**

Este enfoque proporciona un mecanismo sólido y centralizado para el control de acceso
SSH basado en Active Directory, ideal para entornos donde se desea mantener la gestión
de usuarios y permisos desde el directorio corporativo, sin necesidad de usuarios
locales.
