Get-Acl: audita permisos de carpetas en Windows con PowerShell

Get-Acl: audita permisos de carpetas en Windows con PowerShell

En una auditoría interna, un administrador encontró una carpeta de proyectos confidenciales con el permiso Everyone — FullControl. Nadie sabía decir cuándo se había configurado así, y el registro de acceso mostraba que 40 cuentas habían leído archivos que no deberían. El Get-Acl habría revelado el problema en segundos.

¿Qué es una ACL en Windows?

¿Qué significa ACL en seguridad de sistemas?

ACL (Access Control List, lista de control de acceso) es la lista de permisos asociada a un archivo o carpeta en Windows — define quién puede leer, escribir, modificar o tener control total sobre ese recurso. Cada entrada de la lista se llama ACE (Access Control Entry) y contiene el usuario o grupo, el tipo de permiso y si es heredada de la carpeta padre o configurada directamente.

El sistema de archivos NTFS, estándar en Windows desde el NT 3.1, es quien implementa esta estructura. Cuando haces clic derecho en una carpeta → Propiedades → Seguridad, estás viendo la ACL de esa carpeta en la interfaz gráfica. PowerShell permite inspeccionar, comparar y exportar esos datos de forma programática — algo imposible de hacer a escala desde la GUI.

Get-Acl básico: ver el propietario y los permisos de una carpeta

El cmdlet forma parte del módulo Microsoft.PowerShell.Security, disponible por defecto en toda instalación de PowerShell 5.1 y PowerShell 7+. No hace falta instalar nada.

Get-Acl -Path "C:\CarpetaCompartida"

El resultado presenta tres campos principales:

  • Path — la ruta auditada
  • Owner — el propietario actual de la carpeta
  • Access — resumen de las entradas de control

Para ver el propietario de forma aislada:

(Get-Acl -Path "C:\CarpetaCompartida").Owner

El resultado será algo como DESKTOP-ABC123\Administrador o EMPRESA\maria.silva. Si el propietario es una cuenta deshabilitada o un grupo demasiado genérico, eso ya es una señal de alerta.

Listar las reglas de acceso con detalle

La propiedad .Access devuelve un array de objetos FileSystemAccessRule. Cada objeto describe una entrada individual de la ACL:

(Get-Acl -Path "C:\CarpetaCompartida").Access | Format-Table -AutoSize

Las columnas más importantes:

  • IdentityReference — cuenta o grupo (ej: BUILTIN\Administradores, NT AUTHORITY\SYSTEM, EMPRESA\Contabilidad)
  • FileSystemRights — permisos aplicados (ej: FullControl, ReadAndExecute, Modify)
  • AccessControlTypeAllow o Deny
  • IsInheritedTrue si el permiso viene de la carpeta padre, False si se definió directamente en esa carpeta

Las entradas con IsInherited: False merecen atención especial — se configuraron explícitamente ahí, y pueden haberse añadido sin pasar por una revisión formal.

Filtrar por usuario o grupo específico

En entornos con muchas entradas, filtrar es esencial. Para verificar si un grupo indeseado aparece en la ACL:

(Get-Acl -Path "C:\CarpetaCompartida").Access |
    Where-Object { $_.IdentityReference -like "*Everyone*" }

Para encontrar todas las entradas con FullControl:

(Get-Acl -Path "C:\CarpetaCompartida").Access |
    Where-Object { $_.FileSystemRights -match "FullControl" } |
    Select-Object IdentityReference, AccessControlType, IsInherited

Para verificar si aparece una cuenta de servicio específica:

(Get-Acl -Path "C:\AppDatos").Access |
    Where-Object { $_.IdentityReference -like "*svc_backup*" }

Verificación recursiva — revisar también las subcarpetas

Una carpeta raíz con permisos correctos no garantiza que las subcarpetas estén seguras — sobre todo si alguien deshabilitó la herencia en alguna de ellas. Para recorrer toda la estructura:

Get-ChildItem -Path "C:\Proyectos" -Recurse -Directory |
    ForEach-Object {
        $acl = Get-Acl -Path $_.FullName
        [PSCustomObject]@{
            Carpeta = $_.FullName
            Dueno   = $acl.Owner
            Reglas  = ($acl.Access | Measure-Object).Count
        }
    } | Format-Table -AutoSize

Este script recorre todas las subcarpetas y muestra el propietario y el número de entradas de control de cada una. Las carpetas con muchas más reglas de lo normal en el entorno generalmente fueron modificadas manualmente en algún momento.

Exportar la ACL a CSV — informe de auditoría

Para documentar el estado de los permisos antes de un cambio o para presentarlo en un informe de auditoría, Export-Csv cierra el ciclo:

Get-Acl -Path "C:\CarpetaCompartida" |
    Select-Object -ExpandProperty Access |
    Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited |
    Export-Csv -Path "auditoria-acl.csv" -NoTypeInformation -Encoding UTF8

Para recorrer varias carpetas a la vez y consolidar todo en un único archivo:

$carpetas = "C:\Finanzas", "C:\RRHH", "C:\TI", "C:\Proyectos"

$resultado = foreach ($carpeta in $carpetas) {
    (Get-Acl -Path $carpeta).Access | ForEach-Object {
        [PSCustomObject]@{
            Carpeta   = $carpeta
            Cuenta    = $_.IdentityReference
            Permiso   = $_.FileSystemRights
            Tipo      = $_.AccessControlType
            Heredado  = $_.IsInherited
        }
    }
}

$resultado | Export-Csv -Path "auditoria-acl-completa.csv" -NoTypeInformation -Encoding UTF8

El CSV resultante se puede abrir en Excel y filtrar por columna — útil para entregarlo a un auditor o gerente sin que tengan que ejecutar PowerShell.

Señales de alerta en los permisos NTFS

  • Everyone con FullControl o Modify en cualquier carpeta que no sea temporal o pública — elimínalo de inmediato e investiga cuándo se añadió.
  • BUILTIN\Users con permiso de escritura en carpetas de sistema o de aplicación — los usuarios comunes no deberían poder escribir archivos ahí.
  • Cuenta de un ex-empleado todavía presente en la ACL con cualquier permiso — el proceso de offboarding falló en algún punto.
  • Herencia deshabilitada (IsInherited: False) en una carpeta sensible sin justificación documentada — necesita investigación antes de sacar conclusiones.

Para ir más allá y correlacionar permisos con eventos reales de acceso, el post sobre auditoría de logs de seguridad con PowerShell muestra cómo cruzar datos de eventos de Windows con datos de permisos para armar una visión consolidada.

Conclusión

El Get-Acl es uno de los cmdlets más subestimados de PowerShell — simple de invocar, pero capaz de revelar problemas de permisos que pasan invisibles por la interfaz gráfica y que, en incidentes reales, fueron la puerta de entrada. En entornos Windows, un escaneo periódico de las ACL de carpetas sensibles (Finanzas, RRHH, backups) debería ser parte de la rutina de seguridad, no una tarea aislada.

Para complementar la auditoría de permisos, vale la pena combinarlo con Get-LocalUser para revisar cuentas locales activas y con Get-Service para identificar servicios corriendo con privilegio elevado — los tres juntos cubren la mayor parte de los vectores de escalada de privilegios en Windows. Y para un contexto más amplio de hardening del sistema, el post sobre las 10 configuraciones de seguridad de Windows 11 complementa bien.

Comentarios