Qué establece la revisión de un grupo AD sin miembros con privilegios
La revisión de un grupo AD sin miembros con privilegios busca determinar si la ausencia de miembros notificada es fiable e intencionada. Un resultado informativo es un punto de partida para la verificación: identificar el grupo, establecer qué leyó realmente la recopilación y registrar la decisión del responsable. Cerrar el hallazgo debe conservar esas pruebas, en lugar de cambiar la pertenencia solo para que desaparezca el resultado.
Microsoft documenta varios grupos de operadores sin miembros predeterminados, entre ellos Account Operators, Backup Operators, Print Operators y Server Operators. Por tanto, su estado vacío puede ser el esperado. La misma referencia explica las capacidades administrativas de los grupos y las restricciones para eliminar grupos integrados. Consulte la referencia de grupos de seguridad de Active Directory para el grupo que esté revisando.
La distinción útil es entre pertenencia desconocida, presencia de miembros confirmada y ausencia intencionada de miembros confirmada dentro de un ámbito definido. Estos resultados requieren seguimientos diferentes. Un atributo ausente, un comando fallido y un grupo vacío aprobado no deben compartir la misma etiqueta de cierre.
Cómo pueden estar incompletas las pruebas de pertenencia
El atributo member del objeto de grupo es multivaluado y utiliza la sintaxis de nombres distinguidos. Su lectura ofrece una visión a nivel de atributo. La revisión también debe considerar los grupos anidados y, cuando corresponda, la pertenencia al grupo principal registrada en las cuentas.
La paginación de resultados LDAP y la recuperación de atributos por rangos resuelven problemas distintos. La paginación recupera lotes de objetos; la recuperación de atributos por rangos recupera lotes de valores de un mismo atributo multivaluado. Un recopilador puede terminar de paginar su búsqueda de grupos y aun así no reunir los valores de pertenencia de un grupo concreto. Al diagnosticar una exportación LDAP sin procesar, examine los nombres de atributos devueltos y compruebe que se hayan completado los rangos.
La referencia de esquema de primaryGroupID define este atributo de cuenta como el identificador relativo de su grupo principal. Una exportación limitada a grupos no examina ese atributo de las cuentas. Nuestro artículo sobre la pertenencia mediante primaryGroupID omitida por las exportaciones limitadas a member explica esa vía de pertenencia independiente. Utilícelo para comprender los límites de cobertura; esta revisión no exige cambiar primaryGroupID ni reproducir la técnica de abuso.
Antes de interpretar un resultado vacío, anote el DC exacto, el dominio, la base de búsqueda, la identidad de recopilación y los límites pertinentes. Conserve los errores devueltos. Si no puede establecer esos datos, marque la pertenencia como desconocida y asigne un responsable del seguimiento. No convierta un fallo operativo en un resultado vacío satisfactorio.
Detección: verificar el grupo en un DC elegido
Los siguientes ejemplos de PowerShell utilizan sintaxis documentada por Microsoft Learn. Son ejemplos de revisión de solo lectura adaptados con valores de entorno de ejemplo, no comandos ejecutados en un laboratorio AD para este artículo. Sustituya el servidor, el dominio y la identidad del grupo antes de ejecutarlos desde un sistema con el módulo ActiveDirectory disponible.
Paso 1: establecer la identidad antes de contar miembros
Utilice un DN, GUID o SID verificado, en lugar de suponer que el nombre para mostrar identifica de forma única el grupo con privilegios previsto. Get-ADGroup admite estas identidades y la recuperación explícita de propiedades:
$server = 'dc01.example.com'
$groupIdentity = 'CN=Schema Admins,CN=Users,DC=example,DC=com'
$group = Get-ADGroup -Identity $groupIdentity -Server $server -Properties member -ErrorAction Stop
$group | Select-Object DistinguishedName, SID, GroupScope, GroupCategory, member
Para este ejemplo, seleccione un DC del dominio raíz del bosque que contiene Schema Admins y sustituya el DN en consecuencia. Registre el SID devuelto y contrástelo con el inventario de grupos autorizado. Si revisa un grupo de operadores, elija su identidad y dominio reales. Conserve el registro de identidad incluso cuando la lectura de pertenencia esté vacía.
Paso 2: conservar por separado los resultados directos y recursivos
Get-ADGroupMember acepta un servidor y una identidad de grupo explícitos. Su modo recursivo expande la jerarquía hasta los miembros sin objetos secundarios. Conserve el resultado no recursivo para ver los objetos de grupo que un resultado aplanado no mantiene:
$direct = @(Get-ADGroupMember -Identity $group.DistinguishedName -Server $server -ErrorAction Stop)
$direct | Select-Object DistinguishedName, objectClass, SID
$recursive = @(Get-ADGroupMember -Identity $group.DistinguishedName -Server $server -Recursive -ErrorAction Stop)
$recursive | Select-Object DistinguishedName, objectClass, SID
Trátelos como conjuntos de pruebas distintos, no como recuentos intercambiables. Si un resultado directo contiene un grupo, revise la identidad y pertenencia de ese grupo en el DC adecuado. Un grupo anidado vacío sigue siendo miembro directo de su grupo padre. Una salida recursiva sin cuentas no debe borrar esa relación del registro de revisión.
-ErrorAction Stop muestra un error y detiene el comando; convierte los errores no terminantes en errores terminantes. Si falla un comando, detenga esa medición y conserve el error; no reutilice el contenido de una variable anterior como nuevo resultado. Un comando satisfactorio sigue siendo una prueba para el servidor elegido y el ámbito legible, no una certificación incondicional de todos los dominios o relaciones de confianza. La documentación de Microsoft de Get-ADGroupMember también excluye las instantáneas de Active Directory y los grupos con miembros en otro bosque cuando ese bosque carece de Active Directory Web Service. Registre cualquiera de estas limitaciones como una lectura sin resolver, no como un grupo vacío.
Paso 3: leer primaryGroupID cuando corresponda
Para un grupo de seguridad de dominio verificado, una comprobación del lado de las cuentas puede comparar primaryGroupID con el RID de ese grupo. Mantenga la consulta dentro del dominio representado por el SID del grupo: el RID por sí solo no es una identidad para todo el bosque. No aplique mecánicamente este ejemplo de grupo de dominio a un SID del contenedor Builtin.
El siguiente ejemplo utiliza los parámetros documentados LDAPFilter, SearchBase, Server y Properties de Get-ADObject, combinados con la definición de primaryGroupID del esquema:
$domainBase = 'DC=example,DC=com'
$rid = $group.SID.Value.Split('-')[-1]
$primaryMembers = @(Get-ADObject -LDAPFilter "(primaryGroupID=$rid)" -SearchBase $domainBase -SearchScope Subtree -Server $server -Properties primaryGroupID,objectSid -ErrorAction Stop)
$primaryMembers | Select-Object DistinguishedName, objectClass, objectSid, primaryGroupID
Esta es una consulta de revisión, no un script de remediación del grupo principal. Establezca su aplicabilidad y la población legible antes de interpretar la salida. Para los grupos de dominio anidados, considere también las pruebas pertinentes del lado de las cuentas en esos niveles; no suponga que el resultado recursivo del nivel superior responde a todas las preguntas sobre el grupo principal. Si la población o la visibilidad de los atributos está incompleta, conserve esa limitación en la conclusión.
Resolver la falta de pruebas antes del cierre (Remediation)
La remediación aquí consiste en corregir la incertidumbre de la revisión o documentar la configuración prevista. Los cambios de pertenencia requieren una justificación independiente. Utilice la siguiente secuencia después de recopilar las pruebas de identidad y pertenencia.
- Resolver las lecturas desconocidas. Investigue el error registrado, la identidad de recopilación, la visibilidad de los atributos, el ámbito de búsqueda y los límites de objetos. Cuando LDAP sin procesar devuelva atributos de pertenencia por rangos, utilice una vía de recuperación que gestione rangos y conserve sus pruebas de finalización. Repita la lectura pertinente en el DC registrado una vez resuelto el problema de recopilación.
- Contrastar los miembros confirmados. Si la revisión nativa devuelve miembros mientras el recopilador informa de una lista vacía, conserve ambas salidas con sus horas e identidades de recopilación. Investigue la diferencia antes de clasificar el hallazgo. No elimine miembros válidos para forzar la coincidencia con una exportación incompleta.
- Documentar la ausencia intencionada de miembros. Pida al responsable del grupo que confirme su finalidad operativa, el estado vacío aprobado y el proceso para cualquier uso futuro. Adjunte la identidad verificada y el ámbito de lectura a esa decisión. Para un grupo de operadores sin miembros predeterminados, documente por qué el estado actual encaja en el modelo de administración local.
- Escalar una ausencia inesperada de miembros. Si el responsable esperaba administradores activos o un grupo anidado documentado, investigue la discrepancia mediante el proceso de cambios de la organización. No vuelva a poblar automáticamente el grupo a partir de una exportación antigua ni añada una identidad de amplio alcance como solución rápida.
- Conservar el registro de cierre. Incluya al responsable, la decisión, la fecha de las pruebas, el DC, el SID del grupo, los comandos, los errores y los límites sin resolver. Defina cuándo debe revisarse la decisión, por ejemplo, ante un cambio del modelo de administración o una nueva discrepancia en las pruebas recopiladas.
La guía relacionada sobre la pertenencia excesiva peligrosa en grupos con privilegios y la ausencia intencionada de miembros de Schema Admins explica por qué llenar un grupo con privilegios no es una respuesta adecuada a esta Info. Mantenga su análisis del riesgo de acceso separado de la decisión sobre la integridad de las pruebas que se trata aquí.
Por ejemplo, una persona revisora podría recibir una lista vacía del recopilador para un grupo de operadores. Si la identidad coincide, las lecturas independientes se completan dentro del ámbito requerido y el responsable confirma que no se prevén operadores, la decisión puede conservar el estado vacío. Si la misma revisión encuentra un error de lectura sin resolver, el resultado correcto es una pertenencia desconocida con un responsable de seguimiento identificado. Son decisiones ilustrativas, no resultados de pruebas observados.
Cómo detecta EtcSec este caso
El detector GROUP_EMPTY_PRIVILEGED de EtcSec produce un hallazgo Info para los grupos con privilegios reconocidos cuya lista Member recopilada cumple len(Member) == 0. La revisión de etc-collector examinada es 20268a321609c193b79c5da6764f3f56950449cb; el detector es public/internal/audit/detectors/ad/groups/privileged/empty-privileged.go.
Reconoce diez nombres en inglés: Domain Admins, Enterprise Admins, Schema Admins, Administrators, Account Operators, Server Operators, Backup Operators, Print Operators, DnsAdmins y Group Policy Creator Owners. Compara sAMAccountName sin distinguir mayúsculas de minúsculas, recurre a DisplayName cuando sAMAccountName está vacío, o busca una subcadena de nombre cn= en cualquier parte del DN. No verifica un SID ni un límite de RDN. Puede omitir grupos renombrados o localizados; una coincidencia de nombre por sí sola no establece la identidad integrada.
El predicado no expande la pertenencia anidada ni calcula primaryGroupID. En el proveedor LDAP examinado, la recopilación de grupos utiliza de forma predeterminada (objectClass=group) dentro del BaseDN configurado y el límite de objetos. El analizador lee exactamente member, sin reunir los valores member;range=.... La ausencia del atributo exacto se convierte en una lista vacía. La paginación de objetos no corrige esa carencia de recuperación de atributos.
Estas observaciones del código establecen un riesgo de interpretación incompleta, no un falso positivo demostrado en un entorno AD real. No se ejecutaron pruebas AD para este artículo. La recomendación genérica del detector menciona eliminar grupos sin uso; no debe aplicarse a los grupos integrados. Utilice la Info para iniciar la revisión de identidad, integridad y decisión del responsable descrita anteriormente.
Explore las páginas de identidad que apoyan este tema
