Sistema clásico de permisos en GNU/Linux

La seguridad en el sistema de ficheros es fundamental en un sistema operativo multiusuario. En el sistema de permisos clásico de GNU/Linux cada fichero tiene un grupo de 9 permisos (bits) que controlan quien tienen acceso de lectura, escritura o ejecución de un fichero, más tres bits adicionales especiales conocidos como set-user-ID, ser-group-ID y sticky bit. Este grupo de 12 bits se implementa en el conjunto de propiedades del fichero y forman lo que se conoce como modo de acceso. Se almacenan separadamente por cada fichero junto otros 4 bit con la información del tipo de fichero formando parte del i-node del fichero.

Propiedad y permisos de los ficheros y directorios

Los permisos nos indican lo que los usuarios pueden hacer con un fichero. En el sistema clásico de permisos en GNU/Linux tenemos tres tipos de permisos:

  • Lectura (r): Indica que el usuario puede ver el contenido del fichero
  • Escritura (w): El usuario puede escribir en el fichero o borrarlo
  • Ejecución (x): Cuando el fichero es un programa, permite al usuario ejecutarlo

Cuando los permisos se asignan a directorios/carpetas el significado es el siguiente:

  • El permiso de lectura indica que podemos listar en contenido del directorio
  • El permiso de escritura permite añadir o borrar ficheros del directorio
  • El permiso de ejecución indica que podemos consultar la información de los ficheros del directorio

En este caso nos estamos centrando en los permisos de los ficheros y directorios, pero las reglas que se describen se pueden aplicar a todos los tipos de ficheros incluidos dispositivos, FIFOs o sockets UNIX

Así mismo el sistema de permisos divide el mundo en tres categorías:

  • Propietario (también conocido como usuario): Son los permisos que se garantizan al propietario del fichero
  • Grupo: Permisos que se asignan a los usuarios que son miembros del grupo
  • Otros: Los permisos que se asignan a todos los demás

Este sencillo modo de 3 permisos x 3 categorías nos da los 9 permisos básicos de GNU/Linux.

Como hemos comentado, adicionalmente tenemos 3 bit más conocidos como set-user-ID, set-group-ID y sticky:

  • set-user-ID (SUID):

Ficheros: Este permiso se puede asignar a ficheros ejecutables. De forma general, si un usuario lanza una aplicación, el proceso resultante se ejecuta con los permisos del usuario que la lanzó. Cuando este bit esta activo, el proceso se ejecuta con los permisos del propietario del fichero, independientemente de quien lance la aplicación. Habitualmente el propietario del fichero es root y de esta forma permite a cualquier usuario ejecutar una aplicación con permisos de superusuario. Esto es necesario, por ejemplo cuando un usuario quiere cambiar su contraseña y ejecuta la aplicación passwd. Esta aplicación debe acceder a un fichero con permisos de escritura solo para el usuario root, por tanto solo root puede realizar esos cambios. Al tener habilitado el bit set-user-ID en passwd, permite a cualquier usuario lanzar la aplicación con permisos root para que pueda realizar el cambio en su nombre.

Directorios: No tienen ningún efecto.

  • set-group-ID (SGID):

Ficheros: Funciona de forma similar para ficheros ejecutables, ejecutando el proceso con los permisos del grupo al que pertenece el fichero.

Directorios: Aplicado a directorios hace que los ficheros nuevos que se creen sean propiedad del mismo grupo que el directorio en sí. Por ejemplo el directorio /home/recursos tiene como grupo recursos y tienen set-group-ID habilitado. Todos los ficheros que se creen en /home/recursos serán creados propiedad del grupo recursos independientemente de quien los cree.

El uso de set-user-ID y set-group-ID puede dar lugar a agujeros de seguridad permitiendo accesos no autorizados. Su uso debe restringirse al máximo

  • Sticky:

Ficheros: Este bit aplicado a ejecutables esta actualmente obsoleto y es ignorado por el sistema. (Originariamente indicaba al sistema que mantuviera una imagen del programa en memoria después de que el programa finalizase, con el fin de mejorar el rendimiento).

Directorios: Si el sticky bit esta aplicado a un directorios, el sistema de ficheros no permite borrar o renombrar los ficheros a menos que seas el propietario del directorio, el propietario del fichero o el superusuario (root).

Podemos ver de forma gráfica la representación de permisos en una cadena de 12 bit y su representación simbólica (rwx) así como su equivalente en modo absoluto octal (base 8) que veremos resulta muy útil a la hora de trabajar con permisos:

Permisos en GNU/Linux representación simbólica y absoluta

Cuando trabajemos con permisos utilizaremos dos formas para representar los 12 bits que los contienen: la representación simbólica rwx, (r) para lectura, (w) para escritura y (x) para ejecución, para cada una de las categorías: propietario, grupo y otros. La otra forma de representar los permisos es el modo absoluto. Se representa por un número octal (base 8) que podemos obtener fácilmente como vemos en la imagen, y es una forma muy rápida de asignar permisos.

Por tanto para obtener el número octal solo tenemos que sumar el valor octal correspondiente de todos los permisos asignados. También se pueden ver en la tabla siguiente que incluye además las constantes definidas en <sys/stat.h> necesarias para trabajar con las funciones que gestionan los permisos en ficheros:

Constante Valor octal Bit de permiso
S_ISUID 04000 Set-user-ID
S_ISGID 02000 Set-group-ID
S_ISVTX 01000 Sticky
S_IRUSR 00400 Usuario-Lectura
S_IWUSR 00200 Usuario-Escritura
S_IXUSR 00100 Usuario-Ejecución
S_IRGRP 00040 Grupo-Lectura
S_IWGRP 00020 Grupo-Escritura
S_IXGRP 00010 Grupo-Ejecución
S_IROTH 00004 Otros-Lectura
S_IWOTH 00002 Otros-Escritura
S_IXOTH 00001 Otros-Ejecución

Trabajando con permisos

Vamos a ver lo primero como nos muestra el sistema los permisos desde una consola con el comando ls:

Permisos mostrados por ls

El primer campo es el tipo de fichero. En este caso es un fichero regular (-). Podemos encontrar los siguientes tipos de fichero:

Constante Test macro Símbolo en ls Tipo de fichero
S_IFREG S_ISREG() - Fichero regular
S_IFDIR S_ISDIR() d Directorio
S_IFCHR S_ISCHR() c Dispositivo de caracteres
S_IFBLK S_ISCHR() b Dispositivo de bloques
S_IFIFO S_ISFIFO() p Named pipe (tubería con nombre)
S_IFSOCK S_IFSOCK() s Socket
S_IFLNK S_ISSOCK() l Symbolic Link (enlace simbólico)

Los siguientes tres caracteres nos indican los permisos del usuario (propietario) del fichero: (r) para lectura, (w) para escritra y (x) para ejecución, que mostrará en el caso de estar asignado el permiso correspondiente. El segundo bloque de tres caracteres son los permisos asignados al grupo, y los tres últimos a otros. Se pueden producir las siguientes variaciones:

  • En el caso de que el bit set-userID este asignado la (x) que representa que el propietario puede ejecutar el fichero se remplaza por una (s).
  • Si el bit set-groupID esta asignado, la (x) de los permisos del grupo se cambia por una (s).
  • En el caso de que el bit stick este asignado, el último carácter de los permisos de otros (x) será (t).
  • Si alguno de los bit set-userID, set-groupID o stick están seleccionados pero el fichero no esta marcado como ejecutable, los bit se mostrarán como (S) o (T).

 

Conclusión

Hemos visto la forma clásica de permisos y propiedades de los ficheros y carpetas en GNU/Linux y la forma de trabajar con ellos usando los comandos del sistema. Aunque el sistema funciona bien es poco granular y si trabajamos frecuentemente con servidores de ficheros, pronto nos daremos cuenta de ciertas carencias. Por ejemplo, no permite asignar varios grupos a un fichero o directorio con distintos permisos y usuarios. Con el fin de complementar estos permisos se añadieron ciertos atributos extendidos así como el uso de listas de control de acceso ACL (access control list). Pero esto será tratado en una próxima entrada.

 

Modificado por última vez enViernes, 14 Agosto 2020 19:53
(0 votos)
Etiquetado como :

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.