Desde su inicio a principios de 1990, Linux se ha desarrollado como un sistema multiusuario. Puede trabajar en él cualquier número de usuarios a la vez. Los usuarios tienen que iniciar la sesión en el sistema antes de iniciarla en sus estaciones de trabajo. Cada usuario tiene un nombre asignado y la contraseña correspondiente. Esta diferenciación de usuarios garantiza que usuarios no autorizados no puedan ver archivos para los que no tienen permiso. De igual modo, los usuarios normales tampoco pueden realizar cambios importantes en el sistema (como la instalación de nuevos programas) o tienen restringida la capacidad de realizarlos. Sólo el usuario Root, o súperusuario, tiene una capacidad sin restricciones para realizar cambios al sistema y cuenta con acceso ilimitado a todos los archivos. Los usuarios que utilicen esta capacidad prudentemente iniciando sesión solamente con acceso completo de usuario Root cuando sea necesario, podrán reducir el riesgo de pérdida no intencionada de datos. Debido a que en circunstancias normales sólo el usuario Root puede suprimir archivos de sistema o dar formato a los discos duros, la amenaza de troyanos o la introducción accidental de comandos destructivos puede reducirse significativamente.
Fundamentalmente, cada archivo de un sistema de archivos Linux pertenece a un usuario o a un grupo. Tanto estos grupos exclusivos como todos los demás pueden tener autorización para modificar, leer o ejecutar estos archivos.
Un grupo, en este caso, puede definirse como un conjunto de usuarios conectados con algunos derechos colectivos. Por ejemplo, supongamos que llamamos a un grupo que trabaja en un proyecto concreto el nombre de proyecto3. Cada usuario de un sistema Linux pertenece al menos a un grupo exclusivo, normalmente users. Puede haber tantos grupos como necesite un sistema pero sólo el usuario Root puede añadirlos. Todos los usuarios pueden emplear el comando groups para averiguar a qué grupo pertenecen.
La organización de permisos en el sistema de archivos difiere para archivos y directorios. La información de los permisos de archivos puede mostrarse con el comando ls -l. La salida podría ser parecida al Ejemplo 27.1, “Salida de muestra en la que aparecen los permisos de archivos”.
Ejemplo 27.1. Salida de muestra en la que aparecen los permisos de archivos
-rw-r----- 1 tux proyecto3 14197 Jun 21 15:03 Roadmap
Tal y como se muestra en la tercera columna, este archivo pertenece al usuario tux. Está asignado al grupo proyecto3. Para descubrir los permisos de usuario del archivo Roadmap, hay que examinar la primera columna con detenimiento.
- | rw- | r-- | --- |
Tipo | Permisos de usuarios | Permisos de grupo | Permisos para otros usuarios |
Esta columna consiste en un carácter inicial seguido de nueve caracteres agrupados en árboles. La primera de las diez letras representa el tipo del componente del sistema de archivos. El guión (–) indica que es un archivo. También se podría indicar un directorio (d), un enlace (l), un dispositivo de bloque (b) o un dispositivo de caracteres.
Los siguientes tres bloques siguen un patrón estándar. Los primeros tres caracteres indican si el archivo es legible (r) o no (–). Una w en la parte intermedia simboliza que el objeto correspondiente puede editarse y un guión (–) significa que no es posible escribir en el archivo. Una x en la tercera posición indica que el objeto puede ejecutarse. Debido a que el archivo de este ejemplo es un archivo de texto y no un ejecutable, no es necesario el acceso ejecutable para este archivo en concreto.
En este ejemplo, tux tiene, como propietario del archivo Roadmap, acceso de lectura (r) y escritura (w) a él, pero no puede ejecutarlo (x). Los miembros del grupo proyecto3 pueden leer el archivo pero no pueden modificarlo ni ejecutarlo. Los otros usuarios no cuentan con ningún acceso a este archivo. Los otros permisos se pueden asignar por medio de las ACL (listas de control de acceso). Consulte la Sección 27.2.6, “Listas de control de acceso” para obtener información básica.
Los permisos de acceso para directorios tienen el tipo d. En el caso de directorios, los permisos individuales tienen un significado ligeramente distinto.
Ejemplo 27.2. Salida de muestra en el que aparecen los permisos de directorios
drwxrwxr-x 1 tux proyecto3 35 Jun 21 15:15 ProjectData
En el Ejemplo 27.2, “Salida de muestra en el que aparecen los permisos de directorios”, el propietario (tux) y el grupo (proyecto3) que posee el directorio ProjectData son fáciles de reconocer. A diferencia de los permisos de acceso a los archivos de Acceso a archivos, el permiso de lectura definido (r) significa que los contenidos del directorio pueden mostrarse. El permiso de escritura (w) significa que se pueden crear nuevos archivos. El permiso ejecutable (x) significa que el usuario puede cambiar a este directorio. En el ejemplo anterior, el usuario tux además de los miembros del grupo proyecto3 pueden cambiar al directorio ProjectData (x), ver los contenidos (r) y añadir o suprimir archivos (w). Al resto de los usuarios, por otra parte, se les ha otorgado un nivel de acceso inferior. Pueden entrar en el directorio (x) y examinarlo (r), pero no insertar ningún nuevo archivo (w).
Tanto el propietario como, por supuesto, el usuario Root pueden cambiar los permisos de acceso de un archivo o directorio con el comando chmod seguido por los parámetros que cambian los permisos además de uno o varios nombres de archivos. Los parámetros forman distintas categorías:
Respecto a los usuarios
u (usuario): propietario del archivo
g (grupo): grupo al que pertenece el archivo
o (otros): usuarios adicionales (si no hay ningún parámetro, los cambios se aplicarán a todas las categorías)
Un carácter que suprimir (–), ajuste (=) o inserción (+)
Las abreviaturas
r: leer
w: escribir
x: ejecutar
Nombre o nombres de archivo separados por espacios
Si, por ejemplo, el usuario tux en el Ejemplo 27.2, “Salida de muestra en el que aparecen los permisos de directorios” también desea conceder a otros usuarios acceso de escritura (w) al directorio ProjectData, puede hacerlo mediante el comando chmod o+w ProjectData.
Si, por el contrario, desea denegar a todos los usuarios excepto a sí mismo los permisos de escritura, puede hacerlo introduciendo el comando chmod go-w ProjectData. Para prohibir a todos los usuarios que puedan añadir un archivo nuevo a la carpeta ProjectData, introduzca chmod -w ProjectData. Ahora, ni siquiera el propietario podrá escribir en el archivo sin tener que restablecer primero los permisos de escritura.
Otros comandos importantes para controlar la propiedad y permisos de los componentes del sistema de archivos son chown (cambiar propietario) y chgrp (cambiar grupo). Se puede usar el comando chown para transferir la propiedad de un archivo a otro usuario. Sin embargo, sólo el usuario Root tiene permiso para realizar este cambio.
Supongamos que el archivo Roadmap del Ejemplo 27.2, “Salida de muestra en el que aparecen los permisos de directorios” ya no pertenece a tux, sino al usuario geeko. El usuario Root debería introducir chown geeko Roadmap.
chgrp cambia la propiedad del grupo del archivo. Sin embargo, el propietario del archivo debe ser un miembro del grupo nuevo. De este modo, el usuario tux del Ejemplo 27.1, “Salida de muestra en la que aparecen los permisos de archivos” puede cambiar el grupo al que pertenece el archivo ProjectData a proyecto4 mediante el comando chgrp proyecto4 ProjectData, mientras sea un miembro de este nuevo grupo.
En algunos casos, los permisos de acceso pueden ser demasiado restrictivos. Por tanto, Linux cuenta con ajustes adicionales que permiten el cambio temporal del usuario y la identidad del grupo actuales para una acción en concreto. Por ejemplo, el programa passwd normalmente necesita permisos de usuario Root para acceder a /etc/passwd. Este archivo contiene información importante como los directorios personales de los usuarios o los ID de usuario y de grupo. Por tanto, un usuario normal no podría cambiar passwd, porque sería demasiado peligroso otorgar a todos los usuarios acceso directo a este archivo. Una solución posible a este problema es el mecanismo setuid. setuid (definir ID de usuario) es un atributo de archivo especial que indica al sistema que debe ejecutar los programas marcados con un ID de usuario en concreto. Considere el comando passwd:
-rwsr-xr-x 1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd
Puede ver que la s indica que el bit setuid está definido para el permiso del usuario. Mediante el bit setuid, todos los usuarios que inician el comando passwd lo ejecutan como usuario Root.
El bit setuid se aplica a los usuarios. Sin embargo, hay también una propiedad equivalente para grupos: el bit setgid. Un programa para el que se ha definido este bit se ejecuta con el ID de grupo con el que se ha guardado, sin importar el usuario que lo inicia. Por tanto, en un directorio con el bit setgid, todos los archivos o subdirectorios recién creados se asignan al grupo al que pertenece el directorio. Considere el directorio de ejemplo siguiente:
drwxrws--- 2 tux archive 48 Nov 19 17:12 backup
Puede observar que la s indica que el bit setgid está definido para el permiso de grupo. El propietario del directorio y los miembros del grupo archive pueden acceder a este directorio. Los usuarios que no sean miembros de este grupo se “asignan” al grupo respectivo. El ID de grupo vigente de todos los archivos escritos será archive. Por ejemplo, un programa de copia de seguridad que se ejecuta con el ID de grupo archive es capaz de acceder a este directorio incluso sin privilegios de usuario Root.
Existe también el bit adhesivo. Es distinto si pertenece a un programa o a un directorio ejecutable. Si pertenece a un programa, un archivo marcado de esta forma se carga en la RAM para evitar la necesidad de obtenerlo del disco duro cada vez que se usa. Este atributo apenas se utiliza porque los discos duros modernos son lo suficientemente rápidos. Si este bit se asigna a un directorio, impide que los usuarios supriman los archivos de otros usuarios. Los ejemplos típicos incluyen los directorios /tmp y /var/tmp:
drwxrwxrwt 2 root root 1160 2002-11-19 17:15 /tmp
El concepto tradicional de permiso para los objetos del sistema de archivos de Linux, como los archivos o directorios, se puede ampliar mediante las ACL (listas de control de acceso). Estas listas permiten la asignación de permisos para usuarios o grupos individuales distintos al propietario o grupo propietario originales de un objeto del sistema de archivos.
Los archivos o directorios que llevan permisos de acceso extendidos pueden detectarse con un comando sencillo como ls -l:
-rw-r--r--+ 1 tux proyecto3 14197 Jun 21 15:03 Roadmap
Roadmap pertenece a tux que a su vez pertenece al grupo proyecto3. tux tiene acceso tanto de lectura como de escritura a este archivo. Tanto el grupo como el resto de usuarios cuentan con acceso de lectura. La única diferencia que distingue este archivo de uno sin ACL es el signo + adicional en la columna que incluye los bits de permisos.
Obtenga información acerca de la ACL ejecutando getfacl Roadmap:
# file: Roadmap # owner: tux # group: proyecto3 user::rw- user:jane:rw- effective: r-- group::r-- group:djungle:rw- effective: r-- mask::r-- other::---
Las primeras tres líneas de la salida no retienen ninguna información que no esté disponible con ls -l. Estas líneas sólo detallan el nombre de archivo, el propietario y el grupo que lo posee. De la línea 4 a la 9 se retienen las entradas de la ACL. Los permisos de acceso convencionales representan un subconjunto de los posibles al usar las ACL. La ACL de ejemplo otorga acceso de lectura y escritura al propietario del archivo además de al usuario jane (líneas 4 y 5). El concepto convencional se ha expandido permitiendo el acceso a un usuario adicional. Lo mismo se aplica a la gestión del acceso de grupo. El grupo que posee el archivo tiene permisos de lectura (línea 6) y el grupo djungle tiene permisos de lectura y escritura. La entrada mask en la línea 8 reduce los permisos vigentes para el usuario jane y el grupo djungle al acceso de lectura. El resto de usuarios y grupos no obtienen ningún tipo de acceso al archivo (línea 9).
En este documento sólo se ha ofrecido información muy básica. Puede obtener información más detallada acerca de las ACL en el Capítulo 24, Listas de control de acceso en Linux.