Linux fue concebido desde un principio como un sistema multiusuario, es decir, para ser usado por varios usuarios al mismo tiempo. Esta es una de las grandes diferencias con respecto al sistema operativo Windows de Microsoft.
La característica más importante es la obligación de registrarse en el sistema al inicio de cada sesión de trabajo. Para ello el usuario dispone de un nombre de usuario propio con su contraseña correspondiente. Esta diferenciación entre usuarios impide que personas no autorizadas puedan acceder a archivos que les han sido vetados. Un usuario, por lo general, no puede (o sólo de forma muy limitada) hacer grandes cambios en el sistema como, por ejemplo, la instalación de programas. Tan sólo el superusuario o administrador root dispone prácticamente de derechos ilimitados y posee acceso sin restricciones a todos los archivos. Quien utilice este concepto con precaución y sólo se registre como root cuando sea realmente necesario, puede reducir en gran medida el riesgo de perder datos de forma involuntaria. La amenaza de caballos de Troya o de comandos destructivos introducidos sin querer se reducen de forma significativa dado que normalmente sólo el superusuario puede borrar archivos del sistema o formatear discos duros.
Fundamentalmente, en el sistema de archivos Linux, cada archivo pertenece a un usuario y a un grupo. Cada uno de estos dos tipos de propietarios, así como también los extraños, pueden obtener derechos de escritura, de lectura así como de ejecución por parte del propietario del archivo.
Se denomina grupo a un conjunto de usuarios con un tipo concreto de derechos
colectivos: un ejemplo podría ser un grupo que trabajase en un proyecto
concreto al que podríamos llamar proyecto3. En Linux,
todos los usuarios son miembros de al menos una de estas unidades de
administración. El grupo por defecto es users. Pueden crearse casi tantos
grupos adicionales como se desee, si bien, esta función está reservada para
root. Todos los usuarios pueden
averiguar de qué grupo son miembros con ayuda del comando
groups.
A continuación observaremos más de cerca la estructura de los derechos en el sistema de archivos. El resultado de ejecutar ls -l podría ser lo que se ve en el Ejemplo 19.1, “Muestra de los derechos de acceso a un archivo”.
Ejemplo 19.1. Muestra de los derechos de acceso a un archivo
-rw-r----- 1 tux proyecto3 14197 Jun 21 15:03 Roadmap
Tal y como se puede observar en la tercera y cuarta columna, este archivo
pertenece al usuario tux, y al
grupo proyecto3. Para poder ver detalladamente los
derechos sobre el archivo, hay que mirar con atención la primera columna.
- | rw- | r-- | --- |
Tipo | Derechos de usuario | Derechos de grupo | Derechos de otros usuarios |
Esta columna consta de un carácter inicial y de otros nueve caracteres
divididos en grupos de tres. La primera de las diez letras representa el
tipo de archivo. El guión (-) nos indica que en este
caso se trata de un archivo. Podría tratarse también de un directorio
(d), un enlace (l), un dispositivo
de bloques (b) o un dispositivo de caracteres
(c).
Los tres bloques siguientes siguen un esquema común: El primer carácter
de cada uno de los tres grupos indica si los diferentes grupos de usuarios
tienen derecho de lectura sobre este archivo (r) o si
no lo tienen (–). Los dos signos siguientes
funcionan de manera similar: el carácter (w) situado
en el medio simboliza el derecho a escribir en el objeto en cuestión;
esto no sería posible si aparece un guión (–).
Por otra parte, en la columna de la derecha de cada grupo puede aparecer
el carácter (x) que indica el permiso de ejecución.
Dado que en este caso se trata de un archivo de texto y no de un programa
ejecutable, se puede prescindir perfectamente de este permiso de
ejecución.
En este ejemplo tux, como dueño
del archivo Roadmap, tiene tanto el permiso de lectura
(r) como el de escritura (w), pero no
puede ejecutarlo (no hay x). Los miembros del grupo
proyecto3 sólo tienen permiso de lectura sobre el archivo,
pero no de escritura ni de ejecución. El resto de usuarios no tiene ningún tipo
de permiso sobre este archivo. Es posible asignar otros permisos por medio de
las listas de control de acceso o ACLs. Vea a este respecto la Sección 19.2.6, “Access Control Lists” y el capítulo correspondiente en el
Manual de administración.
Ahora nos dedicaremos a los permisos de acceso sobre los directorios,
representados por el carácter d. Los permisos tienen
aquí un significado algo diferente. Sirva de aclaración el siguiente
ejemplo:
Ejemplo 19.2. Ejemplo de derechos de acceso a un directorio
drwxrwxr-x 1 tux proyecto3 35 Jun 21 15:15 Datosproyecto
En el Ejemplo 19.2, “Ejemplo de derechos de acceso a un directorio” es
fácil reconocer que el propietario de
(Datosproyecto) es
(tux) y que el grupo de
propietarios es (proyecto3). A diferencia de los
permisos de archivos de la Derechos sobre archivos, el derecho de
lectura (r) indica aquí que se puede ver el contenido
del directorio. El permiso de escritura (w) hace
referencia a la posibilidad de añadir nuevos archivos en este directorio
y el derecho de ejecución (x) autoriza a cambiar a
este directorio. En relación al ejemplo anterior, esto significa que
tanto el usuario tux como los
miembros del grupo proyecto3 tienen derecho a cambiar
al directorio Datosproyecto -indicado mediante
x-, ver su contenido (r), y añadir
o borrar archivos (w). Los demás usuarios tienen menos
derechos: sólo pueden acceder a él (x) y echar un
vistazo (r), pero no pueden añadir ningún archivo
(falta w).
Los permisos de acceso de un archivo o de un directorio pueden ser
modificados por el propietario (y por supuesto también por
root) mediante el comando
chmod,
que se introduce junto con los parámetros de permisos de acceso que se
desean cambiar y con el nombre del archivo a modificar.
Los dos parámetros están formados por:
las categorías afectadas
u (user): el
propietario del archivo
g (group): el
grupo al que pertenece el propietario del archivo
o (others):
otros usuarios (si no se introduce ningún parámetro, los cambios
afectarán a todas las categorías)
un carácter para retirar permisos (-), no
modificarlos (=) o añadir (+)
las abreviaturas ya conocidas para
r (read): lectura
w (write): escritura
x (execute): ejecución
así como el nombre del archivo (o archivos) correspondiente escrito a continuación y separado por un espacio en blanco.
Si por ejemplo, el usuario tux,
del Ejemplo 19.2, “Ejemplo de derechos de acceso a un directorio”, desea otorgar el permiso de
escritura (w) sobre el directorio
Datosproyecto a otros usuarios, lo puede llevar a
cabo usando el comando: chmod o+w Datosproyecto.
Sin embargo, para quitar el derecho de escritura a todos los usuarios
aparte de uno mismo, utilice el comando chmod go-w
Datosproyecto. Para prohibir a todos los usuarios crear un
archivo en el directorio Datosproyecto introduzca
chmod -w Datosproyecto. Ahora ni siquiera el
propietario del archivo tiene derecho de modificar su archivo antes de que
restablezca el derecho de escritura.
Otros comandos importantes al respecto son chown
(Change Owner) y chgrp
(Change Group), que gestionan las relaciones de propiedad de los elementos
del sistema de archivos. El comando chown permite
cambiar el propietario de un archivo. No obstante, esta modificación
sólo puede ser realizada por
root.
Supongamos que el archivo Roadmap del Ejemplo 19.2, “Ejemplo de derechos de acceso a un directorio” ya no debe
pertenecer a tux, sino al
usuario geeko. El comando que
root debe utilizar para esta
modificación es: chown geeko Roadmap.
Asimismo y de forma análoga, el comando chgrp permite
cambiar el grupo de propietarios. Hay que tener en cuenta que el
propietario del archivo debe pertenecer al grupo al que desea otorgar la
categoría de grupo de propietarios. Así por ejemplo, mediante el
siguiente comando, el usuario
tux del Ejemplo 19.1, “Muestra de los derechos de acceso a un archivo” puede cambiar el grupo de propietarios del
archivo Datosproyecto a proyecto4
utilizando el comando chgrp proyecto4 Datosproyecto,
siempre y cuando él sea miembro de este grupo. Para
root no existe esta
restricción.
Hay situaciones en las que los derechos de acceso son demasiado restrictivos. En estos casos, existen en Linux opciones adicionales que permiten cambiar temporalmente el usuario y grupo de identidad actual para realizar una determinada acción.
Por ejemplo, el programa passwd requiere normalmente
derechos de root para acceder a /etc/passwd. Este archivo
contiene información importante como por ejemplo los directorios personales de
los usuarios y los IDs de usuarios y grupos. Un usuario normal no podría
cambiar passwd porque sería demasiado peligroso conceder a
todos los usuarios acceso directo a este archivo. La solución a este problema
se encuentra en el mecanismo setuid. Setuid (Set User ID) es un atributo
especial de archivo que el sistema regula, con el fin de que se ejecuten los
programas seleccionados con una determinada identificación de usuario
previamente indicada. Veamos el comando passwd:
-rwsr-xr-x 1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd
En el ejemplo puede ver el bit s definido para los
permisos de usuario. Gracias al bit setuid, todos los usuarios que inicien el
comando passwd lo ejecutarán como usuario root.
El atributo setuid es válido para usuarios, pero existe un atributo equivalente para grupos: setgid. Cuando se asigne a un programa, este se ejecutará con la identificación de grupo definida, independientemente del usuario que lo haya arrancado. Por eso todos los archivos y subdirectorios que se crean dentro de este directorio pertenecen al mismo grupo que el directorio. Veamos el siguiente ejemplo:
drwxrws--- 2 tux archive 48 Nov 19 17:12 backup
Aquí puede ver el bit s definido para los permisos
de grupo, lo que significa que el propietario del directorio y los miembros del
grupo archive pueden acceder a este
directorio. Los usuarios que no son miembros de este grupo se
“mapean” al grupo correspondiente. El ID de grupo efectivo de
todos los archivos escritos es archive. Por ejemplo, una copia de seguridad que
se ejecute con el ID de grupo archive podrá acceder a este directorio sin
tener permisos de root.
Además de los bits setuid y setgid, existe el sticky bit. Aquí se debe
diferenciar si se trata de un programa ejecutable o de un
directorio. En el caso de un programa, un archivo marcado con este bit se
carga a la memoria RAM para no tener que obtenerlo del disco duro cada vez
que se utiliza. Hoy en día, este atributo se usa en raras ocasiones porque los discos
duros modernos cumplen con creces los requisitos de velocidad.
Ahora bien, si se asigna este atributo a un directorio, este impide los usuarios
borren los archivos. (En directorios con sticky bit, los usuarios sólo puede
eliminar archivos que posean ellos mismos). Los ejemplos típicos son los
directorios /tmp y /var/tmp:
drwxrwxrwt 2 root root 1160 2002-11-19 17:15 /tmp
Una extensión del concepto tradicional de derechos sobre archivos y directorios es el concepto de las listas de control de acceso o ACL (Access Control Lists). Mediante estas listas es posible otorgar derechos de acceso a usuarios y grupos distintos de los usuarios y grupos que son dueños de los objetos.
Los directorios y archivos con derechos extendidos se reconocen con un sencillo ls -l por lo siguiente:
-rw-r--r--+ 1 tux proyecto3 517 2003-01-08 18:12 Roadmap
A primera vista, el resultado del comando ls apenas ha
cambiado. El dueño del archivo Roadmap es el usuario
tux que forma parte del grupo
proyecto3. tux tiene tanto derechos de
lectura como de escritura sobre este archivo; el grupo y el resto del mundo
tienen derecho de lectura. El único indicador de un cambio respecto a un
archivo sin ACL es el símbolo + en la primera columna,
junto a los bits de derechos.
Para obtener detalles sobre la ACL del fichero de ejemplo
Roadmap, utilice el comando getfacl:
# 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 no dan ninguna información que no se pueda obtener
con ls -l, ya que sólo se trata del nombre de archivo,
del dueño y del grupo. Las líneas 4 a 9 representan los verdaderos
parámetros de la ACL ACL entries. Los
derechos habituales son un subconjunto de los derechos que se pueden definir
con la ACL. El ejemplo de ACL otorga derechos de lectura y escritura al
dueño del archivo y al usuario jane (líneas 4 y 5). Lo
mismo vale para los grupos: El grupo del dueño del archivo tiene derecho de
lectura (línea 6) y el grupo djungle tiene derechos de
lectura y escritura. El parámetro mask en línea 8 limita
los derechos del usuario jane y del grupo
djungle a solo lectura. Todos los demás usuarios y grupos
no tienen derecho de lectura (línea 9).
Puede encontrar información adicional sobre ACL en el Manual de administraciónen el capítulo Access Control Lists en Linux.