Linux es definitivamente un sistema multiusuario por lo que necesita proveer un sistema de permisos para controlar el conjunto de operaciones autorizadas sobre archivos y directorios, lo que incluye todos los recursos del sistema y los dispositivos (en un sistema Unix cualquier dispositivo es representado por un archivo o un directorio). Este principio es común a todos los sistemas Unix pero siempre es útil recordarlo, especialmente porque existen algunos usos avanzados interesantes y relativamente desconocidos.
9.3.1. Propietarios y permisos
Cada archivo o directorio tiene permisos específicos para tres categorías de usuarios:
su dueño (representado con u
por «usuario»);
su grupo dueño (representado con g
por «grupo»), que incluye a todos los miembros del grupo;
y los demás (representado con o
por «otros»).
Se pueden combinar tres tipos básicos de permisos:
lectura (representado por r
por «read»: leer);
escritura (o modificación, representado con w
por «write»: escribir);
ejecución (representado con x
por «eXecute»: ejecutar).
En el caso de un archivo, estos permisos se entienden fácilmente: la lectura permite acceder al contenido (inclusive copiarlo), la escritura permite cambiarlo y la ejecución permite ejecutarlo (lo cual sólo funcionará si es un programa).
Los directorios se manejan diferente. El permiso de lectura provee acceso para consultar su lista de elementos (archivos y directorios), el permiso de escritura permite crear o borrar archivos y el permiso de ejecución permite atravesarlo (especialmente para llegar a él con cd
). Poder atravesar un directorio sin leerlo permite acceder a los elementos que contenga siempre que se conozca su nombre, pero no le permitirá encontrarlos si no sabe que existen o conoce sus nombres exactos.
Tres programas controlan los permisos asociados a un archivo:
chown usuario archivo
cambia el dueño de un archivo;
chgrp group archivo
modifica el grupo dueño;
chmod permisos archivo
cambia los permisos del archivo.
Hay dos formas de representar permisos. Entre ellas, la representación simbólica es probablemente la más sencilla de entender y recordar. Involucra las letras mencionadas anteriormente. Puede definir permisos para cada categoría de usuarios (u
/g
/o
) definiéndolos explícitamente (con =
, agregar permisos (+
) o eliminar (-
) permisos. Por lo tanto, la fórmula u=rwx,g+rw,o-r
provee al dueño permisos de lectura, escritura y ejecución, agrega permisos de lectura y escritura al grupo dueño y elimina el permiso de lectura para los otros usuarios. Los permisos que no son modificados cuando se agreguen o eliminen permisos en estas fórmulas se mantienen intactos. La letra a
(por «all», todos) incluye las tres categorías de usuarios, por lo que a=rx
otorga los mismos permisos (lecutra y ejecución, pero no escritura) a las tres categorías de usuario.
La representación numérica (octal) asocia cada permiso con un valor: 4 para lectura, 2 para escritura y 1 para ejecución. Asociamos cada combinación de permisos con la suma de dichos valores. Se asigna cada valor a las diferentes categorías de usuarios uniéndolos en el orden usual (dueño, grupo, otros).
Por ejemplo, la orden chmod 754
archivo configurará los siguientes permisos: lectura, escritura y ejecución para el dueño (ya que 7 = 4 + 2 + 1); lectura y ejecución para el grupo (ya que 5 = 4 +1); sólo lectura para los otros usuarios. El 0
(cero) significa ningún permiso; por lo tanto chmod 600 archivo
permite permisos de lectura y escritura al dueño y ningún permiso para todos los demás. La combinación de permisos más frecuente es 755
para archivos ejecutables y directorios y 644
para archivos de datos.
Para representar permisos especiales, puede agregar un cuarto dígito antes que los demás según el mismo principio, donde los bits setuid
, setgid
y «sticky
» son, respectivamente, 4, 2 y 1. chmod 4754
asociará el bit setuid
con los permisos descriptos anteriormente.
El uso de notación octal sólo permite definir todos los permisos en un archivo de forma simultanea; no puede utilizarse para agregar un nuevo permiso a un conjunto anterior, como p.ej. agregar el permiso de lectura al grupo dueño, ya que deben tenerse en cuenta los permisos existentes y hay que calcular el nuevo valor numérico correspondiente.
9.3.2. ACLs - Listas de control de acceso
Muchos sistemas de archivos, como Btrfs, Ext3, Ext4, JFS, XFS, etc., admiten el uso de Listas de Control de Acceso (ACL). Amplían las funciones básicas de propiedad y permiso de archivos, descritas en la sección anterior, y permiten un control más detallado de cada objeto (archivo).Por ejemplo: Un usuario quiere compartir un archivo con otro usuario y éste sólo debe poder leer el archivo, pero no escribirlo ni modificarlo.
Para algunos de los sistemas de archivos, el uso de ACLs está habilitado por defecto (por ejemplo, Btrfs, Ext3, Ext4). Para otros sistemas de archivos o sistemas antiguos se ha de habilitar usando la opción de montaje acl
- ya sea directamente con la orden mount
o en /etc/fstab
. De la misma manera se puede deshabilitar el uso de ACL usando la opción de montaje noacl
. Para los sistemas de archivos Ext* también se puede utilizar, por defecto, la orden tune2fs -o [no]acl /dev/device
to enable/disable the use of ACLs. Los valores predeterminados de cada sistema de archivos se pueden encontrar generalmente en sus páginas de manuales homónimos en la sección 5 (filesystem(5)) o en mount(8).
Después de habilitar ACLs, se pueden establecer permisos utilizando la orden setfa(1), mientras getfacl(1) permite recuperar los ACL para un objeto o path dado. Estas órdenes forman partee del paquete acl. Con setfacl
uno también puede configurar archivos o directorios recién creados para heredar permisos del directorio padre. Es importante señalar que los ACL se procesan en su orden y que una entrada anterior que se ajuste a la situación tiene preferencia sobre las entradas posteriores.
Si un archivo tiene configurado ACL, la salida de la orden ls -l
mostrará un plus-sign después de los permisos tradicionales. Cuando se usan ACL, el comando chmod
se comporta de forma ligeramente diferente, y se puede ignorar umask
. La documentación ampliada, por ejemplo acl(5) contiene más información.