5.4. Gestión de las ACL

La Tabla 5.1, “Tipos de entrada de ACL” resume los seis tipos posibles de entradas de ACL, cada una de las cuales define los permisos para un usuario o para un grupo de usuarios. La entrada del propietario define los permisos del usuario a quien pertenece el archivo o el directorio. La entrada del grupo propietario define los permisos del grupo propietario del archivo. El súperusuario puede cambiar el propietario o el grupo propietario mediante los comandos chown o chgrp, en cuyo caso las entradas de propietario y de grupo propietario hacen referencia al nuevo propietario y al nuevo grupo propietario. Cada entrada usuario nombrado define los permisos del usuario que se especifica en el campo del calificador de la entrada. Cada entrada grupo nombrado define los permisos del grupo que se especifican en el campo del calificador de la entrada. Únicamente las entradas del usuario nombrado y del grupo nombrado cuentan con un campo del calificador que no está vacío. La entrada otros define los permisos del resto de usuarios.

La entrada máscara aumenta los límites de los permisos asignados a las entradas usuario nombrado, grupo nombrado y grupo propietario mediante la definición de qué permisos en dichas entradas son efectivos y cuáles se encuentran en la máscara. Si existen permisos tanto en una de las entradas mencionadas como en la máscara, dichos permisos serán efectivos. Los permisos contenidos únicamente en la máscara o únicamente en la entrada real no son efectivos, en el sentido de que los permisos no se han otorgado. Todos los permisos definidos en las entradas propietario y grupo propietario son siempre efectivos. El ejemplo que aparece en la Tabla 5.2, “Enmascaramiento de permisos de acceso” demuestra este mecanismo.

Son dos las clases básicas de ACL que existen: La ACL mínima contiene únicamente las entradas para los tipos propietario, grupo propietario y otros, que corresponden a los bits de permiso convencionales para archivos y directorios. La ACL extendida incluye más elementos; debe contener una entrada máscara y puede contener al mismo tiempo distintas entradas de los tipos usuario nombrado y grupo nombrado.

Tabla 5.1. Tipos de entrada de ACL

Tipo

Forma de texto

propietario

user::rwx

usuario nombrado

user:name:rwx

grupo propietario

group::rwx

grupo nombrado

group:name:rwx

máscara

mask::rwx

otros

other::rwx

Tabla 5.2. Enmascaramiento de permisos de acceso

Tipo de entrada

Forma de texto

Permisos

usuario nombrado

user:geeko:r-x

r-x

máscara

mask::rw-

rw-

permisos efectivos:

r--

5.4.1. Entradas ACL y bits de permiso de modos de archivos

Tanto la Figura 5.1, “ACL mínima: entradas ACL comparadas con los bits de permiso” como la Figura 5.2, “ACL extendida: entradas ACL comparadas con los bits de permiso” ilustran dos casos de una ACL mínima y una ACL extendida. Las figuras se estructuran en tres bloques, el primero de los cuales muestra las especificaciones de tipo de las entradas ACL, mientras que en el bloque central aparece un ejemplo de ACL. El bloque situado en el extremo derecho, por su parte, muestra los bits de permiso respectivos de acuerdo con el concepto convencional de permiso, como muestra, por ejemplo, ls -l. En ambos casos, los permisos de la clase de propietario se asignan a la entrada ACL propietario. Los permisos otras clases se asignan a la entrada ACL respectiva. Sin embargo, la asignación de los permisos de la clase de grupo es diferente en los dos casos.

Figura 5.1. ACL mínima: entradas ACL comparadas con los bits de permiso

ACL mínima: entradas ACL comparadas con los bits de permiso

En el caso de una ACL mínima (sin máscara), los permisos de la clase de grupo se asignan al grupo propietario de la entrada ACL. Esta situación se muestra en la Figura 5.1, “ACL mínima: entradas ACL comparadas con los bits de permiso”. En el caso de una ACL extendida (con máscara), los permisos de la clase de grupo se asignan a la entrada de máscara. Esta situación se muestra en la Figura 5.2, “ACL extendida: entradas ACL comparadas con los bits de permiso”.

Figura 5.2. ACL extendida: entradas ACL comparadas con los bits de permiso

ACL extendida: entradas ACL comparadas con los bits de permiso

Esta modalidad de asignación asegura una interacción de aplicaciones sin brusquedades, con independencia de si son compatibles con ACL. Los permisos de acceso que se asignaron mediante los bits de permiso representan el límite superior para los “ajustes finos” restantes hechos con una ACL. Los cambios efectuados en los bits de permiso los refleja la ACL y viceversa.

5.4.2. Directorio con una ACL de acceso

Con getfacl y setfacl en la línea de comandos, se puede acceder a las ACL. La forma en que se utilizan estos comandos se describen en el siguiente ejemplo:

Antes de crear el directorio, utilice el comando umask para definir qué permisos de acceso deben enmascararse cada vez que se crea un objeto de archivo. El comando umask 027 establece los permisos por defecto dando al propietario la gama completa de permisos (0), denegando al grupo el acceso de escritura (2) y no concediendo a otros usuarios ningún permiso (7). En realidad, el comando umask enmascara los bits de permiso correspondientes o los desactiva. Para obtener más información, consulte la página Man de umask.

El comando mkdir mydir crea el directorio mydir con los permisos por defecto establecidos por el comando umask. Utilice el comando ls -dl mydir para comprobar si todos los permisos se han asignado correctamente. Los datos de salida para este ejemplo son:

drwxr-x--- ... tux project3 ... mydir

Compruebe el estado inicial de la ACL con getfacl mydir. La información que se ofrecerá será del tipo:

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
group::r-x 
other::---
     

Las tres primeras líneas de los datos de salida muestran el nombre, el propietario y el grupo propietario del directorio. Las tres líneas siguientes contienen estas tres entradas ACL: propietario, grupo propietario y otros. De hecho, en el caso de esta ACL mínima, el comando getfacl no ofrece ninguna información que no se pueda obtener mediante el comando ls.

Modifique la ACL para asignar permisos de lectura, escritura y ejecución a un usuario adicional geeko y a un grupo adicional mascots con:

setfacl -m user:geeko:rwx,group:mascots:rwx mydir

La opción -m origina que el comando setfacl modifique la ACL existente. El siguiente argumento indica las entradas ACL que se van a modificar (las entradas múltiples se separan con comas). La parte final especifica el nombre del directorio al que se deben aplicar estas modificaciones. Utilice el comando getfacl para visualizar la ACL resultante.

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
user:geeko:rwx 
group::r-x
group:mascots:rwx 
mask::rwx 
other::--- 

Además de las entradas iniciadas por el usuario geeko y el grupo mascots, se ha generado una entrada máscara. La entrada máscara mencionada se fija de forma automática de forma tal que todos los permisos sean efectivos. El comando setfacl adapta automáticamente las entradas máscara existentes a los ajustes modificados, salvo en el caso de que haya desactivado esta función con -n. La entrada máscara define los permisos máximos de acceso efectivos para todas las entradas que se encuentran en la clase de grupo. Se incluyen aquí usuario nombrado, grupo nombrado y grupo propietario. Los bits de permiso de clase de grupo que muestra ls -dl mydir corresponden ahora a la entrada máscara.

drwxrwx---+ ... tux project3 ... mydir
   

La primera columna de los datos de salida contiene un signo + adicional para indicar la existencia de una ACL extendida para este elemento.

De acuerdo con los datos de salida del comando ls, los permisos para la entrada máscara incluyen el acceso de escritura. Tradicionalmente, tales bits de permiso indicarían que el grupo propietario (en este caso, proyecto3) cuenta también con acceso de escritura al directorio mydir. Sin embargo, los permisos de acceso efectivo para el grupo propietario se corresponden con la porción coincidente de los permisos definidos por el grupo propietario y por la máscara, que en nuestro ejemplo es r-x (consulte la Tabla 5.2, “Enmascaramiento de permisos de acceso”). En lo concerniente a los permisos efectivos del grupo propietario en este ejemplo, no se ha producido ninguna modificación, incluso tras la inclusión de las entradas ACL.

Edite la entrada máscara con los comandos setfacl o chmod. Por ejemplo, utilice el comando chmod g-w mydir. El comando ls -dl mydir mostrará a continuación:

drwxr-x---+ ... tux project3 ... mydir

El comando getfacl mydir proporciona los siguientes datos de salida:

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
user:geeko:rwx          # effective: r-x
group::r-x 
group:mascots:rwx       # effective: r-x 
mask::r-x 
other::---

Después de ejecutar el comando chmod para eliminar el permiso de escritura de los bits de la clase de grupo, los datos de salida del comando ls son suficientes para comprobar que los bits de la máscara deben haber cambiado de la forma correspondiente: el permiso de escritura está de nuevo limitado al propietario de mydir. Los datos de salida del comando getfacl confirman la afirmación anterior. Dichos datos de salida incluyen un comentario para todas aquellas entradas en las que los bits de permiso efectivo no se corresponden con los permisos originales, debido a que se han filtrado de acuerdo con la entrada máscara. Los permisos originales se pueden restaurar en cualquier momento mediante el comando chmod g+w mydir.

5.4.3. Directorio con una ACL por defecto

Los directorios pueden tener una ACL, es decir, un tipo especial de ACL que define los permisos de acceso que heredan los objetos del directorio cuando se crean. La ACL por defecto afectará tanto a los subdirectorios como a los archivos.

5.4.3.1. Efectos de una ACL por defecto

Son dos las maneras mediante las que los permisos de una ACL por defecto de un directorio se transfieren a los archivos y subdirectorios de dicho directorio:

  • El subdirectorio hereda la ACL por defecto del directorio padre en calidad tanto de ACL por defecto como de ACL de acceso.

  • El archivo hereda la ACL por defecto como ACL de acceso.

Todas las llamadas del sistema que crean objetos de sistemas de archivos utilizan un parámetro mode que define los permisos de acceso para el objeto de sistemas de archivos creado recientemente. Si el directorio padre no dispone de una ACL por defecto, los bits de permiso que definió umask se sustraen de los permisos al pasar por parámetro mode, y el resultado se asigna al nuevo objeto. Si existe una ACL por defecto para el directorio padre, los bits de permiso asignados al nuevo objeto se corresponden con la porción coincidente de los permisos del parámetro mode y con aquellos que se definen en la ACL por defecto. El comando umask se descarta en este caso.

5.4.3.2. Aplicación de las ACL por defecto

Los tres ejemplos siguientes muestran las principales operaciones que se pueden aplicar a los directorios y las ACL por defecto:

  1. Añada una ACL por defecto al directorio existente mydir con:

    setfacl -d -m group:mascots:r-x mydir
    

    La opción -d del comando setfacl origina que el comando setfacl lleve a cabo las siguientes modificaciones (opción -m) en la ACL por defecto.

    Compruebe el resultado del siguiente comando:

    getfacl mydir
    
    # file: mydir 
    # owner: tux 
    # group: project3 
    user::rwx 
    user:geeko:rwx 
    group::r-x
    group:mascots:rwx 
    mask::rwx 
    other::--- 
    default:user::rwx
    default:group::r-x 
    default:group:mascots:r-x 
    default:mask::r-x
    default:other::---
    

    El comando getfacl ofrece como resultado tanto la ACL de acceso como la ACL por defecto. La ACL por defecto se compone de todas las líneas que comienzan por default. Aunque usted ejecutó solamente el comando setfacl con una entrada para el grupo mascots para obtener la ACL por defecto, el comando setfacl ha copiado automáticamente las entradas restantes de la ACL de acceso para crear una ACL por defecto válida. Las ACL por defecto no tienen un efecto intermedio en los permisos de acceso. Únicamente intervienen cuando se crean los objetos de sistemas de archivos. Estos nuevos objetos solamente heredan permisos de la ACL por defecto de sus directorios padre.

  2. En el siguiente ejemplo, utilice el comando mkdir para crear un subdirectorio en mydir, que heredará la ACL por defecto.

    mkdir mydir/mysubdir
    
    getfacl mydir/mysubdir 
    
    # file: mydir/mysubdir 
    # owner: tux 
    # group: project3 
    user::rwx 
    group::r-x 
    group:mascots:r-x 
    mask::r-x
    other::--- 
    default:user::rwx 
    default:group::r-x
    default:group:mascots:r-x 
    default:mask::r-x 
    default:other::---
    

    Tal y como se preveía, el subdirectorio que se acaba de crear, mysubdir, tiene los permisos de la ACL por defecto del directorio padre. La ACL de acceso de mysubdir es una copia exacta de la ACL por defecto de mydir. La ACL por defecto que este directorio transmitirá a los objetos dependientes de él será también la misma.

  3. Utilice el comando touch para crear un archivo en el directorio mydir, por ejemplo, touch mydir/myfile. El comando ls -l mydir/myfile mostrará entonces:

    -rw-r-----+ ... tux project3 ... mydir/myfile 
    

    Los datos de salida del comando getfacl mydir/myfile son:

    # file: mydir/myfile 
    # owner: tux 
    # group: proyecto3 
    user::rw- 
    group::r-x          # effective:r-- 
    group:mascots:r-x   # effective:r-- 
    mask::r-- 
    other::--- 
    

    El comando touch utiliza un mode con el valor 0666 al crear nuevos archivos, lo que significa que los archivos se crean con permisos de lectura y escritura para todas las clases de usuarios, siempre y cuando no existan restricciones en el comando umask ni en la ACL por defecto (consulte Sección 5.4.3.1, “Efectos de una ACL por defecto”). De hecho, esto indica que todos los permisos no contenidos en el valor mode se han eliminado de las entradas ACL correspondientes. Aunque no se ha eliminado ningún permiso de la entrada ACL de la clase de grupo, la entrada máscara se ha modificado para enmascarar los permisos no establecidos en el valor mode.

    Esta medida asegura una interacción sin interrupciones de aplicaciones, tales como compiladores, con las ACL. Puede crear archivos con permisos restringidos de acceso y, posteriormente, marcarlos como ejecutables. El mecanismo máscara garantiza que los usuarios y los grupos adecuados puedan ejecutar dichos archivos de la forma deseada.

5.4.4. Algoritmo de comprobación de ACL

Se aplica un algoritmo de comprobación antes de que cualquier proceso o aplicación pueda acceder a un objeto de sistemas de archivos protegido por la ACL. Por norma general, las entradas ACL se examinan de acuerdo con la siguiente secuencia: propietario, usuario nombrado, grupo propietario o grupo nombrado y otros. El acceso se gestiona de acuerdo con la entrada que mejor se adapta al proceso. Los permisos no se acumulan.

La operación, sin embargo, es más complicada si un proceso pertenece a más de un grupo, por lo que podría adaptarse a varias entradas de grupo. Se selecciona una entrada forma aleatoria de entre las entradas adecuadas que cuentan los permisos necesarios. No es relevante cuál de las entradas origina el resultado final “acceso autorizado”. Así mismo, si ninguna de las entradas de grupo adecuadas cuenta con los permisos necesarios, una entrada seleccionada de forma aleatoria origina el resultado final “acceso denegado”.