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) ysg-linux-ssh(acceso por SSH). - Una sesión SSH abierta con la cuenta local durante todo el proceso.
1. Requisitos y descubrimiento
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-toolsEn 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
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
[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 = disabledsudo 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
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_OKYa 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
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.localLos 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
lastLogondel 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 listsigue enallow-permitted-loginsdespués de cada reinstalación o restauración.
Siguientes pasos
- Claves SSH desde AD: con
ldap_user_ssh_public_key = altSecurityIdentitiesen SSSD yAuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeysensshd_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 joinya 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) andsg-linux-ssh(SSH access). - An SSH session open with the local account for the whole process.
1. Prerequisites and discovery
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-toolsOn 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
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
[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 = disabledsudo 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
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_OKThere 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
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.localThe 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
lastLogonis 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 liststill showsallow-permitted-loginsafter every reinstall or restore.
Next steps
- SSH keys from AD: with
ldap_user_ssh_public_key = altSecurityIdentitiesin SSSD andAuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeysinsshd_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 joinalready 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 →