La Tabla 35.1, “Resumen de tipos de entrada ACL” ofrece un resumen de los seis tipos posibles de entradas ACL, cada una de las cuales define un tipo de permisos para el propietario del archivo o directorio. La entrada owning group define los permisos del grupo propietario del archivo. El superusuario puede modificar el propietario o grupo propietario mediante el comando chown o chgrp, en cuyo caso el propietario y el grupo propietario se refieren al nuevo propietario y grupo propietario. Cada entrada named user define los permisos del usuario especificado en el campo cualificado correspondiente de la entrada (el campo situado en el centro del texto tal y como se muestra en la Tabla 35.1, “Resumen de tipos de entrada ACL”. Cada una de las entradas named group define los permisos del grupo especificado en el campo cualificado correspondiente de la entrada. Sólo las entradas named user y named group disponen de un campo cualificado que no está vacío. La entrada other define los permisos para el resto de usuarios.
mask limita aún más los permisos otorgados por las entradas named user, named group y owning group, ya que se emplea para especificar qué permisos son efectivos y cuáles están enmascarados en cada una de ellas. Si los permisos existen en una de las entradas mencionadas así como en la máscara, éstos son efectivos. Si, por el contrario, sólo están presentes en la máscara o en la entrada, no lo son, por lo que no se aplican. Todos los permisos contenidos en las entradas owner y owning group siempre tienen vigencia. Este esquema se explica en la Tabla 35.2, “Enmascaramiento de permisos de acceso”.
Las ACLs pueden dividirse fundamentalmente en dos clases. Una ACL estándar consiste exclusivamente en las entradas de tipo owner (propietario), owning group (grupo propietario) y other (otros) y coincide con los bits de permisos tradicionales para archivos y directorios. Una ACL extendida (extended) contiene además una entrada mask (máscara) y puede incluir varias entradas del tipo named user (usuario identificado por el nombre) y named group (grupo identificado por el nombre). La Tabla 35.1, “Resumen de tipos de entrada ACL” ofrece un resumen de los distintos tipos de entradas ACL.
Tabla 35.1. Resumen de tipos de entrada ACL
Tipo | Formato en texto |
|---|---|
owner |
|
named user |
|
owning group |
|
named group |
|
mask |
|
other |
|
Tabla 35.2. Enmascaramiento de permisos de acceso
Tipo | Formato en texto | Permisos |
|---|---|---|
named user |
|
|
mask |
|
|
permisos efectivos: |
|
Los siguientes gráficos ilustran respectivamente las posibles variantes de
una ACL estándar y una extendida (ver Figura 35.1, “ACL estándar: entradas ACL y bits de permiso” y Figura 35.2, “ACL extendida: entradas ACL y bits de permiso”). Las figuras están divididas en tres
bloques. A la izquierda aparece la descripción del tipo de entrada ACL, en
el medio un ejemplo de ACL y a la derecha los bits de permiso tal y como
los muestra el comando ls -l.
En ambos casos, los permisos correspondientes al owner
class han sido asignados a la entrada ACL
owner. Asimismo, la asignación de permisos
other class a la correspondiente entrada ACL es
siempre la misma. En cambio, la asignación de permisos group
class varía según el caso.
En el caso de una ACL estándar (sin entrada mask), los permisos de la group class se asignan a la entrada ACL owning group (ver Figura 35.1, “ACL estándar: entradas ACL y bits de permiso”). En el caso de una ACL extendida (con entrada mask), los permisos de la group class se asignan a la entrada mask (ver Figura 35.2, “ACL extendida: entradas ACL y bits de permiso”).
Este tipo de asignación garantiza la correcta interacción de aplicaciones con y sin soporte ACL. Los permisos de acceso definidos mediante los bits de permiso constituyen el límite para las opciones de configuración avanzadas que pueden realizarse vía ACL. Todos los permisos que no están reflejados aquí no han sido definidos en la ACL o no tienen vigencia. Si los bits de permiso se modifican, esto también se refleja en la ACL y viceversa.
Por medio del siguiente ejemplo, se explicará en tres pasos el funcionamiento de una access ACL:
Antes de crear un directorio, puede emplear el comando
umask para definir qué permisos de acceso han de estar
enmascarados desde el momento de su creación. umask
027 define los permisos de cada grupo de
usuarios como se describe a continuación: el propietario del archivo
posee todos los permisos (0), el grupo al
que pertenece el propietario no tiene permiso de escritura sobre el
archivo (2) y el resto de usuarios carece
de cualquier permiso sobre el archivo (7).
Los números se leen como una máscara de bits. Puede obtener más
información sobre umask en la página del manual
correspondiente (man
umask).
Se ha creado el directorio mydir
que ha obtenido los derechos definidos por medio de
umask. Puede comprobar si todos los permisos han sido
asignados correctamente con el comando ls -dl mydir. La salida en este caso sería:
drwxr-x--- ... tux project3 ... mydir
Mediante el comando getfacl mydir puede comprobar el estado inicial de la ACL:
# file: mydir # owner: tux # group: project3 user::rwx group::r-x other::---
La salida del comando getfacl refleja exactamente la correspondencia entre bits de permiso y entradas ACL descrita en la Sección 35.3.1, “Entradas ACL y bits de permiso”. Las primeras tres líneas de la salida de comando designan el nombre, propietario y grupos pertenecientes del directorio. Las tres líneas siguientes contienen las tres entradas ACL owner, owning group y other. En conjunto, el comando getfacl en el caso de esta ACL estándar no le ofrece ninguna información que no hubiese obtenido también con el comando ls.
Su primera intervención en la ACL consiste en asignar a un nuevo usuario
geeko y a un nuevo grupo mascots
permisos de lectura, escritura y ejecución.
setfacl -m user:geeko:rwx,group:mascots:rwx mydir
La opción -m le ordena a setfacl
modificar la ACL actual. El siguiente argumento indica qué entradas ACL
serán modificadas (muchas están separadas entre sí por comas). Finalmente
tiene que introducir el nombre del directorio para el que tendrán validez
estos cambios.
La ACL resultante se muestra con el comando
getfacl.
# 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 para el usuario geeko y el grupo
mascots creadas por usted, se ha generado una entrada
mask. Esta entrada mask se crea
automáticamente para reducir todas las entradas de group
class a un denominador común. Además,
setfacl adapta automáticamente las entradas
mask a las opciones que usted modifique (siempre que
no haya desactivado esta función con -n).
mask define los permisos de acceso máximos que
tienen validez para todas las entradas de la group
class. Entre estas se incluyen named
user, named group y owning
group. Los bits de permiso de group
class mostrados al ejecutar ls -dl mydir
equivalen a la entrada mask.
drwxrwx---+ ... tux project3 ... mydir
En la primera columna de la salida aparece un signo +
que hace referencia a una ACL extendida.
Según la salida del comando ls, los permisos de la
entrada mask incluyen también permiso de escritura.
Normalmente, estos bits de permiso también indicarían que el
owning group (aquí: project3)
tendría asimismo derechos de escritura para el directorio
mydir. No obstante, los permisos de acceso realmente
válidos para para el owning group consisten en la
intersección de los permisos definidos para el owning
group y mask, es decir,
r-x en nuestro ejemplo (ver la Tabla 35.2, “Enmascaramiento de permisos de acceso”). Aquí tampoco se han
modificado los permisos de owning group después de
añadir las entradas ACL.
La entrada mask puede modificarse con
setfacl o con chmod.
Por ejemplo, emplee el comando chmod g-w
mydir. ls -dl
mydir muestra lo siguiente:
drwxr-x---+ ... tux project3 ... mydir
getfacl mydir ofrece la siguiente 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 haber retirado el permiso de escritura a la group
class por medio del comando chmod, la
salida del comando ls ya le indica que los bits de
mask han sido adaptados en consecuencia a través del
comando chmod. Como se puede ver, el único que posee
permiso de escritura sobre el directorio mydir es el
propietario. Esto se ve aún más claramente en la salida del comando
getfacl. Además, getfacl añade a
cada entrada un comentario informando de que los bits de permiso
realmente válidos no son los definidos inicialmente, ya que la entrada
mask se encarga de filtrarlos. Por supuesto, se
puede volver a en cualquier momento al estado original con el comando
chmod correspondiente:
Los directorios pueden ser equipados con un tipo especial de ACLs, las ACLs predeterminadas. Estas definen los derechos que heredan los subobjetos de estos directorios en el momento de su creación. La ACL predeterminada tiene vigencia tanto sobre subdirectorios como sobre archivos.
Los permisos de acceso en la ACL predeterminada son heredados de forma distinta por archivos y subdirectorios:
Un subdirectorio hereda la ACL predeterminada del directorio superior como propia default ACL y además como access ACL.
Un archivo hereda la ACL predeterminada como propia access ACL.
Todas las llamadas del sistema (system
calls) que crean objetos del sistema utilizan un
parámetro mode. Este parámetro se encarga de definir
los permisos de acceso sobre el nuevo objeto del sistema:
Si el directorio superior carece de ACL predeterminada, los permisos
resultantes son los introducidos en el parámetro mode
menos los permisos asignados en umask.
Si existe una ACL predeterminada para el directorio superior, se asignan
al objeto los bits de permiso resultantes de la intersección de los
permisos del parámetro mode y de los que contiene la
ACL predeterminada. En este caso no se tiene en cuenta
umask.
Los tres ejemplos siguientes ilustran las ACLs predeterminadas y describen las operaciones más importantes que pueden efectuarse en directorios:
A continuación se añade una ACL predeterminada al directorio
mydir ya existente:
setfacl -d -m group:mascots:r-x mydir
La opción -d del comando
setfacl hace que setfacl realice
las siguientes modificaciones en (opción -m) en la
ACL predeterminada.
Observe el resultado de este comando detenidamente:
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::---
La salida de getfacl contiene tanto la access ACL
como la ACL predeterminada. Todas las líneas que comienzan por
default forman la ACL predeterminada. Aunque en el
comando setfacl usted sólo había indicado una entrada
para el grupo mascots en la ACL predeterminada,
setfacl ha copiado automáticamente el resto de
entradas del la access ACL para construir una ACL predeterminada válida.
Las ACLs predeterminadas no influyen de manera directa en los permisos
de acceso, sino que sólo tienen efecto durante la creación de objetos
del sistema. En términos de herencia, sólo se tiene en cuenta la ACL
predeterminada del directorio superior.
En el siguiente ejemplo cree con mkdir un
subdirectorio en mydir que “heredará”
la ACL predeterminada.
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::---
Como era de esperar, el subdirectorio recién creado
mysubdir tiene los permisos de la ACL
predeterminada ACL del directorio superior. La access ACL de
mysubdir es una réplica exacta de la ACL
predeterminada de mydir. Lo mismo sucede con la ACL
predeterminada, que a su vez se pasará a los subobjetos de este
directorio.
Ahora cree un archivo en el directorio mydir por
medio de touch, por ejemplo,
touch mydir/myfile.
ls -l mydir/myfile genera la salida:
-rw-r-----+ ... tux project3 ... mydir/myfile
La salida del comando getfacl
mydir/myfile es:
# file: mydir/myfile # owner: tux # group: project3 user::rw- group::r-x # effective:r-- group:mascots:r-x # effective:r-- mask::r-- other::---
Lo más importante de este ejemplo es que touch pasa
el parámetro mode con un valor de 0666,
lo que significa que los nuevos archivos se crean con permisos de lectura y
escritura para todas las clases de usuario, a no ser que existan otras
restricciones por parte de umask o de la ACL predeterminada
(ver la Sección 35.3.3.1, “Efecto de una ACL predeterminada”). En nuestro ejemplo esto
significa que todos los permisos que no están incluidos en
mode serán eliminados de las entradas ACL
correspondientes. Aunque no se ha eliminado ningún permiso de la entrada ACL de
group class, la entrada mask ha sido
adaptada para que los bits de permiso definidos por mode no
sean enmascarados.
De este modo se garantiza que un compilador, por ejemplo, pueda funcionar sin problemas con ACLs. Puede crear archivos con permisos de acceso restringidos y a continuación marcarlos como ejecutables. El mecanismo mask se ocupa de que sólo los usuarios y grupos adecuados puedan ejecutar los archivos.
Una vez explicado el funcionamiento de las herramientas de configuración más importantes de las ACLs, a continuación se describe brevemente el algoritmo de evaluación al que se somete cualquier proceso o aplicación antes de que se le proporcione acceso a un objeto del sistema protegido por ACLs. Las entradas ACL son analizadas en el siguiente orden: owner, named user, owning group o named group y other. El acceso se regula a través de la entrada que mejor se ajuste al proceso.
El mecanismo se complica cuando un proceso pertenece a más de un grupo, ya que potencialmente podrá ajustarse a varias entradas group. En este caso se selecciona una de las entradas adecuadas con los permisos requeridos. Para el resultado final “acceso autorizado” es irrelevante cuál de estas entradas ha sido seleccionada. Si ninguna de las entradas group apropiadas contiene los permisos correctos, se selecciona una cualquiera que provocará el resultado final acceso denegado.