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.
#!/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.
. /etc/os-release
DISTRO=$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.
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:
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.
Compartir: