Los permisos de cada fichero son la protección más básica de estos
objetos del sistema operativo; definen quién puede acceder a cada uno de
ellos, y de qué forma puede hacerlo. Cuando hacemos un listado largo de
ciertos archivos podemos ver sus permisos junto al tipo de fichero
correspondiente, en la primera columna de cada línea:
anita:~# ls -l /sbin/rc0
-rwxr--r-- 3 root sys 2689 Dec 1 1998 /sbin/rc0
anita:~#
En este caso vemos que el archivo listado es un fichero plano (el primer
carácter es un `-') y sus permisos son `rwxr-r-'. >Cómo
interpretar estos caracteres? Los permisos se dividen en tres ternas en
función de a qué usuarios afectan; cada una de ellas indica la existencia o
la ausencia de permiso para leer, escribir o ejecutar el fichero: una r
indica un permiso de lectura, una w de escritura, una x de
ejecución y un `-' indica que el permiso correspondiente no está
activado. Así, si en una de las ternas tenemos los caracteres rwx,
el usuario o usuarios afectados por esa terna tiene o tienen permisos para
realizar cualquier operación sobre el fichero. >De qué usuarios se trata en
cada caso? La primera terna afecta al propietario del fichero, la segunda al
grupo del propietario cuando lo creó (recordemos un mismo usuario puede
pertenecer a varios grupos) y la tercera al resto de usuarios. De esta forma,
volviendo al ejemplo anterior, tenemos los permisos mostrados en la figura
4.1.
Figura 4.1:
Permisos de un fichero
|
Cuando un usuario5.3 intenta acceder en algún modo a un archivo, el
sistema comprueba qué terna de permisos es la aplicable y se basa
únicamente en ella para conceder o denegar el acceso; así, si un usuario
es el propietario del fichero sólo se comprueban permisos de la primera terna;
si no, se pasa a la segunda y se aplica en caso de que los grupos coincidan, y
de no ser así se aplican los permisos de la última terna. De esta forma
es posible tener situaciones tan curiosas como la de un usuario que no tenga
ningún permiso sobre uno de sus archivos, y en cambio que el resto de usuarios
del sistema pueda leerlo, ejecutarlo o incluso borrarlo; obviamente, esto no
es lo habitual, y de suceder el propietario siempre podrá restaurar los
permisos a un valor adecuado.
El propietario y el grupo de un fichero se pueden modificar con las órdenes
chown y chgrp respectivamente; ambas reciben como parámetros al
menos el nombre de usuario o grupo (los nombres válidos de usuario
son los que poseen una entrada en /etc/passwd mientras que los grupos
válidos se leen de /etc/group) al que vamos a otorgar la posesión
del fichero, así como el nombre de archivo a modificar:
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 root other 799 Feb 8 19:47 /tmp/fichero
anita:~# chown toni /tmp/fichero
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 toni other 799 Feb 8 19:47 /tmp/fichero
anita:~# chgrp staff /tmp/fichero
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 toni staff 799 Feb 8 19:47 /tmp/fichero
anita:~#
En muchas variantes de Unix es posible cambiar a la vez el propietario y el
grupo de un fichero mediante chown, separando ambos mediante un carácter
especial, generalmente `:' o `.':
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 root other 799 Feb 8 19:47 /tmp/fichero
anita:~# chown toni:staff /tmp/fichero
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 toni staff 799 Feb 8 19:47 /tmp/fichero
anita:~#
Como vemos, ninguna de estas órdenes altera el campo de permisos5.4; para modificar los permisos de un archivo
se utiliza la orden chmod. Este comando generalmente recibe como
parámetro el permiso en octal que queremos asignar a cierto fichero, así
como el nombre del mismo:
anita:~# ls -l /tmp/fichero
-rw-r--r-- 1 root staff 799 Feb 8 19:47 /tmp/fichero
anita:~# chmod 755 /tmp/fichero
anita:~# ls -l /tmp/fichero
-rwxr-xr-x 1 root staff 799 Feb 8 19:47 /tmp/fichero
anita:~#
>Cómo podemos obtener el número en octal a partir de una terna de permisos
determinada, y viceversa? Evidentemente no podemos entrar aquí a tratar
todas las características de este sistema de numeración, pero vamos a
proporcionar unas ideas básicas. Imaginemos que tenemos un fichero con unos
determinados permisos de los que queremos calcular su equivalente octal, o que
conocemos los permisos a asignar pero no su equivalente numérico; por
ejemplo, necesitamos asignar a un fichero la terna rw-r--wx, que en la
práctica no tiene mucho sentido pero que a nosotros nos sirve de ejemplo.
Lo primero que debemos hacer a partir de estos bits rwx es calcular su
equivalente binario, para lo que asignamos el valor `1' si un determinado
permiso está activo (es decir, si aparece una r, w o x en
él) y un `0' si no lo está (aparece un `-'); así, el
equivalente binario de la terna propuesta es 110100011. Ahora simplemente
hemos de pasar el número del sistema binario al octal: lo dividimos en
grupos de tres elementos (110 100 011) y de cada uno de ellos calculamos
su equivalente octal:
Ya tenemos los tres números de nuestra terna de permisos, o lo que es lo
mismo, la representación octal de los bits iniciales: 643. Por tanto, si
necesitamos asignar esta terna a un cierto fichero, simplemente hemos de
ejecutar la orden chmod indicándole este número y el nombre del
archivo:
anita:~# chmod 643 /tmp/fichero
anita:~# ls -l /tmp/fichero
-rw-r---wx 1 root root 799 Feb 8 19:47 /tmp/fichero*
anita:~#
La forma de trabajar de chmod comentada requiere que se indique
explícitamente el valor octal de los bits rwx que queremos otorgar
a un fichero; sin importar el valor de las ternas que poseía antes de
ejecutar la orden, estamos asignando a los permisos del archivo el nuevo valor
valor indicado en la línea de comandos. Existe otra forma de trabajo de
chmod denominada `simbólica' en la que no necesitamos indicar el valor
octal de todos los bits, sino que especificamos únicamente parámetros
para los valores de los permisos que el archivo posee y deseamos modificar. En
lugar de utilizar el equivalente octal, utilizamos símbolos (de ahí
el nombre de esta forma de trabajo) que representan la activación o
desactivación de ciertos bits en cada una de las tres ternas; la sintaxis
básica5.5 de chmod en este caso es la siguiente:
chmod ugoa{+,-}{rwxst} fichero
Podemos ver que el valor simbólico comienza por cero o más letras que
indican sobre que terna de los permisos se van a realizar los cambios (u
para propietario del fichero, g para grupo, o para resto de
usuarios y a para las tres ternas; si no se especifica ninguna letra, se
asume a). A ellas les sigue un signo `+' o `-' en función
de si deseamos activar o resetar el bit sobre el que trabajamos, parámetro
indicado por el último conjunto formado por una o más letras, r para
el permiso de lectura, w para escritura, x para ejecución, s
para SUID o SGID y t para bit de permanencia (el significado
de estos dos últimos se explicará en el punto siguiente). Entre los tres
campos del valor simbólico no se insertan espacios:
anita:~# ls -l /tmp/fichero
-r-------- 1 root other 902 Feb 9 05:05 /tmp/fichero
anita:~# chmod +x /tmp/fichero
anita:~# ls -l /tmp/fichero
-r-x--x--x 1 root other 902 Feb 9 05:05 /tmp/fichero
anita:~# chmod og-x /tmp/fichero
anita:~# ls -l /tmp/fichero
-r-x------ 1 root other 902 Feb 9 05:05 /tmp/fichero
anita:~# chmod ug+rwx /tmp/fichero
anita:~# ls -l /tmp/fichero
-rwxrwx--- 1 root other 902 Feb 9 05:05 /tmp/fichero
anita:~#
Esta forma de trabajo simbólica es menos utilizada en la práctica que la
forma octal, pero en ciertas situaciones es muy útil, por ejemplo si deseamos
activar todos los permisos de ejecución de un archivo o si queremos setuidarlo: un simple chmod +x o chmod u+s es suficiente en estos
casos, y evitamos preocuparnos por si modificamos el resto de permisos.
Quizás después de ver el procedimiento de modificación de los permisos
de un fichero, este puede parecer demasiado
complicado y arcaico para un sistema operativo moderno; a fin de
cuentas, mucha gente prefiere gestores gráficos de permisos - igual que
prefiere gestores gráficos para otras tareas de administración -, programas
que dan todo hecho y no obligan al administrador a `complicarse', llenos de
menús desplegables y diálogos que una y otra vez preguntan si realmente
deseamos modificar cierto permiso (>Está usted seguro? >Realmente
seguro? >Es mayor de edad? >Me lo jura?). Incluso esas personas aseguran que
el procedimiento gráfico es mucho más claro y más potente que el que
Unix ofrece en modo texto. Nada más lejos de la realidad; por un lado,
aunque todo el mundo reconoce que la explicación detallada de cómo funcionan
los permisos de ficheros es algo farragosa, en la práctica el convertir una
terna de bits rwx a octal o viceversa es una tarea trivial, algo que
ningún
administrador con unas cuantas horas de práctica ni siquiera necesita pensar.
Por otro, algo más importante que la facilidad o dificultad de
modificar los permisos: su robustez; hemos de pensar que este modelo de
protección está vigente desde hace casi treinta años y no ha cambiado
absolutamente nada. Si en todo este tiempo no se ha modificado el
mecanismo, obviamente es porque siempre ha funcionado - y lo sigue haciendo -
bien.
© 2002 Antonio Villalón Huerta