Páginas

domingo, 20 de junio de 2010

Permisos de acceso


El papel de un sistema operativo es también el de asegurar la integridad y el acceso a los datos. Esto es posible gracias a un sistema de permisos. A cada fichero o directorio se le asignan unos privilegios que le son propios, así como autorizaciones de acceso individuales. En el momento de intentar el acceso, el sistema comprueba si está autorizado.

Cuando el administrador crea un usuario, le asigna un UID (User Identification) único. Los usuarios quedan definidos en el fichero /etc/passwd. Cada usuario es integrado en, al menos, un grupo, que será su grupo primario. Todos éstos tienen un identificador único, el GID (Group Identification) definidos en el fichero /etc/group.

obtener esta información es posible con el comando id. A nivel interno, el sistema trabaja únicamente con los UID y GID.

gentoo@hypatia ~ $ id
uid=1000(gentoo) gid=100(users) grupos=100(users),18(audio),19(cdrom),27(video),85(usb),250(portage),1002(plugdev)

Se asocian un UID y un GID a cada fichero (inodo) que define su propietario y su grupo con privilegios. Usted asigna permisos al propietario, al grupo con privilegios y al resto de la gente. Se distinguen tres casos:

UID del usuario idéntico al UID definido para el fichero. Este usuario es propietario del fichero.
   
Los UID son diferentes: el sistema comprueba si el GID del usuario es idéntico al GID del fichero. Si es el caso, el usuario pertenece al grupo con privilegios del fichero.

En los otros casos (ninguna correspondencia): se trata del resto de la gente (others), ni es el propietario, ni un miembro del grupo con privilegios.   

drwxr-xr-x 10 gentoo users 4096 jun 13 7:32 tutoriales

En esta línea de la tabla, el directorio tutoriales pertenece al usuario gentoo y grupo users con los permisos rwxr-xr-x.

Fichero normal


r - Se puede leer el contenido, cargarlo en memoria, listarlo y copiarlo.

w - Se puede modificar el contenido del fichero. Se puede escribir dentro. Modificar el contenido no significa poder eliminar el fichero (ver permisos en directorio).

x - Se puede ejecutar el fichero desde la línea de comandos si se trata de un programa binario (compilado) o de un script (shell, perl...).

Directorio

r - Se pueden listar (leer) los elementos del directorio (catálogo). Sin esta autorización, ls y los criterios de filtro en el directorio y su contenido no serían posibles. No obstante, puede seguir accediendo a un fichero si conoce su ruta de acceso.

w - Se pueden modificar los elementos del directorio (catálogo), y es posible crear, volver a nombrar y suprimir ficheros en este directorio. Es este permiso el que controla el permiso de eliminación de un fichero.

x - Se puede acceder al catálogo por CD y se puede listar. Sin esta autorización, es imposible acceder al directorio y actuar en su contenido, que pasa a estar cerrado.

Por ejemplo, para un fichero:

rwxr-xr--

Permisos para el propietario de lectura, escritura y ejecución.
Permiso para los miembros del grupo de lectura y ejecución.
Permisos para el resto del mundo de lectura únicamente.

Modificar permisos

Cuando se crea, un fichero o un directorio dispone de permisos por defecto. El comando chmod (change mode) se utiliza para modificar los permisos en un fichero o un directorio. Existen dos métodos para modificar estos derechos: mediante símbolos o mediante un sistema octal de representación de permisos. Sólo el propietario de un fichero y el administrador del sistema puede modificar sus permisos. El parámetro -R cambia los permisos de manera recursiva.

La sintaxis es la siguiente:

chmod modificaciones file3 file2...

Para modificar los permisos del propietario, utilice el carácter u; para los permisos del grupo con permisos, el carácter g; para el resto, el carácter o, y para todos, el carácter a.

Para añadir permisos, se utiliza el carácter +; para retirarlos, el carácter -, y para no tener en cuenta los parámetros anteriores, el carácter =.

Finalmente, ponga el permiso cuyos símbolos son: r, w o x.

Puede separar las modificaciones con comas y acumular varios permisos en un mismo comando.

Si quiere suprimir todos los derechos, no especifique nada después del signo =:


gentoo@hypatia ~ $ ls -l chapter6-config
-rw-r--rwx 1 gentoo users 3257 jun 12 23:48 chapter6-config

gentoo@hypatia ~ $ chmod o= chapter6-config
gentoo@hypatia ~ $ ls -l chapter6-config
-rw-r----- 1 gentoo users 3257 jun 12 23:48 chapter6-config

Sistema octal

  r =  4
  w = 2
  x = 1

Para obtener el permiso final, basta sumar los valores. Por ejemplo, si quiere rwxrw-rw-, entonces obtiene 400+200+100+40+10+4+1=755, y para rw-r--r-- 400+200+40+4=644.

La modificación octal de los permisos no permite modificar un solo derecho. Es la totalidad de los permisos lo que se ha modificado de una sola vez.

Máscara de permisos


En el momento de la creación de un fichero o de un directorio, se les asigna unos permisos automáticamente. Suele ser rw-r--r-- (644) para un fichero y rwxr-xr-x (755) para un directorio. Una máscara de permisos controla estos valores. Se la puede modificar con el comando umask. El comando umask coge como parámetro un valor octal del cual cada permiso individual será suprimido de los derechos de acceso máximo del fichero o del directorio.

Por defecto, se crean todos los ficheros con los permisos 666 (rw-rw-rw-).
Por defecto, se crean todos los directorios con los permisos 777 (rwxrwxrwx).
Luego se aplica la máscara

La máscara es la misma para el conjunto de los ficheros.Una máscara no modifica los permisos de los ficheros existentes, sino solamente los de los ficheros creados a partir de este momento.

Los permisos por defecto (máximo) de los ficheros y de los directorios no son idénticos. Es lógico: como el permiso x permite entrar en un directorio, es normal que éste disponga de él por defecto. Este mismo permiso es inútil por defecto en los ficheros: sólo una pequeña minoría de los ficheros son scripts o binarios.

La máscara por defecto es 022, o sea ----w--w-. Para obtener este valor, inserte umask sin parámetro.

gentoo@hypatia ~ $ umask
0022

Como calcular la máscara

Para un fichero

Predeterminado  rw-rw-rw- (666)
Retirar         ----w--w- (022)
Resta           rw-r--r-- (644)

Para un directorio


Predeterminado  rwxrwxrwx (777)
Retirar         ----w--w- (022)
Resta           rwxr-xr-x (755)

Observe que aplicar una máscara no es sustraer, sino suprimir permisos de los establecidos por defecto, permiso a permiso. Por ejemplo:

Predeterminado  rw-rw-rw- (666)
Retirar         ----wxrwx (037)
Resta           rw-r----- (640)

Y no 629, lo que es imposible en sistema octal...

Cambiar de propietario y grupo

Es posible cambiar el propietario y el grupo de un fichero con la ayuda de los comandos chown (change owner) y chgrp (change group). El parámetro -R cambia la propiedad de manera recursiva.

chown usuario file1 file3...
chgrp grupo file1 file3...

Al especificar el nombre de usuario (o de grupo), el sistema comprueba primero su existencia. Usted puede especificar un UID o un GID. En este caso, el sistema no efectuará comprobación alguna.

Para los dos comandos, no se modifican los permisos anteriores ni la ubicación del fichero. Es posible modificar con un solo comando el propietario y el grupo a la vez.

chown usuario:grupo file1 file2...
chown usuario.grupo file1 file2...

Sólo root tiene el permiso de cambiar el propietario de un fichero. Pero un usuario puede cambiar el grupo de un fichero si forma parte del nuevo grupo.

gentoo@hypatia ~ $ chgrp video file1
gentoo@hypatia ~ $ ls -l file1
-rwxr-xr-x 1 gentoo video 0 mar 21 22:03 file1

SUID y SGID

Es posible establecer permisos de acceso especiales para ficheros ejecutables. Estos permisos de acceso extendidos aplicados a un comando permiten sustituir los permisos otrogados al usuario que lo inició por los permisos del propietario o del grupo de pertenencia del comando.

El ejemplo más sencillo es el programa passwd, que permite cambiar la contraseña. Si se ejecutara el comando con los permisos de un usuario clásico, passwd no podría abrir y modificar los ficheros /etc/passwd y /etc/shadow:

gentoo@hypatia ~ $ ls -l /etc/passwd
-rw-r--r-- 1 root root 1440 may 24 10:02 /etc/passwd

Puede observar que este fichero pertenece a root, y que sólo root puede escribir en él. Un usuario normal no puede leer su contenido sin interactuar. El comando passwd no debería, por lo tanto, poder modificar los ficheros. Vea los permisos del comando passwd (/bin/passwd o /usr/bin/passwd):

gentoo@hypatia ~ $ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root shadow 78208 jun 10:06 /usr/bin/passwd

Lleva asociado un nuevo permiso: s para los permisos del usuario root. Este nuevo atributo permite la ejecución del comando con permisos de acceso extendidos. Durante el tratamiento, se ejecuta el programa con los permisos del propietario del fichero o de su grupo de pertenencia. En el caso de passwd, se inicia con los permisos de root y no del usuario que lo lanzó.

El permiso s sobre el usuario se llama SUID-Bit (Set User ID Bit), y sobre el grupo, GUID-Bit (Set Group ID Bit).

El comando chmod permite ubicar SUID-Bit y GUID-Bit.

chmod u+s comando
chmod g+s comando

Los valores octales son 4000 para SUID-Bit y 2000 para GUID-Bit.

chmod 4755 comando
chmod 2755 comando

Sólo el propietario o el administrador puede activar esta propiedad. Posicionar SUID-bit o SGID-Bit tiene sentido únicamente si se han establecido los permisos de ejecución previamente (atributo x en el propietario o el grupo). Si éstos no están presentes; se sustituye la s por una S..

No se transmiten los SUID-Bit y SGID-bit a los hijos de un proceso. En este caso, se ejecutarán los hijos con los permisos del usuario que inició el comando básico, los UID reales.

Sticky bit

El sticky bit (bit pegajoso) permite asignar un criterio protector contra el borrado del contenido de un directorio. Imagine un directorio /tmp donde todos los usuarios tienen el permiso de leer y escribir ficheros.

gentoo@hypatia ~ $ ls -ld /tmp
drwxrwxrwx   6 root     system     16384 may 14 13:22 tmp

En este directorio todo el mundo puede suprimir ficheros, incluyendo los que no le pertenecen (derecho w presente en todas partes y para todos). Si el usuario gentoo crea un fichero, el usuario axel puede suprimirlo incluso aunque no le pertenezca.

El sticky bit aplicado a un directorio, impide esta operación.

gentoo@hypatia ~ $ chmod u+t /tmp
gentoo@hypatia ~ $ ls -ld /tmp
drwxrwxrwt 35 root root 77824 jun 21 12:30 /tmp

En octal, se utilizará el valor 1000 (chmod 1777 /tmp).

Aunque aplicado al usuario, el sticky bit, representado por una t, aparece en el grupo de permisos de others.

Permisos y directorio

Si usted da el permiso al grupo en un directorio, todos los ficheros creados dentro de este directorio serán del mismo grupo que este directorio, sea cual sea el grupo de la persona que crea este fichero.

gentoo@hypatia ~ $ mkdir dir
gentoo@hypatia ~ $ chmod 770 dir
gentoo@hypatia ~ $ ls -ld dir
drwxrwx--- 2 gentoo users 4096 jun 21 13:36 dir
gentoo@hypatia ~ $ chgrp video dir
gentoo@hypatia ~ $ chmod g+s dir
gentoo@hypatia ~ $ ls -ld dir
drwxrws--- 2 gentoo video 4096 jun 21 13:37 dir
gentoo@hypatia ~ $ cd dir
gentoo@hypatia ~ $ touch test
gentoo@hypatia ~ $ ls -l test
-rw-r--r-- 1 gentoo video 0 jun 21 13:37 test

Algunos ejercicios:

Supongamos un fichero del que es propietario llamado notas, ha retirado a los miembros del grupo y otros todos los permisos sobre él, y el directorio que lo contiene dispone del permiso w para los miembros del grupo. ¿Quién puede suprimir su fichero?

Usted y los miembros del grupo del directorio. El permiso de escritura en el directorio es el que autoriza a las personas a modificar su contenido.

Con chmod, ¿cuáles son los parámetros que se deben colocar para suprimir los permisos de escritura a los demás, dar el permiso de lectura y ejecución a los miembros del grupo y todos los permisos a usted?

u=rwx,g=rw,o-w.
Quiere crear un directorio donde todo el mundo pueda escribir ficheros, donde todos los ficheros tengan el mismo grupo, pero donde nadie pueda suprimir los ficheros de los demás. ¿Cuáles deben ser los derechos?

rwxrwsrwt, o sea, 3777 en octal.

Linux es genial