GuíasGuides · Nivel 3Level 3

Linux integrado con Active Directory: unir un servidor al dominio con SSSDLinux joined to Active Directory: joining a server to the domain with SSSD

realm join, SSSD con los grupos de AD, sudo para el grupo de administradores de Linux, SSH solo para quien está autorizado, y los tres comandos de diagnóstico cuando el login de dominio deja de funcionar.realm join, SSSD with AD groups, sudo for the Linux admins group, SSH only for those authorised, and the three diagnostic commands when domain login stops working.

Qué vas a conseguir

Que los administradores entren en los servidores Linux con su cuenta de Active Directory (la misma contraseña, la misma baja cuando se van) y que sudo dependa de un grupo de AD en lugar de una lista local en cada máquina. Las cuentas locales quedan solo para emergencias.

Antes de empezar

  • Un servidor RHEL o Ubuntu con DNS apuntando a los controladores de dominio y la hora sincronizada (Kerberos no perdona más de cinco minutos de desfase).
  • Una cuenta de AD con permiso para unir equipos a la OU donde van los servidores Linux (OU=Linux,OU=Servers,DC=contoso,DC=local), no un Domain Admin.
  • Dos grupos de AD creados: sg-linux-admins (sudo) y sg-linux-ssh (acceso por SSH).
  • Una sesión SSH abierta con la cuenta local durante todo el proceso.

1. Requisitos y descubrimiento

bash · srv-app-01 (RHEL)
sudo dnf install -y realmd sssd oddjob oddjob-mkhomedir adcli samba-common-tools krb5-workstationtimedatectl | grep -E 'synchronized|Time zone'                Time zone: Europe/Madrid (CEST, +0200)System clock synchronized: yesdig +short _ldap._tcp.contoso.local SRV | head -20 100 389 dc01.contoso.local.0 100 389 dc02.contoso.local.realm discover contoso.localcontoso.local  type: kerberos  realm-name: CONTOSO.LOCAL  domain-name: contoso.local  configured: no  server-software: active-directory  client-software: sssd  required-package: oddjob  required-package: oddjob-mkhomedir  required-package: sssd  required-package: adcli  required-package: samba-common-tools

En Ubuntu los paquetes son realmd sssd-ad sssd-tools adcli libnss-sss libpam-sss packagekit. Si realm discover no devuelve nada, el problema es DNS: para en ese punto.

2. Unir al dominio

bash · srv-app-01
sudo realm join --user=svc-linux-join --computer-ou="OU=Linux,OU=Servers,DC=contoso,DC=local" --os-name="RHEL" --os-version="9.4" contoso.localPassword for svc-linux-join:realm listcontoso.local  configured: kerberos-member  login-formats: %U@contoso.local  login-policy: allow-realm-loginsid laura.prado@contoso.localuid=1483201105(laura.prado@contoso.local) gid=1483200513(domain users@contoso.local) groups=1483200513(domain users@contoso.local),1483201204(sg-linux-admins@contoso.local)

El id que resuelve un usuario de AD con sus grupos es la prueba de que SSSD habla con el dominio. En AD aparece el objeto de equipo SRV-APP-01 en la OU indicada; apunta en el ticket el nombre y la OU.

3. Afinar SSSD: nombres cortos y acceso por grupo

/etc/sssd/sssd.conf
[sssd]domains = contoso.localconfig_file_version = 2services = nss, pam [domain/contoso.local]default_shell = /bin/bashkrb5_store_password_if_offline = Truecache_credentials = Truekrb5_realm = CONTOSO.LOCALrealmd_tags = manages-system joined-with-adcliid_provider = adfallback_homedir = /home/%uad_domain = contoso.localuse_fully_qualified_names = Falseldap_id_mapping = Trueaccess_provider = adad_gpo_access_control = disabled
bash · srv-app-01
sudo chmod 600 /etc/sssd/sssd.conf && sudo systemctl restart sssdsudo realm permit -g sg-linux-ssh@contoso.localsudo realm permit -g sg-linux-admins@contoso.localrealm list | grep permitted  permitted-groups: sg-linux-ssh@contoso.local, sg-linux-admins@contoso.localid laura.pradouid=1483201105(laura.prado) gid=1483200513(domain users) groups=1483200513(domain users),1483201204(sg-linux-admins)

use_fully_qualified_names = False permite ssh laura.prado@srv-app-01 en lugar del @contoso.local detrás. realm permit -g cambia login-policy a allow-permitted-logins: solo los grupos listados entran, los demás usuarios del dominio reciben "Permission denied" aunque la contraseña sea correcta. ad_gpo_access_control = disabled evita que una GPO de "Allow log on locally" pensada para Windows bloquee el acceso a Linux; cámbialo a enforcing solo si gestionas esas GPO a propósito.

4. sudo por grupo de AD

bash · srv-app-01
echo '%sg-linux-admins ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/10-ad-linux-adminssudo chmod 440 /etc/sudoers.d/10-ad-linux-admins && sudo visudo -c/etc/sudoers: parsed OK/etc/sudoers.d/10-ad-linux-admins: parsed OK# prueba desde otra sesión, con la cuenta de AD:ssh laura.prado@srv-app-01 'sudo -n true && echo SUDO_OK'SUDO_OK

Ya no hay lista de administradores en el servidor: la gestiona quien gestiona sg-linux-admins en AD, y la baja de la guía de Active Directory del Nivel 1 corta el acceso a todos los servidores a la vez. Con Ansible, todo este artículo es un rol que se aplica a la flota.

5. Cuando el login de dominio falla

bash · srv-app-01
sudo systemctl status sssd --no-pager | head -3● sssd.service - System Security Services Daemon     Active: active (running) since Wed 2026-10-22 07:01:12 CEST; 3h agosudo sssctl domain-status contoso.localOnline status: OfflineActive server: not connectedsudo journalctl -u sssd -p err -S "1 hour ago" --no-pager | tail -3oct 22 09:58:40 srv-app-01 sssd_be[1322]: Backend is offlinekinit laura.pradokinit: Cannot find KDC for realm "CONTOSO.LOCAL" while getting initial credentialsdig +short dc01.contoso.local

Los tres comandos: sssctl domain-status (¿ve al dominio?), journalctl -u sssd -p err (¿por qué no?) y kinit (¿Kerberos funciona independientemente de SSSD?). Aquí el DNS dejó de resolver los controladores: alguien cambió /etc/resolv.conf o NetworkManager pisó la configuración. Otros clásicos: desfase de hora (timedatectl, error Clock skew too great), contraseña del equipo caducada tras una restauración desde snapshot (sudo adcli update o volver a hacer realm leave y realm join), y la caché de SSSD con un grupo antiguo (sudo sss_cache -E).

6. Lo que revisas cada mes

  • Servidores Linux en la OU de AD cuyo lastLogon del objeto de equipo tiene más de 30 días: ya no existen o SSSD no está arrancando.
  • Miembros de sg-linux-admins: la revisión trimestral de accesos del repo 27 cubre este grupo igual que los de administrador de M365.
  • Cuentas locales con contraseña en los servidores (sudo awk -F: '$2 !~ /^[!*]/ {print $1}' /etc/shadow): solo la de emergencia.
  • Que realm list sigue en allow-permitted-logins después de cada reinstalación o restauración.

Siguientes pasos

  • Claves SSH desde AD: con ldap_user_ssh_public_key = altSecurityIdentities en SSSD y AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys en sshd_config, la clave pública vive en el objeto de usuario.
  • Kerberos para servicios: un servidor web o PostgreSQL (guía de bases de datos) autenticando con el ticket del usuario, sin contraseña, con el keytab que realm join ya ha creado en /etc/krb5.keytab.
  • Para flotas grandes, FreeIPA/IdM con confianza hacia AD da sudo, HBAC y claves centralizadas con una consola; hasta entonces, SSSD directo es suficiente.

¿Falta algo o en tu entorno es distinto? Escríbeme y lo corrijo.

What you'll get

Administrators log in to Linux servers with their Active Directory account (same password, same offboarding when they leave) and sudo depends on an AD group instead of a local list on each machine. Local accounts remain for emergencies only.

Before you start

  • A RHEL or Ubuntu server with DNS pointing at the domain controllers and the clock synchronised (Kerberos does not forgive more than five minutes of skew).
  • An AD account allowed to join computers to the OU where Linux servers go (OU=Linux,OU=Servers,DC=contoso,DC=local), not a Domain Admin.
  • Two AD groups created: sg-linux-admins (sudo) and sg-linux-ssh (SSH access).
  • An SSH session open with the local account for the whole process.

1. Prerequisites and discovery

bash · srv-app-01 (RHEL)
sudo dnf install -y realmd sssd oddjob oddjob-mkhomedir adcli samba-common-tools krb5-workstationtimedatectl | grep -E 'synchronized|Time zone'                Time zone: Europe/Madrid (CEST, +0200)System clock synchronized: yesdig +short _ldap._tcp.contoso.local SRV | head -20 100 389 dc01.contoso.local.0 100 389 dc02.contoso.local.realm discover contoso.localcontoso.local  type: kerberos  realm-name: CONTOSO.LOCAL  domain-name: contoso.local  configured: no  server-software: active-directory  client-software: sssd  required-package: oddjob  required-package: oddjob-mkhomedir  required-package: sssd  required-package: adcli  required-package: samba-common-tools

On Ubuntu the packages are realmd sssd-ad sssd-tools adcli libnss-sss libpam-sss packagekit. If realm discover returns nothing, the problem is DNS: stop right there.

2. Join the domain

bash · srv-app-01
sudo realm join --user=svc-linux-join --computer-ou="OU=Linux,OU=Servers,DC=contoso,DC=local" --os-name="RHEL" --os-version="9.4" contoso.localPassword for svc-linux-join:realm listcontoso.local  configured: kerberos-member  login-formats: %U@contoso.local  login-policy: allow-realm-loginsid laura.prado@contoso.localuid=1483201105(laura.prado@contoso.local) gid=1483200513(domain users@contoso.local) groups=1483200513(domain users@contoso.local),1483201204(sg-linux-admins@contoso.local)

The id that resolves an AD user with their groups is the proof that SSSD talks to the domain. In AD the computer object SRV-APP-01 appears in the given OU; note the name and OU in the ticket.

3. Tune SSSD: short names and group-based access

/etc/sssd/sssd.conf
[sssd]domains = contoso.localconfig_file_version = 2services = nss, pam [domain/contoso.local]default_shell = /bin/bashkrb5_store_password_if_offline = Truecache_credentials = Truekrb5_realm = CONTOSO.LOCALrealmd_tags = manages-system joined-with-adcliid_provider = adfallback_homedir = /home/%uad_domain = contoso.localuse_fully_qualified_names = Falseldap_id_mapping = Trueaccess_provider = adad_gpo_access_control = disabled
bash · srv-app-01
sudo chmod 600 /etc/sssd/sssd.conf && sudo systemctl restart sssdsudo realm permit -g sg-linux-ssh@contoso.localsudo realm permit -g sg-linux-admins@contoso.localrealm list | grep permitted  permitted-groups: sg-linux-ssh@contoso.local, sg-linux-admins@contoso.localid laura.pradouid=1483201105(laura.prado) gid=1483200513(domain users) groups=1483200513(domain users),1483201204(sg-linux-admins)

use_fully_qualified_names = False allows ssh laura.prado@srv-app-01 instead of the trailing @contoso.local. realm permit -g switches login-policy to allow-permitted-logins: only the listed groups get in, every other domain user gets "Permission denied" even with the right password. ad_gpo_access_control = disabled stops an "Allow log on locally" GPO meant for Windows from blocking access to Linux; change it to enforcing only if you manage those GPOs on purpose.

4. sudo by AD group

bash · srv-app-01
echo '%sg-linux-admins ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/10-ad-linux-adminssudo chmod 440 /etc/sudoers.d/10-ad-linux-admins && sudo visudo -c/etc/sudoers: parsed OK/etc/sudoers.d/10-ad-linux-admins: parsed OK# test from another session, with the AD account:ssh laura.prado@srv-app-01 'sudo -n true && echo SUDO_OK'SUDO_OK

There is no longer an admin list on the server: whoever manages sg-linux-admins in AD manages it, and the leaver process from the Level 1 Active Directory guide cuts access to every server at once. With Ansible, this whole article is a role applied to the fleet.

5. When domain login fails

bash · srv-app-01
sudo systemctl status sssd --no-pager | head -3● sssd.service - System Security Services Daemon     Active: active (running) since Wed 2026-10-22 07:01:12 CEST; 3h agosudo sssctl domain-status contoso.localOnline status: OfflineActive server: not connectedsudo journalctl -u sssd -p err -S "1 hour ago" --no-pager | tail -3Oct 22 09:58:40 srv-app-01 sssd_be[1322]: Backend is offlinekinit laura.pradokinit: Cannot find KDC for realm "CONTOSO.LOCAL" while getting initial credentialsdig +short dc01.contoso.local

The three commands: sssctl domain-status (can it see the domain?), journalctl -u sssd -p err (why not?) and kinit (does Kerberos work independently of SSSD?). Here DNS stopped resolving the domain controllers: someone changed /etc/resolv.conf or NetworkManager overwrote the configuration. Other classics: clock skew (timedatectl, error Clock skew too great), an expired computer password after restoring from a snapshot (sudo adcli update, or realm leave and realm join again), and the SSSD cache holding an old group (sudo sss_cache -E).

6. What you review each month

  • Linux servers in the AD OU whose computer object lastLogon is older than 30 days: they no longer exist or SSSD is not starting.
  • Members of sg-linux-admins: the quarterly access review from repo 27 covers this group just like the M365 admin ones.
  • Local accounts with a password on the servers (sudo awk -F: '$2 !~ /^[!*]/ {print $1}' /etc/shadow): only the emergency one.
  • That realm list still shows allow-permitted-logins after every reinstall or restore.

Next steps

  • SSH keys from AD: with ldap_user_ssh_public_key = altSecurityIdentities in SSSD and AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys in sshd_config, the public key lives in the user object.
  • Kerberos for services: a web server or PostgreSQL (databases guide) authenticating with the user's ticket, no password, using the keytab realm join already created at /etc/krb5.keytab.
  • For large fleets, FreeIPA/IdM with a trust to AD gives sudo, HBAC and centralised keys with a console; until then, direct SSSD is enough.

Is something missing, or different in your environment? Get in touch and I'll fix it.

Tech Career Lab · newsletter

¿Te ha servido? Cada dos semanas envío una idea práctica para perfiles IT: LinkedIn, proyectos, networking y procesos de selección.Found this useful? Every two weeks I send one practical idea for IT professionals: LinkedIn, projects, networking and hiring processes.

Apúntate y llévate las 33 ideasSign up and get the 33 ideas →