De la heredad de permisos y propietarios de Unix

Este es un fragmento de una publicación que lancé allá por abril de 2016 en mi viejo blog.


¿Acaso aún no has comprendido que un fichero es una colección de bytes agrupados bajo un mismo nombre? ¿acaso todavía desconoces que se agrupan en directorios, estructura lógica de catalogación?

¿no sabes que en Unix todo es un fichero? ¿que un directorio es un fichero especial? ¿recuerdas que las extensiones de los ficheros son simples consensos y convenciones de los hombres?

Recuerda, iniciado, que para mantener la jerarquía el sistema se ordena en rutas, árboles de ficheros, bosques lógicos. Rutas absolutas (/home/francesdavallon/fichero) y rutas relativas (../../francesdavallon/fichero). Recuerda los comodines referidos en las rutas, recuerda el directorio actual (.), el directorio padre (..) y el directorio «home» (~).

Recuerda estos hechos fundamentales del sistema operativo, aprendiz, o no comprenderás la estructura de permisos, pilar sobre el que descansa la seguridad del sistema operativo. Los permisos son una estructura de ley: se aplica a todo el sistema, y a todo archivo. Ley jurídica que construye un sistema robusto, fiable y estable. Con control de acceso y niveles de permisos y propietarios.

Estos son los permisos asociados a un archivo:

  • Lectura (read - r): un usuario con permiso de lectura sobre un fichero podrá ver su contenido. Si fuera un directorio, el usuario con permiso de lectura podrá listar el contenido del mismo. Esto no quiere decir poder ver el contenido de cada fichero, para ello necesitará el permiso sobre dicho fichero.
  • Escritura (write - w): un usuario con permiso de escritura podrá editar, añadir o eliminar el contenido de un fichero. Un usuario con permiso de escritura sobre un directorio podrá crear, eliminar o mover archivos del mismo.
  • Ejecución (execute - x): un usuario que intente ejecutar un programa deberá tener el permiso de ejecución.

Según los métodos de visualización, dividimos los permisos de un fichero o directorio en 3 grupos de rwx (lectura, escritura y ejecución). En caso de haber un guion en lugar de la letra representativa del permiso, no existirá tal permiso.

  • El primer grupo rwx indica los permisos que tiene el usuario propietario.
  • El segundo grupo rwx indica los permisos que tienen los usuarios que pertenecen al grupo propietario.
  • El tercer grupo rwx indica los permisos que tienen el resto de usuarios.

El primer carácter indica el tipo de archivo, como indicación al usuario, que se catalogan en:

  • Regular files: -
  • Directory files: d
  • Block file: b
  • Character device file: c
  • Named pipe file or just a pipe file: p
  • Symbolic link file: l
  • Socket file: s

Método de manipulación de permisos: modo octal

Los permisos rwx son representaciones de un valor binario, que determina con 1 que existe dicho permiso y con 0 que no existe. Entonces, cada trío de permisos tendría un valor binario como: rwx = 111, r-x = 101, r-- = 100. El trío binario traducido a octal nos devuelve un valor entre 0 y 7.

rwx => 111 binary => digit 7 because r is 4, w is 2 and x is 1, so  4+2+1=7
r-x => 101 binary => digit 5 because r is 4 and x is 1 so           4+0+1=5
-wx => 011 binary => digit 3 because w is 2 and x is 1 so           0+2+1=3
--- => 000 binary => digit 0 because no permissions are set so      0+0+0=0

7 = binary 111 = rwx
6 = binary 110 = rw-
5 = binary 101 = r-x
4 = binary 100 = r--
3 = binary 011 = -wx
2 = binary 010 = -w-
1 = binary 001 = --x
0 = binary 000 = ---    

De tal forma que es posible indicar con sólo 3 dígitos octales los permisos de un fichero o directorio.

rwxr-x-wx   is  rwx|r-x|-wx     is  111|101|011     ==> 753
---r----x   is  ---|r--|--x     is  000|100|001     ==> 041
---------   is  ---|---|---     is  000|000|000     ==> 000
rwxrwxrwx   is  rwx|rwx|rwx     is  111|111|111     ==> 777   

Usamos la herramienta chmod:

# Asigna únicamente permisos de ejecución al fichero
$ chmod 111 nombre_del_fichero

# Asigna todos los permisos para el usuario, únicamente ejecución para el grupo y ninguno para el resto
$ chmod 710 nombre_del_fichero

# Asigna todos los permisos para el usuario, únicamente lectura para el grupo y ejecución y escritura para el resto
$ chmod 743 nombre_del_fichero            

Método de manipulación de permisos: modo simbólico

Utiliza operadores para modificar (asignar o desasignar) los diferentes modos de los permisos. Existen 3 operadores: + (añade un modo), - (elimina un modo) y = (especifica un modo). Los usuarios son representados mediante: u (user, primer grupo rwx), g (group, segundo grupo rwx), o (others, tercer grupo rwx), a (all, todos los grupos rwx).

Usamos la herramienta chmod:

# Añade todos los permisos de ejecución al fichero
$ chmod +x nombre_del_fichero 

# Elimina todos los permisos de escritura al fichero
$ chmod -w nombre_del_fichero 

# Elimina permisos de lectura a otros
$ chmod o-r nombre_del_fichero

# Únicamente deja permisos de ejecución
$ chmod =x nombre_del_fichero

# Añade todos los permisos al usuario pero vacía el resto, dejando únicamente permiso de ejecución para otros
$ chmod u+rwx,g-rwx,o=x nombre_del_fichero  

Esto son sólo 5 ejemplos del uso de chmod en este modo, podemos realizar todas las combinaciones que necesitemos.

Método de cambio de propietario

Lo más esencial antes de iniciar la manipulación de permisos es gestionar el cambio de propietarios. Como ya se ha adelantado, un fichero tiene un usuario propietario y un grupo propietario. Generalmente por defecto es el creador de dicho fichero o directorio.

Usamos la herramienta chown:

# Cambiamos el propietario del fichero a root
$ chown root nombre_del_fichero

# Cambiamos el propietario a juan y el grupo a administradores
$ chown juan:administradores nombre_del_fichero

# Cambiamos sólo el grupo propietario a controladores
$ chown :controladores nombre_del_fichero    

Permisos de bits especiales

Fuera del predominio de rwx, pueden existir otros permisos especiales asignables a archivos y directorios en el sistema de archivos. Se referencia a estos permisos especiales como un dígito adicional agregado al comienzo del modo.

Los siguientes bits especiales están disponibles para el uso del sistema de archivos de Linux:

  • SUID: el permiso "Set User Id" permite a los usuarios ejecutar un programa como si fueran el usuario propietario del programa, siendo en la mayoría de los casos root. El valor numérico de este conjunto de permisos es 4XXX, donde XXX corresponde a los valores rwx.
  • SGID: "Set Group Id", similar al anterior pero otorga automáticamente la propiedad de grupo. El valor numérico de este conjunto de permisos es 2XXX, donde XXX corresponde a los valores rwx.
  • Pedazo pegajoso: este conjunto de permisos se usa para evitar que los «no propietarios» eliminen archivos en un directorio común (numérico = 1XXX). En un directorio de bits adhesivos, solo el propietario del archivo o el propietario del directorio puede eliminar el archivo (la raíz siempre puede eliminar archivos también).
$ chmod 4755 ejemplo
$ ls -l ejemplo

-rwsr-xr-x 1 root root 5747 Apr 25 01:45 ejemplo    

Enmascaramiento de permisos

umask (abreviatura de user mask, máscara de usuario) es una orden y una función en entornos POSIX que establece los permisos por defecto para los nuevos archivos y directorios creados por el proceso actual. por defecto, los directorios tienen una base octal de 777 (111 111 111)(rwx rwx rwx) mientras que los ficheros de 666 (110 110 110)(rw- rw- rw-). La razón por la que los ficheros carecen de permisos de ejecución es sencilla, por seguridad, no conviene que le demos este permiso a todo archivo nuevo. Partiendo de esta base, la operación para determinar los permisos de creación de nuevos archivos y directorios es la resta del valor dado por umask al permiso base:

# Directory
base    777     111 111 111     rwxrwxrwx
umask   022     000 010 010     ----w--w-
result  755     111 101 101     rwxr-xr-x

# File
base    666     110 110 110     rw-rw-rw-
umask   022     000 010 010     ----w--w-
result  644     110 100 100     rw-r--r--   

Para corroborar la umask que estamos utilizando en este preciso momento, simplemente deberemos lanzar el comando umask, que te devolverá el valor.

$ umask
0022

Para personalizar la máscara tenemos 3 opciones. La primera de ellas consiste en cambiar la máscara en la sesión que tenemos, siendo un cambio temporal.

$ umask 066  

Si queremos hacer permanente el cambio, la segunda de ellas consiste en modificar la umask en .bashrc, por lo que afectaría al usuario en cuestión.

$ echo "umask 022" >> ~/.bashrc

Y la tercera opción consiste en editar el fichero de configuración /etc/profile, afectando a todos los usuarios.

# echo "umask 022" >> /etc/profile

Cabe destacar que si que, el sistema (/etc/profile) tiene una máscara de -por ejemplo- 026 y el usuario (.bashrc) de 002 la prioridad del usuario siempre será la de su configuración propia. De hecho su funcionamiento es el siguiente: el usuario busca en su fichero de configuración la línea umask, en caso de no haber busca en el sistema. Por lo que en el caso de no configurar umask en el usuario, la configuración del mismo será la del sistema.


You'll only receive email when they publish something new.

More from Bernardo de Borgoña
All posts