Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Guido Socher

Acerca del Autor: Ama Linux porque es un sistema libre y tambi�n porque considera muy divertido trabajar con gente de la comunidad linux de todo el mundo. Pasa el tiempo libre con su novia, escucha el servicio de radio BBC World, monta en bicicleta por el campo y le gusta jugar con el Linux.

Escribe al autor

Contenido:
Permisos b�sicos de acceso a ficheros
T-bits, SUID y SGID

Permisos de Acceso a Ficheros

[chmod 600]

Resumen: Este art�culo se divide en dos partes:



Permisos B�sicos de Acceso a Ficheros

Linux es un sistema multiusuario en el que los usuarios pueden asignar distintos permisos de acceso a sus ficheros. Cada usuario tiene un "user-Id" (Identificaci�n de usuario), un n�mero �nico que lo identifica. Los usuarios tambi�n pertenecen a uno o m�s grupos. Los grupos se pueden utilizar para restringir el acceso a un n�mero determinado de personas. Una buena caracter�stica para hacer mas f�cil el trabajo en equipo. Para comprobar tu "user-Id" y ver el grupo (o grupos) al que perteneces s�lo tienes que teclear el comando id:

>id
uid=550(alice)  gid=100(users)  groups=100(users),6(disk)

Se pueden establecer los permisos de acceso a un fichero para el propietario, grupo y otros seg�n indiquen los permisos de lectura (r), escritura (w) y ejecuci�n (x) (read, write y execute en ingl�s). Puedes utilizar el comando ls -l para ver estos permisos.

>ls -l   /usr/bin/id
-rwxr-xr-x    1 root   root    8632 May 9 1998 /usr/bin/id

El propietario del fichero /usr/bin/id es el usuario root y pertenece a un grupo llamado root. La parte:

 -rwxr-xr-x 

muestra los permisos de acceso al fichero. Este fichero es leible(r), escribible(w) y ejecutable(x) por el propietario. Para el grupo y todos los dem�s es leible(r) y ejecutable(x).

Puedes imaginarte los permisos como un vector de bits de 3 bits cada uno asignados al propietario, grupo y "otros". As� r-x corresponde a 101 como patr�n de bits � 4+1=5 en decimal. El bit "r" corresponde a 4 en decimal, el bit "w" a 2 en decimal y el bit "x" a 1 en decimal.

sst
421
(explicado
despu�s)
rwx
421
usuario
(propietario)
rwx
421
grupo
 
rwx
421
otros
 

Se puede utilizar el comando chmod para cambiar estos permisos. Por razones de seguridad, solamente root o el propietario del fichero pueden cambiar los permisos. Chmod acepta la representaci�n decimal de los permisos o una representaci�n simb�lica. La representaci�n simb�lica es [ugoa][+-][rwx]. Esto es: una de las letras u(usuario= propietario del fichero), g(grupo), o(otros), a(all= todos= "u", "g" y "o") seguido por + � - para a�adir o quitar permisos y luego la representaci�n simb�lica de los permisos en la forma de r(lectura) w(escritura) x(ejecuci�n). Para hacer el fichero "file.txt" escribible (w) por todos (a) tendr�s que teclear:

>chmod a+w   file.txt
o tambi�n
>chmod 666   file.txt
>ls -l   file.txt
-rw-rw-rw-   1 alice   users   79 Jan 1 16:14 file.txt

chmod 644 file.txt reestablecer�a los permisos "normales": escritura+lectura para el propietario y solo lectura para todos los dem�s.

Cambiar a un directorio (con el comando cd) equivale a ejecutar el directorio. Los permisos "Normales" para un directorio son por consiguiente 755 y no 644:

>chmod 755   mydir
>ls -ld   mydir
drwxr-xr-x    2 alice    users    1024 Dec 31 22:32 mydir

El comando umask define tus permisos por defecto. Los permisos por defecto se aplican cuando creamos nuevos ficheros (y directorios, etc ...). Toma como argumento aquellos bits, en representaci�n decimal, que NO queremos que sean activados.

umask 022 es, por ejemplo, una buena elecci�n. Con 022 todo el mundo puede leer tus ficheros y hacer "cd" en los directorios pero solo t� puedes modificar cosas. Para imprimir la asignaci�n actual de umask solo tienes que teclear umask sin argumentos.

Aqu� va un ejemplo de como se utilizan umask y chmod:

Establecemos umask a un valor estandard conveniente
>umask
22

Coje tu editor y cr�a un fichero llamado myscript:
>nedit   myscript   (o vi myscript ...)
Pon el siguiente c�digo en �l:

#!/bin/sh
#myscript
echo -n "hola "
whoami
echo "Este fichero ( $0 ) tiene los siguientes permisos:"
ls -l $0 | cut -f1 -d" "

Salva el script.
Ahora tiene los permisos en 644:
>ls -l  myscript
-rw-r--r--   1 alice  users  108 Jan 1 myscript

Para ejecutarlo debes hacerlo ejecutable:
>chmod 755 myscript
o tambi�n
>chmod a+x myscript

Ahora ejec�talo:
>./myscript

Date cuenta de que el script debe ser legible y ejecutable para poderlo ejecutar mientras que un binario compilado normal solo necesitar�a ser ejecutable. Esto sucede porque el script debe ser le�do por el interprete (el "shell"). Al ejecutar el script debemos obtener:

 
hola alice
Este fichero ( ./myscript ) tiene los siguientes permisos:
-rwxr-xr-x
	  

T-bit, SUID y SGID

Despu�s de haber trabajado durante un tiempo con Linux, probablemente descubres que hay mas sobre los permisos de ficheros que los bits "rwx". Cuando examines tu sistema de ficheros ver�s tambi�n "s" y "t":

>ls -ld /usr/bin/crontab  /usr/bin/passwd  /usr/sbin/sendmail  /tmp

drwxrwxrwt   5 root   root   1024 Jan 1 17:21 /tmp
-rwsr-xr-x   1 root   root   0328 May 6 1998 /usr/bin/crontab
-r-sr-xr-x   1 root   bin     5613 Apr 27 1998 /usr/bin/passwd
-rwsr-sr-x   1 root   mail   89524 Dec 3 22:18 /usr/sbin/sendmail

�Qu� son estos bits "s" y "t"?. La longitud del vector de los bits de permiso es en realidad de 4 * 3 bits. chmod 755 es solamente una abreviaci�n de chmod 0755.

El t-bit

El t-bit (a veces conocido como "sticky bit= bit pegajoso") es �til solo en combinaci�n con directorios. Se utiliza con el directorio /tmp como puedes ver mas arriba.

Normalmente (sin el t-bit activado en el directorio) los ficheros pueden ser borrados si el directorio que contiene los ficheros es escribible por la persona que borra los ficheros. De esta manera, si tienes un directorio en el que nadie puede depositar ficheros, entonces nadie podr� borrar tampoco los ficheros de nadie mas.

El t-bit cambia esta regla. Con el t-bit activado, solo el propietario del fichero o el propietario del directorio pueden borrar los ficheros. El t-bit puede ser activado con chmod a+tw o chmod 1777. Aqu� vemos un ejemplo:

Alice crea un directorio con el t-bit activado:
>mkdir mytmp
chmod 1777 mytmp


ahora Bob pone un fichero en �l:
>ls -al
drwxrwxrwt   3 alice    users  1024 Jan  1 20:30 ./
-rw-r--r--  1 bob   users     0 Jan  1 20:31 f.txt<

Este fichero puede ser borrado ahora por Alice (propietaria del directorio) y Bob (propietario del fichero) pero no puede ser borrado por Tux:

>whoami
tux
rm -f f.txt
rm: f.txt: Operation not permitted

S-bit activado en el usuario

Con procesos de Linux ejecutandose bajo un "user-ID". Esto les da acceso a todos los recursos (ficheros, etc...) a los que este usuario tendr�a acceso. Hay dos user-ID's. El user-ID real y el user-ID efectivo. El user-ID efectivo es el que determina el acceso a los ficheros. Salva el siguiente script con el nombre de idinfo y hazlo ejecutable (chmod 755 idinfo).


#!/bin/sh
#idinfo: Imprime informaci�n del usuario
echo " user-ID efectivo:"
id -un
echo " user-ID real:"
id -unr
echo " ID del grupo:"
id -gn

Cuando ejecutes el script ver�s que el proceso que lo ejecuta toma tu user-ID y tu group-ID:

 user-ID efectivo:
alice
 user-ID real:
alice
 ID del grupo:
users

Cuando Tux ejecuta tu programa "idinfo" obtiene una salida similar que muestra el proceso ejecut�ndose ahora bajo el ID de tux. La salida del programa depende s�lo del usuario que lo ejecuta y no del propietario del fichero.

Por razones de seguridad, el s-bit funciona s�lo cuando se usa con binarios (c�digo compilado) y no en scripts (una excepci�n son los scripts de Perl). Por lo tanto crearemos un programa en C que llamar� a nuestro programa idinfo:

/*suidtest.c*/
#include <stdio.h>
#include <unistd.h>
int main(){
/*Los programas seguros con SUID no deben fiarse
* de ninguna entrada de usuario o variable de entorno!! */

char *env[]={"PATH=/bin:/usr/bin",NULL};
char prog[]="/home/alice/idinfo";
if (access(prog,X_OK)){
    fprintf(stderr,"ERROR: %s no ejecutable\n",prog);
    exit(1);
}
printf("ejecutando ahora %s ...\n",prog);
execle(prog,(const char*)NULL,env);
perror("suidtest");

return(1);
}

Compila el programa con "gcc -o suidtest -Wall suidtest.c" y activa el s-bit para el propietario:

>chmod 4755   suidtest
o
>chmod u+s   suidtest

�Ejec�talo!, �Qu� ocurre?, �Nada?, �ejec�talo desde un usuario distinto!

El fichero suidtest pertenece a alice y tiene el s-bit activado donde la x normalmente es para el propietario del fichero. Esto provoca que el fichero se ejecute bajo el user-ID efectivo del usuario al que pertenece el fichero en lugar del user-ID del que lo ejecuta. Si Tux ejecuta el programa obtendremos lo siguiente:

>ls -l suidtest
-rwsr-xr-x   1 alice   users   4741 Jan 1 21:53 suidtest
>whoami
tux

ejecutando ahora /home/alice/idinfo ...
user-ID efectivo:
alice
user-ID real:
tux
ID del grupo:
users

Como puedes ver, esta es una caracter�stica muy potente, especialmente si el fichero con el s-bit activado pertenece a root. Cualquier usuario puede hacer entonces cosas que normalmente s�lo puede hacer root. Unas palabras sobre seguridad. Cuando escribas un programa SUID  debes asegurarte de que s�lo puede usarse para el prop�sito para el cual pretendas que s�a usado. Establece siempre el path (camino) a un valor absoluto. Nunca hagas que dependa de variables de entorno o de funciones que usen variables de entorno. Nunca te f�es de la entrada del usuario (ficheros de configuraci�n, argumentos en l�nea de comandos...). Comprueba la entrada de usuario byte por byte y comp�rala con valores que consideres v�lidos.

Cuando un programa SUID pertenece a root, podemos establecer el user-ID efectivo y el real (con la funcion setreuid()).

Los programas Set-UID son utilizados normalmente por "root" para dar a los usuarios normales acceso a cosas que, normalmente, solo "root" puede hacer. Como root puedes, por ejemplo, modificar suidtest.c para permitir a cualquier usuario que ejecute los scripts ppp-on/ppp-off en tu m�quina.

S-bit activado en el grupo

Los ficheros ejecutables que tienen el s-bit activado en el grupo ejecutado bajo el group-ID  del propietario del fichero. Es bastante similar al s-bit para el usuario en el p�rrafo anterior.

Cuando activamos el s-bit en el grupo para un directorio, se asigna tambi�n el grupo para cualquier fichero que sea creado en ese directorio. Alice pertenece a 2 grupos:

>id
uid=550(alice)  gid=100(users)  groups=100(users),6(disk)

Normalmente, los ficheros se cr�an para ella con el grupo asignado a "users". Pero si se crea un directorio con el grupo asignado a "disk" y el s-bit al grupo, entonces todos los ficheros que cr�e alicia tendr�n tambi�n el ID  del grupo "disk":

>chmod 2775 .
>ls -ld .
drwxrwsr-x  3 tux   disk     1024 Jan 1 23:02 .

Si alice crea ahora un fichero nuevo en este directorio, el grupo de ese directorio ser� "disk"

>touch newfile
>ls -l newfile
-rw-r--r--   1 alice    disk      0 Jan 1 23:02 newfile

Esto es interesante cuando quieres trabajar con varias personas en un equipo asegur�ndote de que los group-ID de los ficheros se establecen para el grupo correcto en el directorio de trabajo de ese equipo, especialmente en un entorno donde los usuarios tienen normalmente el umask a 027, lo cual hace los ficheros inaccesibles para la gente ajena al grupo.


Art�culo original en ingl�s. Traducido por Manuel Moreno

P�ginas web mantenidas por Miguel Angel Sep�lveda
© Guido Socher 1999
LinuxFocus 1999