Permisos
Como ya vimos, UNIX es un sistema operativo multitarea y multiusuario. Esto posibilita que varios usuarios ejecuten distintas tareas a la vez, y en consecuencia, se hace necesario establecer algún mecanismo que proteja la información de cada uno.
La forma que tiene el sistema de identificar a cada usuario es mediante la asignación de cuentas. Cada usuario dispone de un nombre de usuario que lo identifica (login, login_id) y además puede pertenecer a uno o varios grupos. En un sistema GNU/Linux, aunque lo utilice una sola persona, al menos deberíamos tener dos cuentas, una para el root (superusuario, puede leer o modificar cualquier fichero del sistema, independientemente de los permisos que tenga asociados), que debe utilizarse, por motivos de seguridad, solo durante el tiempo de efectuar una labor de administración, y otra como usuario normal para la realización del trabajo cotidiano.
La identidad del usuario junto con el grupo principal al que pertenece determinan los derechos de acceso a los ficheros y otros recursos del sistema.
Cuando un usuario inicia su sesión, teclea un nombre (login o login_id) y después confirma que efectivamente es él escribiendo una contraseña (password). El sistema en realidad reconoce al usuario por medio de un número llamado identificador del usuario (UID). Además del UID, al usuario se le asigna un identificador de grupo principal (GID), que lo coloca dentro de cierta clase de usuarios.
El sistema mantiene toda la información que necesita conocer sobre cada usuario en dos ficheros:
- /etc/passwd
- /etc/group
El fichero de texto /etc/passwd contiene una línea para cada usuario que puede utilizar el sistema. El formato de la línea es el siguiente:
login_id:clave_codificada:UID:GID:varios:directorio_de_entrada:shell
El primer campo contiene el nombre de login del usuario. El segundo está reservado para la contraseña del usuario, actualmente aparece una x, pues el sistema de almacenar las claves ha cambiado y estas se guardan ahora en /etc/shadow. Cuando un usuario se identifica con su contraseña, esta se codifica y se compara el resultado con la que está almacenada en el fichero /etc/passwd (actualmente en /etc/shadow); si ambas coinciden, se le permite al usuario iniciar la sesión.
Los campos tercero y cuarto contienen los identificadores numéricos de usuario (UID) y de grupo principal (GID). El campo varios puede contener cualquier cosa, como el nombre completo del usuario, la dirección, el número de teléfono, etc. Esta información es la que muestra la orden finger.
El sexto campo indica el directorio de entrada al sistema del usuario, y por último, el campo shell le dice al sistema qué shell deberá ejecutar cuando el usuario inicie la sesión.
Un usuario puede pertenecer a más de un grupo. El grupo que aparece en el fichero /etc/passwd se llama grupo principal y el resto de los grupos a los que pertenece son sus grupos secundarios. El fichero /etc/group contiene la lista de los grupos que existen en el sistema, donde cada línea representa a un grupo:
nombre_grupo:x:GID:lista_de_usuarios
La información que contiene la línea anterior es la siguiente: el nombre del grupo, una posible contraseñña que podría tener (normalmente se mostrará una x), el GID y la lista separada por comas de los usuarios que pertenecen al grupo con papel secundario. Por lo tanto, el sistema para saber a qué grupos pertenece un usuario necesita leer el fichero /etc/passwd para descubrir su grupo principal y el fichero /etc/group para conocer sus grupos secundarios.
En UNIX cada fichero tiene un propietario (inicialmente el usuario que lo creó) y pertenece a un grupo en particular (generalmente el grupo principal del propietario). Basado en esta estructura, el sistema asigna permisos a tres niveles:
- a nivel del propietario de fichero.
- a nivel del grupo del fichero (grupo al que pertenece el propietario).
- a nivel de todos los demás usuarios.
Para cada uno de estos tres niveles, asigna tres tipos de permisos básicos:
- r para la lectura.
- w para la escritura.
- x para la ejecución.
Ya vimos que esta información se guarda en el nodo-i del fichero y se puede ver con un listado largo (ls -l) o con la orden stat:
$ ls -l
total 16
drwxr-xr-x 2 usuario usuario 4096 sep 2 15:07 d
-rw-r--r-- 1 usuario usuario 6751 sep 2 19:27 ls.man.gz
-rw-r--r-- 1 usuario usuario 4061 sep 1 13:25 rm.man
Existen dos formas de escribir los permisos cuando los tenemos que especificar como argumentos de algunos comandos:
- Modo simbólico
- Modo octal
El modo simbólico utiliza letras para especificar los permisos:
En este modo los permisos se agrupan mediante el siguiente formato, que puede repetirse separándolo por comas y sin espacios:
[quién] op permiso [, [quién] op permiso]...
- quién es una combinación de las letras u (para los permisos del propietario), g (grupo) y o (otros). Puede utilizarse también una a (all) para representar a las tres letras anteriores a la vez (ugo), y este es el valor que se asume si no se pone nada en este apartado con los permisos r y x; con el permiso w se asume u.
- op puede ser un + para añadir un permiso que actualmente no se tiene, un - para quitar un permiso que se tiene, o un = para asignar de forma absoluta un permiso, poniendo los permisos especificados y eliminando los no especificados.
- permiso es una combinación de las letras r, w, x, s y t (s representa a los permisos set user id y set group id y la t al sticky bit; estos permisos lo veremos más adelante).
El modo octal ve los permisos como un número en notación octal y siempre asigna los permisos de forma absoluta:
El significado de los permisos rwx, cuando el objeto es un directorio, es el siguiente:
- r permite leer el contenido del directorio, es decir, leer la tabla de entradas del directorio formada por los nombres de los ficheros y los números-i de estos. Con este permiso podemos ver los nombres de los ficheros con el comando ls, pero no sus atributos con ls -l, necesitaríamos para esto otros permisos.
- w permite escribir en el directorio, es decir, crear, modificar y suprimir entradas dentro del directorio.
- x permite recorrer el directorio y utilizar la información de los objetos del directorio, es decir, podemos acceder a los nodos-i, por lo tanto, nos permitirá, junto con el permiso r, ejecutar el comando ls -l. Sin este permiso nunca podríamos poner el directorio en una ruta, pues se estaría prohibiendo su acceso.
Un directorio es un fichero que contiene información sobre otros ficheros en una relación de pertenencia. Esta información es básicamente una tabla de nombres de ficheros y su localización en el disco (número-i). Si pensamos que un directorio es un fichero que contiene su información con el siguiente formato:
podemos entender mejor cómo funcionan los tres permisos de los directorios.
El permiso de lectura nos permite ver el contenido del directorio; esto es justamente lo que hace la orden ls. El permiso de escritura permite a los programas realizar operaciones que alteran el fichero directorio. Borrar un fichero (rm), cambiar su nombre (mv) o crear uno nuevo, son operaciones que modifican el contenido del directorio y, por lo tanto, para realizarlas necesitamos permiso de escritura.
El permiso de ejecución de un directorio nos puede parecer un poco más extraño al principio. Se le suele llamar permiso de búsqueda, ya que nos permite buscar en el directorio el número de nodo índice que le corresponde al fichero, a partir de su nombre. Para ilustrar esto veamos cómo procede el sistema operativo GNU/Linux para abrir un fichero (cat /usr/ast/buzon):
Para que la orden cat se ejecute, necesita que el sistema le localice los bloques de datos del fichero /usr/ast/buzon. Para ello, en primer lugar, el sistema operativo busca usr en el directorio raíz con el fin de hallar el nodo índice del fichero /usr. A partir de este i-nodo, el sistema localiza el directorio /usr y busca el siguiente componente en él, ast. Cuando ha encontrado la entrada de ast, esta tiene el i-nodo del directorio /usr/ast. A partir de este i-nodo se puede leer el contenido del directorio y buscar buzon. Con este último i-nodo la orden cat puede acceder a los bloques de datos del fichero deseado. Este proceso de búsqueda lo podemos ver ilustrado a continuación:
Los ficheros especificados con una ruta relativa se buscan de la misma forma que se ha hecho anteriormente con una ruta absoluta, solo que comenzando desde el directorio de trabajo y no desde el directorio raíz. El sistema operativo siempre tiene en memoria desde el arranque el nodo-i del directorio raiz, y también el nodo-i del directorio de trabajo, que comienza siendo el nodo-i del directorio casa del usuario, y va cambiando con la ejecución del comando cd.
Todo directorio, como se ve en el ejemplo anterior, tiene dos entradas para los ficheros-directoiros . y .. que se crean a la vez que se crea el directorio. La entrada . tiene el número-i del directorio que lo contiene (enlace duro al directorio que lo contiene) y la entrada .. tiene el número-i del directorio padre (enlace duro al directorio padre). Por lo tanto, por ejemplo, cuando el sistema operativo necesita localizar al fichero ../fps/prog.c, lo primero que hace es buscar a .. en el directorio de trabajo, halla el número de i-nodo del directorio padre y rastrea ese directorio hasta encontrar fps donde encontrará a prog.c.
Es importante resaltar que los permisos de un fichero están condicionados por los permisos del directorio que lo contiene. Por ejemplo, aunque un fichero tenga los permisos rwxrwxrwx, los usuarios no podrán acceder a él a menos que tengan el permiso de búsqueda para el directorio en el que se encuentra el fichero. Así mismo, si un directorio tuviera permiso de escritura para algunos usuarios, estos podrían borrar ficheros del directorio aunque los ficheros tuvieran deshabilitado ese permiso. Por todo esto, suele ser habitual que por defecto a los ficheros se les asignen los permisos rw-r--r-- y a los directorios rwxr-xr-x.
Los permisos necesarios para ejecutar ciertas órdenes son:
Hay que hacer notar que los permisos de un fichero solo pueden ser cambiados por su propietario o por el superusuario.
Licencia: licencia de software libre GPL