Virtualización

Proxmox VE y Active Directory: cómo sincronizar usuarios y grupos sin dejar puertas abiertas

Por Equipo Cloud Privado · · 13 min de lectura
Árbol de directorio con grupos conectado por una flecha roja a un nodo de Proxmox protegido por un candado

Las claves en 30 segundos

  • Proxmox no copia las contraseñas de Active Directory. Sincroniza usuarios y grupos a /etc/pve/user.cfg, y en cada inicio de sesión pregunta al controlador de dominio. Los permisos viven en Proxmox.
  • El modo por defecto es ldap en el puerto 389, sin cifrar. Hay que elegir ldaps o ldap+starttls y activar la verificación del certificado, que también viene apagada.
  • Desactivar a un usuario en AD corta su login, pero no sus tokens de API. El token se valida contra user.cfg y AD ni se entera. Por eso la baja hay que completarla con filtro y remove-vanished, o a mano.
  • remove-vanished borra de verdad. Si un filtro mal escrito devuelve cero usuarios y tienes activada la opción entry, se van todos. Antes de cada cambio, vista previa.
  • Los grupos llegan con el nombre del realm detrás. PVE-Admins pasa a ser PVE-Admins-ad, y los permisos se asignan a ese nombre.
  • Un filtro anidado no anida los grupos. El usuario entra, pero su grupo de Proxmox solo recoge a los miembros directos.
  • Mantén siempre una salida. Si los controladores de dominio caen, root@pam sigue funcionando. Si lo has desactivado, te quedas fuera.

Con tres administradores, root@pam y un par de usuarios locales se aguanta un tiempo. Con quince personas entre sistemas, operaciones y un proveedor externo, cada alta y cada baja son una tarea más que alguien acaba olvidando. Si la empresa ya tiene Active Directory, lo razonable es que el clúster Proxmox se fíe de él.

La configuración es sencilla y está bien integrada en la interfaz. Lo que no suele contarse es cómo se comporta luego, y eso es justo lo que decide si la integración aporta seguridad o solo comodidad. Este artículo está contrastado con la documentación de Proxmox VE 9.2 y con el código de pve-access-control. No lo hemos probado contra un dominio real, así que lee la vista previa de tu sincronización antes de dar nada por hecho.

Qué hace la sincronización y qué no

En Proxmox un realm es un origen de autenticación. Vienen dos de serie (pam y pve), y se pueden añadir LDAP, Active Directory y OpenID Connect. La integración con AD hace tres trabajos distintos, y conviene no mezclarlos.

Qué consulta Proxmox en cada camino: sincronización, inicio de sesión y token de API Tres caminos con las mismas tres piezas: Active Directory, el nodo Proxmox y el fichero user.cfg. En la sincronización, el nodo lee usuarios y grupos de Active Directory por LDAPS con la cuenta de servicio y los escribe en user.cfg. En el inicio de sesión, el nodo comprueba la contraseña contra Active Directory y lee grupos y permisos en user.cfg. Con un token de API, el nodo solo consulta user.cfg y Active Directory no interviene. Sincronización, cada 30 minutos Active Directory usuarios y grupos LDAPS 636 solo lectura Nodo Proxmox trabajo de sync escribe user.cfg replicado en /etc/pve Inicio de sesión de una persona Active Directory valida la contraseña bind del usuario Nodo Proxmox interfaz o API consulta user.cfg grupos y permisos Token de API Active Directory no se consulta Nodo Proxmox valida el token consulta user.cfg activo, token
Qué consulta Proxmox en cada camino: sincronización, inicio de sesión y token de API Tres caminos con las mismas tres piezas: Active Directory, el nodo Proxmox y el fichero user.cfg. En la sincronización, el nodo lee usuarios y grupos de Active Directory por LDAPS con la cuenta de servicio y los escribe en user.cfg. En el inicio de sesión, el nodo comprueba la contraseña contra Active Directory y lee grupos y permisos en user.cfg. Con un token de API, el nodo solo consulta user.cfg y Active Directory no interviene. Sincronización Nodo Proxmox trabajo de sync LDAPS 636 escribe Active Directory usuarios y grupos user.cfg en /etc/pve Inicio de sesión Nodo Proxmox interfaz o API bind consulta Active Directory valida contraseña user.cfg grupos y permisos Token de API Nodo Proxmox valida el token consulta Active Directory no se consulta user.cfg activo, token
AD solo participa en dos de los tres caminos. Un token de API se resuelve entero dentro de Proxmox, y de ahí sale el problema de las bajas.

La sincronización usa una cuenta de servicio para leer usuarios y grupos, y los escribe en /etc/pve/user.cfg, que se replica a todo el clúster. Nada de contraseñas.

El inicio de sesión comprueba la contraseña contra el controlador de dominio con un bind a nombre del usuario (usuario@dominio). Si sale bien, Proxmox mira en su propia configuración qué puede hacer esa persona.

Los permisos son locales. AD dice quién eres y a qué grupos perteneces, pero la lista de control de acceso que dice qué puedes tocar se define en Proxmox.

Antes de tocar Proxmox: lo que hay que preparar en AD

Tres cosas, y ninguna tarda mucho.

Una cuenta de servicio solo para esto. Un usuario normal, sin grupos privilegiados y sin inicio de sesión interactivo, como svc-pvesync. Por defecto cualquier usuario autenticado puede leer casi todo el directorio, así que no necesita permisos especiales. Decide qué haces con la caducidad de su contraseña: si caduca sin que nadie lo apunte, la sincronización empezará a fallar y nadie mirará por qué hasta que falte un usuario.

Necesitarás su nombre distinguido completo, porque Proxmox pide un DN en el campo Bind User. Lo sacas en un controlador de dominio:

Get-ADUser svc-pvesync | Select-Object DistinguishedName

Grupos por función, no uno solo. Un único grupo con todo el mundo dentro te obliga a dar el mismo rol a todos. Mejor algo como PVE-Admins, PVE-Operadores y PVE-Auditores, sin espacios en el nombre: Proxmox descarta los grupos cuyo nombre no cumpla sus reglas de caracteres, y un Admins Proxmox se quedaría fuera.

Certificado en los controladores de dominio. LDAPS necesita que los controladores presenten un certificado válido, normalmente emitido por la CA interna. Si no existe, este es el momento de resolverlo, no un motivo para saltarse el cifrado.

El realm, sin dejar la contraseña al aire

En Datacenter > Permissions > Realms > Add > Active Directory Server. Estos son los campos que importan:

CampoValorPor qué
RealmadForma parte del nombre de usuario y de los grupos. Corto y definitivo
Domainempresa.localSe añade al usuario en el login: [email protected]
Server / Fallback Serverdc1.empresa.local, dc2.empresa.localUsa nombres, porque el certificado se emite para ellos
ModeLDAPS (636) o LDAP+StartTLS (389)El valor por defecto es LDAP, sin cifrar
Verify CertificateActivadoViene apagado. Sin esto, TLS cifra pero no sabes con quién hablas
Base Domain NameOpcional en ADSi lo dejas vacío, Proxmox lee defaultNamingContext. Acótalo a una OU si puedes
User Attribute NameOpcional en ADPor defecto, sAMAccountName
Case-SensitiveDesactivadoAD no distingue mayúsculas; Proxmox sí, salvo que se lo digas

Lo mismo por línea de comandos, con la comprobación de conexión incluida:

read -rs PW   # la contraseña no se queda en el historial
pveum realm add ad --type ad \
  --domain empresa.local \
  --server1 dc1.empresa.local --server2 dc2.empresa.local \
  --mode ldaps --verify 1 --capath /etc/ssl/certs \
  --base_dn 'OU=Empresa,DC=empresa,DC=local' \
  --bind_dn 'CN=svc-pvesync,OU=Servicio,OU=Empresa,DC=empresa,DC=local' \
  --password "$PW" \
  --case-sensitive 0 \
  --check-connection 1

La contraseña de la cuenta se guarda en /etc/pve/priv/realm/ad.pw, dentro de la parte privada del sistema de ficheros del clúster.

Dos detalles que suelen dar guerra. El certificado raíz de tu CA tiene que estar en todos los nodos, porque capath apunta a una ruta local: cópialo a /usr/local/share/ca-certificates/ y ejecuta update-ca-certificates en cada uno. Y si el DN lleva comas u otros caracteres reservados, va entre comillas dobles: CN="García, Ana",OU=TI,DC=empresa,DC=local.

Por qué no vale quedarse en el puerto 389

Proxmox se autentica con un bind simple, que manda el usuario y la contraseña tal cual. Sin TLS, cualquiera que escuche en esa red los lee. Además, puede dejar de funcionar: Microsoft avisa de que, al exigir la firma LDAP en los controladores de dominio, dejan de funcionar los binds simples sobre conexiones sin SSL/TLS. Si el login de Proxmox se rompe tras un endurecimiento del dominio y el error es Strong(er) authentication required, ya sabes por dónde va.

Filtrar: traer a quien debe y a nadie más

Sin filtro, la sincronización se trae todo lo que encuentre bajo la base. Y en AD eso incluye más de lo que parece, porque las cuentas de equipo también son objetos de la clase user. Un filtro de usuarios decente para un dominio con grupos anidados:

(&(memberOf:1.2.840.113556.1.4.1941:=CN=PVE-Acceso,OU=Grupos,DC=empresa,DC=local)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

Tiene dos partes. 1.2.840.113556.1.4.1941 es la regla LDAP_MATCHING_RULE_IN_CHAIN, que busca la pertenencia recorriendo grupos anidados. El memberOf normal solo ve la directa. La segunda parte descarta las cuentas desactivadas: el bit 2 de userAccountControl. Este segundo detalle es el que luego hará funcionar las bajas.

Para los grupos, algo así en Group Filter:

(|(cn=PVE-Admins)(cn=PVE-Operadores)(cn=PVE-Auditores))

Ojo con el anidamiento. Proxmox construye cada grupo leyendo su atributo member, que contiene a los miembros directos. Si Ana entra en PVE-Admins a través de un subgrupo Sistemas, el filtro la trae como usuaria, pero no aparecerá dentro de PVE-Admins-ad y no heredará sus permisos. O metes a los usuarios directamente en los grupos de Proxmox, o sincronizas también el subgrupo y le das permisos a él.

Vista previa, siempre

Antes de escribir nada en user.cfg, comprueba qué pasaría:

pveum realm sync ad --dry-run 1 --scope both

En la interfaz es el botón Preview dentro de Sync. Mira tres cosas: que no salgan cuentas de equipo, que el número de usuarios se parezca al que esperabas y que los grupos aparezcan con sus miembros. Luego lanza la sincronización real.

Los grupos llegan con el sufijo del realm, así que PVE-Admins queda como PVE-Admins-ad. Proxmox lo hace para evitar choques con grupos creados a mano.

Permisos: Administrator no es el valor por defecto

Es tentador darle Administrator en / al grupo y seguir adelante. Ese rol tiene todos los privilegios, incluidos los de cambiar la configuración del sistema y los permisos de los demás. En la práctica, cualquiera que controle ese grupo en AD controla el clúster, así que el equipo que gestiona el dominio pasa a mandar también sobre la virtualización.

GrupoRolRutaPuede
PVE-Admins-adAdministrator/Todo. Pocas personas
PVE-Operadores-adPVEAdmin/Casi todo, sin tocar sistema, realms ni permisos
PVE-Auditores-adPVEAuditor/Solo mirar
pveum acl modify / --groups PVE-Operadores-ad --roles PVEAdmin
pveum acl modify / --groups PVE-Auditores-ad --roles PVEAuditor

PVEAdmin no incluye Sys.PowerMgmt, Sys.Modify, Realm.Allocate ni Permissions.Modify, y para el día a día suele sobrar. Si necesitas aislar a un cliente o a un equipo, usa pools y da el rol en /pool/<nombre>. Lo explicamos con más detalle en cómo endurecer el acceso a Proxmox.

Comprueba el acceso cerrando sesión y entrando con el realm ad seleccionado. El usuario se escribe sin dominio: ana.

Automatizar sin borrar lo que no toca

Los trabajos de sincronización existen en la interfaz desde Proxmox VE 8.0, en Datacenter > Permissions > Realms > Realm Sync Jobs. Cada media hora es razonable para un equipo normal; también se puede crear por API:

pvesh create /cluster/jobs/realm-sync/ad-sync \
  --realm ad --schedule '*/30' --scope both \
  --remove-vanished 'acl;entry;properties'

La decisión importante es remove-vanished, que dice qué hacer con lo que ya no devuelve la sincronización. El código deja claro su efecto:

OpciónQué haceSi no la activas
entryBorra el usuario o grupo que ya no aparece, con sus tokensSigue en user.cfg, activo
aclBorra sus permisos directosLos permisos siguen ahí
propertiesReescribe la entrada con lo que manda AD; lo que no venga se pierde, salvo tokens y el estado enableSe actualiza lo que llega y lo demás se conserva

entry y acl tienen sentido juntos. properties solo si AD es la única fuente de nombres y correos: borra también lo que hayas escrito a mano, como un comentario o una fecha de caducidad.

El riesgo real de entry. Si cambias el filtro y por un error devuelve cero usuarios, sin ningún fallo de conexión, la siguiente pasada los elimina a todos junto con sus tokens y permisos directos. Un trabajo programado no pide confirmación. Por eso cualquier cambio de filtro pasa antes por --dry-run.

Qué pasa de verdad cuando alguien se va

Aquí es donde la integración se queda corta si se monta deprisa. La sincronización no copia el estado de la cuenta de AD: no hay un campo que diga «desactivado» y que llegue a Proxmox. Y verify_token, la función que valida un token de API, solo comprueba user.cfg: que el usuario esté activado, que el token exista y que no haya caducado. A AD no le pregunta nada.

Qué ocurre en ADLogin webToken de API existente
Se cambia la contraseñaVale la nuevaSigue funcionando
Se desactiva la cuenta, sin filtro ni remove-vanishedFallaSigue funcionando
Se borra la cuenta, sin remove-vanishedFallaSigue funcionando
Sale del grupo, con scope en bothDepende del filtroSigue funcionando, con los permisos propios del token y del usuario
Se desactiva, con el filtro de arriba y entryFallaDeja de funcionar en la siguiente pasada

Esta es la razón del filtro con userAccountControl. Combinado con remove-vanished=acl;entry, la cuenta desactivada desaparece de la respuesta y Proxmox la elimina con sus tokens. La ventana de exposición es el intervalo del trabajo, y si la baja es urgente puedes lanzarlo a mano con pveum realm sync ad.

También queda otro hueco, aunque más pequeño: una sesión ya abierta en la interfaz no se consulta contra AD, así que dura lo que le quede a su ticket. En una baja delicada, desactiva al usuario también en Proxmox:

pveum user modify ana@ad --enable 0

Y mejor aún, evita que las cuentas de personas tengan tokens para automatizaciones. Un script de copias no debería dejar de funcionar porque alguien cambió de empresa, ni seguir funcionando con los permisos de esa persona. Para eso, un usuario de servicio del realm pve con el mínimo de privilegios.

Doble factor y la salida de emergencia

Autenticarse contra AD no impide exigir un segundo factor. El realm admite TFA forzado (TOTP o YubiKey) en su configuración, y con eso solo entrarán los usuarios que lo tengan configurado: actívalo cuando todos lo hayan hecho, no antes. Los usuarios también pueden registrar WebAuthn por su cuenta.

Queda la pregunta de qué pasa si caen los dos controladores de dominio, o si los apagas en el mismo clúster que depende de ellos para entrar. La respuesta es root@pam. Sigue siendo local, no pasa por AD y es tu salida, así que guarda su contraseña en un sitio al que puedas llegar con el directorio caído. Si los controladores de dominio son VM del propio clúster, reparte al menos uno en otro nodo o, mejor, fuera de él.

Fallos habituales

SíntomaCausa probableQué mirar
Invalid credentials al sincronizarDN incompleto o contraseña caducadaCopia el DN de Get-ADUser y revisa la caducidad
Strong(er) authentication requiredFirma LDAP exigida y conexión sin TLSPasa a ldaps o ldap+starttls
Error de verificación de certificadoFalta la CA en ese nodo o el nombre no coincideCA en todos los nodos y servidor por FQDN
Aparecen PC y servidores como usuariosSin filtro de usuariosFiltra por grupo y repite la vista previa
El grupo llega vacíoLos usuarios no están en la sincronización o son miembros indirectosComprueba el filtro y el anidamiento
Un grupo no apareceEspacios o caracteres no admitidos en el nombreRenómbralo en AD o usa otro atributo con group_name_attr
Entra con Ana pero no con ana, o al revésRealm con mayúsculas y minúsculasDesactiva Case-Sensitive

Lista de comprobación

  1. Cuenta de servicio sin privilegios y con la caducidad de su contraseña bajo control.
  2. Grupos por función y sin espacios.
  3. Modo ldaps o ldap+starttls, con verificación activada y CA en todos los nodos.
  4. Filtro de usuarios por grupo y sin cuentas desactivadas.
  5. Vista previa antes de la primera sincronización y de cada cambio de filtro.
  6. Rol mínimo por grupo y Administrator para muy pocos.
  7. Trabajo programado con remove-vanished=acl;entry, salvo motivo para no usarlo.
  8. Procedimiento de baja que revise los tokens de la persona.
  9. TFA forzado cuando todo el equipo lo tenga configurado.
  10. root@pam accesible con AD caído, y probado.

Cómo lo hacemos en Cloud Privado

Cuando integramos un clúster gestionado con el directorio de un cliente, tratamos la baja como parte del diseño: filtro por grupo, LDAPS verificado, cuentas de servicio separadas de las personales y un acceso de emergencia que no dependa de AD. Si quieres verlo aplicado a tu entorno, en Proxmox en cloud privado contamos cómo trabajamos.

Preguntas frecuentes

¿Proxmox guarda las contraseñas de Active Directory?

No. Solo guarda la de la cuenta de servicio, en /etc/pve/priv/realm/. Las de los usuarios se comprueban en cada login contra el controlador de dominio.

¿Es mejor el tipo LDAP o el de Active Directory?

Para AD, el tipo Active Directory: incluye el dominio, usa sAMAccountName por defecto y hace el login como usuario@dominio. El tipo LDAP tiene más sentido para OpenLDAP y similares.

¿Hace falta rellenar el Base DN?

En Active Directory no es obligatorio, porque Proxmox lee defaultNamingContext del servidor. Aun así conviene acotarlo a la OU que te interese, para que las búsquedas sean más pequeñas.

¿Qué pasa si los controladores de dominio no responden?

Los usuarios de AD no pueden iniciar sesión y la sincronización falla. Las máquinas virtuales no se enteran, y root@pam y los usuarios del realm pve siguen entrando.

¿Un usuario desactivado en AD pierde el acceso?

Pierde el login, pero no sus tokens de API, que se validan solo dentro de Proxmox. Para que caigan hace falta que deje de aparecer en la sincronización con remove-vanished activado, o desactivarlo en Proxmox.

¿Se puede usar SAML o OpenID Connect en lugar de LDAP?

Proxmox VE admite OpenID Connect de forma nativa, por ejemplo con Entra ID o Keycloak: los usuarios pueden crearse en su primer acceso y los grupos pueden llegar en un claim. SAML no está entre los realms que trae de serie.

Fuentes


¿Tu clúster sigue viviendo de usuarios locales o quieres revisar cómo se dan las bajas? En Cloud Privado te ayudamos a integrarlo con tu directorio sin dejar accesos olvidados, sobre Proxmox gestionado en centros de datos en España.

¿Proxmox en producción sin llevarlo tú?

Si prefieres no cargar con la operación, dinos qué tienes y qué te falta. Te contamos qué opciones hay para llevarlo gestionado.

Respuesta en 24–48 h laborables · Sin compromiso

¿Prefieres el correo? Escríbenos a comercialcloudprivado.com