Cómo utilizar el comando Icacls para gestionar los permisos de archivo

Icacls es una utilidad de línea de comandos de Windows que los administradores de IT pueden utilizar para cambiar listas de control de acceso en archivos y carpetas. Una de las tareas más comunes que realiza un profesional de IT o un administrador de sistemas es modificar permisos en un servidor de archivos. Utilizar el comando icacls es una forma muy eficiente de hacerlo, y explicaremos cómo usar este comando en esta guía.

Cómo usar el comando icacls

Según mi propia experiencia personal, modificar permisos de archivos en Windows generalmente se hace usando el Explorador de archivos. Para muchos profesionales de IT, es muy intuitivo abrir el Explorador de archivos, navegar hasta la ubicación de red que está causando problemas de acceso para algunos usuarios, y cambiar sus permisos de ‘Leer’ a ‘Leer/Modificar’ o algo similar. Bonito y rápido, bastante fácil de usar.

Publicidad

Sin embargo, hay innumerables escenarios que abarcan diferentes niveles de alcance donde la interfaz gráfica simplemente no es tan robusta como nos gustaría. ¡Si vamos a cambiar permisos en 22 millones de archivos y carpetas, queremos hacerlo bien!

¿Qué es una lista de control de acceso (ACL)?

En los sistemas Windows y NTFS, cada objeto de archivo (archivo, carpeta) tiene una lista de control de acceso. Esta lista está compuesta por entradas de control de acceso (ACE). La lista contiene todos los usuarios y/o otros objetos contenedores de seguridad (grupos, etc.) que tienen algún nivel de permiso sobre dicho objeto de archivo.

¿Qué es una entrada de control de acceso? Un momento…

¿Qué es una entrada de control de acceso (ACE)?

Una entrada de control de acceso (ACE) es un registro individual o regla de permiso que controla los niveles de permiso individuales de un usuario/grupo en un objeto de archivo. Permítanme enumerar los permisos básicos de alto nivel disponibles para una ACL:

Publicidad

  • Acceso completo (F)
  • Acceso de modificación (M) (incluye ‘eliminar’)
  • Acceso de lectura y ejecución (RX)
  • Acceso de solo lectura (R)
  • Acceso de solo escritura (W)

Existen alrededor de una docena o más de permisos ‘avanzados’, pero están fuera del alcance de este artículo.

Limitaciones del Explorador de archivos

Ahora, si fuera el gerente de programa en Microsoft para el Explorador de Archivos (NO es un trabajo que particularmente envidie), estas son las funciones que agregaría. Y créanme, ¡he querido que las agreguen durante décadas!

Imaginemos que estás manejando una migración de servidor de archivos de Servidor A a Servidor B. Ya has copiado los datos al destino (Servidor B). Has descubierto que no todos los permisos se ven correctamente de forma recursiva.

Así que, vas a la raíz de tu árbol, entras en la pestaña de Seguridad y haces algunos cambios en la lista de control de acceso. Marcas la casilla para modificar de forma recursiva los 22 millones de archivos y carpetas debajo de la raíz. Comienza a hacer cambios y luego muestra algunas ventanas emergentes de confirmación sobre hacer cambios en archivos del sistema, archivos de solo lectura, etc.

Publicidad

Ahora, aquí está mi solicitud: En el mini ‘asistente’ que podrían crear, quiero especificar que simplemente asuma y haga clic en ‘Sí’ en todas las solicitudes de confirmación. Luego, el proceso continuaría ante cualquier error y luego me ofrecería un resumen cuando haya terminado, con un enlace para descargar la salida en bruto del archivo para que pueda volver y verificar cualquier error o advertencia que haya aparecido.

No sé si Microsoft alguna vez ofrecerá un conjunto de funciones tan maravillosas, robustas y de configurar-y-olvidar como este. Por lo tanto, mientras tanto, recurrimos al poder de la línea de comandos y el scripting. Ahí es donde entra en juego el comando icacls incorporado.

Entendiendo la sintaxis de icacls

La sintaxis de icacls es bastante sencilla y relativamente fácil de aprender. Básicamente, usas el comando, luego añades el archivo o carpeta que deseas verificar o manipular, y después los permisos que deseas añadir/cambiar/eliminar.

También hay interruptores de línea de comandos, por supuesto. Cubriremos todo esto pronto. Aquí tienes un ejemplo de lo que sucede cuando ejecutas el siguiente comando y luego un nombre de archivo.

icacls Excellent.txt
Using icacls to view current permissions

Se mostrará una ACE en cada línea, por lo que usando el ejemplo anterior:

  • La cuenta integrada ‘SYSTEM’ tiene permisos de acceso Heredados (I) y Completos (F)
  • El grupo de Administradores integrado tiene los mismos permisos
  • El grupo de Usuarios integrado tiene permisos Heredados (I), Lectura (R) y Ejecución (X).

¿Se puede usar icacls en PowerShell?

Bueno, como puedes ver en mi ejemplo anterior y captura de pantalla, definitivamente puedes usar PowerShell para utilizar el comando icacls. Solo necesitas tener en cuenta algunas variables de entorno que necesitan referenciarse de forma un poco diferente.

Los cmdlets equivalentes de PowerShell para ver y gestionar ACLs en objetos de archivo son Get-Acl y Set-Acl. ¡Suena como una idea para una futura publicación! ?

Usando icacls para configurar permisos para un archivo o carpeta

Debido a que el comando icacls está integrado en Windows, eres libre de comenzar a utilizar el comando tan pronto como entiendas los conceptos básicos aquí. También puedes simplemente escribir ‘icacls’ por sí solo en la línea de comandos para ver la información de ayuda disponible. También puedes consultar documentación similar de Microsoft para el comando icacls en esta página.

Cómo mostrar el ACL actual de un objeto

De acuerdo, creo que eso es suficiente exposición… vamos a empezar a utilizar el comando. Para mostrar el ACL actual de un archivo o directorio, simplemente utiliza los siguientes comandos:

icacls file or directory
icacls Download
Using icacls to view permissions on a folder

Aquí, ‘Descargas’ es una carpeta con archivos y subcarpetas. Como notarás, la salida es un poco diferente para los objetos de directorio. Verás (OI) y (CI) porque son permisos especiales de nivel de herencia de contenedor que solo se aplican a los directorios.

Para el grupo de Administradores integrado, ves que tiene permisos completos y permisos heredados. El ‘(OI)’ muestra que los otros objetos en este directorio heredarán este ACE. El ‘(CI)’ muestra que otras carpetas en este directorio volverán a heredar este ACE. (Este directorio no sucede tener ninguno, pero si lo tuviera, heredaría automáticamente los mismos ACEs).

Concediendo permisos a un archivo o carpeta

Ahora, las cosas están empezando a calentarse. Vamos a establecer permisos y añadir algunos para otros usuarios en nuestro dominio de Active Directory con el interruptor /grant. Con el siguiente comando, daremos a Billy Reinders (breinders) permisos de solo lectura (R) para el archivo Excellent.txt.

icacls Excellent.txt /grant reinders\breinders:R /t /c
Granting permissions to a file for a user

El comando anterior se completó con éxito; luego validé mis cambios revisando los permisos; ahora vemos que ‘REINDERS\breinders’ tiene permisos de solo lectura (R). Y, como no vemos ninguna ‘I’ listada, sabemos que no es heredado, es explícito.

Solo para recordar, el interruptor ‘/t’ se usa para establecer permisos de forma recursiva en todo el árbol de carpetas. El interruptor ‘/c’ le indica al comando que continue en caso de encontrar algún error.

Eliminando permisos de un archivo o carpeta

En lugar de usar el interruptor /grant para dar/añadir permisos, usamos el interrupto /remove para eliminar permisos de un ACE. Procedamos a eliminar el acceso de Billy al archivo Excellent.txt.

icacls Excellent.txt /remove:g reinders\breinders /t /c
Using the /remove switch to remove permissions to a file for a user

Aquí, estamos usando el interruptor ‘/remove:g’ para eliminar el permiso que se otorgó previamente a Billy Reinders. Ejecuté el comando de nuevo para verificar y verás que el ACL para Billy ha desaparecido. ¡Excelente! ?

Negando permisos a un archivo o carpeta

Generalmente, querrás evitar el uso de permisos de denegación explícitos debido a la complejidad que introduce en la infraestructura de permisos en general. Para la mayoría de situaciones, puedes confiar en una denegación implícita, la predeterminada, para manejar estas circunstancias.

Si un usuario no está en una ACL y el usuario no es miembro de ningún grupo listado en la ACL, se asume (correctamente) por Windows que ese usuario NO tiene permisos en ese objeto. Sin embargo, el siguiente ejemplo ilustra lo descontrolado que esto puede volverse – si un usuario es miembro de dos grupos, y a un grupo se le da acceso mientras que al otro se le deniega, ese usuario será denegado. Eso, por sí mismo tiene sentido, pero puede volverse muy enredado al intentar solucionar ese tipo de situaciones.

Sin embargo, si deseas añadir un permiso de denegación explícito, puedes usar el interruptor ‘/deny’ general para lograrlo.

icacls Download /deny reinders\breinders:(OI)(CI)F /t /c
Using the /deny switch to put explicit deny permissions on a file or folder structure

Allí puedes ver el comando que ejecuté; se completó exitosamente. Luego revisé la pestaña de Seguridad para la carpeta de Descargas – puedes ver que Billy tiene permisos de Denegación sobre el objeto y todos sus contenidos.

Cómo restablecer la ACL para un objeto

I can’t tell you how many file server migrations or movements of large amounts of file projects I’ve been involved in where I just needed to start from scratch. This invaluable step includes resetting the ACLs on an object in case things get too far gone, or you succumb to a bad idea after being up all night. Maybe a malware attack crippled an entire HR directory that NEEDS to get resolved ASAP. Thankfully, you can use the ‘/reset’ flag to reset the permissions to the default.

icacls Download /reset /t /c

[imagen]

Justo después de que volví a concederle a Billy derechos de ‘RW’ a la carpeta de Descargas y sus contenidos, ejecuté el comando de restablecimiento. Como puedes ver, su nombre vuelve a estar ausente de la ACL en la pestaña de Seguridad. Fácil y sencillo.

Cómo guardar y restaurar ACLs

A wonderfully powerful feature included with icacls is the ability to backup and restore the ACL of an object to a file for safekeeping. Before you start a large script that changes or resets permissions on millions of files, you can first save the current state of those millions of files’ ACLs to a single file.

Si te das cuenta a mitad de tu script que cometiste un error de sintaxis, puedes abortarlo y luego restaurar el estado de los ACLs de todo el árbol con una ejecución del comando utilizando el parámetro ‘/restore’. ¡Vamos a intentarlo!

icacls Download /save Download_ACL_Backup /t
What the backed-up text file looks like with all the ACLs – wowzers!

Esto guardará todo el árbol de ACLs de la carpeta Descargas en un solo archivo llamado ‘Download_ACL_Backup’. Ahora, te recomiendo encarecidamente que NO manipules ese archivo de texto. Sí, parece algo loco como Linux o algo así. ¡Solo bromeo!

Aquí está el estado actual de la carpeta Descargas.

The ‘Download’ folder before Junior performs his ill-advised permissions changes…

Ahora, supongamos que un administrador junior le otorga a Billy Reinders acceso completo a la ubicación. También supongamos que contiene datos de recursos humanos a los que Billy NO debe tener acceso.

icacls Download /grant reinders\breinders:F /t /c
Our Junior Admin has granted Billy Reinders Full access to the location

Después del comando, vuelvo a verificar y veo que Billy tiene control total y explícito en esta carpeta. De un solo golpe, puedo asumir que los permisos volverán a los valores predeterminados con una ejecución de este comando.

icacls Download /reset /t /c
After running the /reset switch, we see Billy no longer has explicit access!

Después de ejecutar el comando de reinicio, puedes ver que su nombre vuelve a ser eliminado de los ACL. Ya no tiene acceso completo a la carpeta. Recordatorio: esto escaneará toda la jerarquía de carpetas.

Consejo: A lo largo de este escenario, es posible que te hayas dado cuenta de que Billy tiene acceso de solo lectura porque el grupo de Usuarios incorporado (del cual Billy es miembro) tiene permisos de Lectura y Ejecución predeterminados. Solo una nota al margen.

Cómo gestionar los niveles de integridad de Windows con icacls

Hay una función menos conocida incorporada en Windows llamada control de acceso obligatorio (MAC). Ha estado presente durante bastante tiempo. Sin embargo, Microsoft introdujo el control de integridad obligatorio (MIC) en Windows Vista/Windows Server 2008.

Los permisos son definidos por reglas fijas basadas en políticas y generalmente no pueden ser anulados por los usuarios. Generalmente se le conoce como control de integridad de Windows (WIC). El nivel de integridad se utiliza para determinar el nivel de protección de un objeto en Windows. Básicamente, siempre se quiere asegurar de tener los permisos correctos para sus usuarios.

I won’t go into great detail here, but I can show you a few examples of how to use the icacls command with it. If we create a new folder, Test, in the Download directory, we can adjust its integrity level to ‘h’igh.

icacls Test /setintegritylevel h

En resumen, el nivel alto es sinónimo de los permisos necesarios para ejecutar una tarea o proceso como administrador (derechos de admin). Por lo tanto, incluso si Billy Reinders tenía Control Total sobre esta carpeta, a menos que de alguna manera se le hayan otorgado permisos mágicos de administrador, Y haya podido ejecutar el Explorador de archivos como administrador (lo cual no puede…), NO podrá acceder a esta carpeta y sus contenidos.

Entonces, básicamente es otra capa de seguridad y protección que se puede utilizar para proteger datos altamente sensibles.

Cómo administrar la herencia de permisos con icacls

También podemos utilizar el comando icacls para ver y modificar permisos de herencia en archivos y carpetas. Esto nos permite establecer permisos explícitos en una carpeta mientras mantenemos el resto de las carpetas configuradas para aceptar automáticamente los ACL del contenedor padre.

Desactivar la herencia en archivos y carpetas

Podemos desactivar la herencia en un archivo o carpeta utilizando el parámetro ‘/herencia:d’. En mi ejemplo, tenemos una carpeta de Instalación en la carpeta de Descargas. Aquí puedes ver que la carpeta está configurada para heredar todos sus permisos desde arriba.

icacls Download
Disabling inheritance on the Install folder leaving only explicit ACEs

Vamos a quitar la herencia de la carpeta de Instalación.

icacls Install /inheritance:d /t /c
We can see that inheritance has been disabled as the ‘Enable inheritance’ button/toggle is available

Ahí lo tienes. Notarás que todas las entradas ‘(I)’ han desaparecido. Estos son ahora todos permisos explícitos. Y puedes ver a continuación la verificación desde la GUI de que el botón ‘Habilitar herencia’ está disponible porque lo desactivamos.

Conclusión

El aspecto más intrigante de icacls para mí es la solidez de poder escribir proyectos complicados con este comando. Y, de nuevo, no tener que preocuparse por la fiabilidad del Explorador de archivos en caso de que se encuentre con un error, se bloquee, cosas así.

I hope you learned more about using the command line to modify permissions. Please leave a comment or question below. Thank you!

Artículo relacionado:

Source:
https://petri.com/icacls-command/