Permisos y propietarios en la familia Unix

Estoy rescatando viejos apuntes y anotaciones debido a que estoy retomando la preparación para el examen para las certificaciones LPIC. Al respecto, algunos de estos pueden ser bastante útiles para personas de este foro, especialmente para los más principiantes que quieran aprender y profundizar en la técnica del sistema GNU/Linux.

Aquí pego el contenido de mis anotaciones sobre permisos y propietarios en Unix, que aplica también a los sistemas GNU/Linux, claro. Espero que a alguien le pueda servir.


Un fichero o archivo (file) es una colección de bytes agrupados bajo el mismo nombre y almacenados en el sistema de archivos. Se agrupan en directorios (directory), que no es más que la estructura lógica de catalogación, siendo tratado en Unix como un fichero especial. Se ordenan en jerarquía, y al tronco de directorios se le denomina árbol.
Las extensiones de los ficheros son una simple convención que determina un subnombre o cadena de caracteres anexa separada mediante un punto, que ayudan a diversos softwares y al humano a diferenciar entre distintos tipos de datos o contenido.

Para mantener esta jerarquía, el sistema se maneja mediante rutas (paths), que indican el árbol de directorios y el fichero objetivo separados por /. En función de si la ruta comienza en la raíz del sistema o desde un punto variable, hablamos de rutas absolutas (/home/ssh/fichero) o rutas relativas (../../ssh/fichero), respectivamente.
Algunos comodines referidos en las rutas son . (directorio actual), .. (directorio padre), ~ (directorio home del usuario actual).

Introducida la estructura lógica de ficheros y directorios, ahondamos en la simple pero poderosa estructura de permisos de Unix, que es uno de los pilares sobre el que descansa la seguridad en estos sistemas operativos; aplicándose a todo el sistema y a todo archivo, y construyendo un sistema robusto, fiable y estable en cuanto accesos y niveles de permisos, así como propietarios de cada archivo.

Así, 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 guión 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 indicará 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.

8 Me gusta

GNU no es Unix colega y por cierto esto y mucho más se enseña en el libro Introducción a la línea de comandos.

1 me gusta

aprovecha y hace marketing*

4 Me gusta

Yo leí el libro y aprendí mucho, ahora la línea de comandos es la primera herramienta que abro al iniciar GNU/Linux, es increíble lo poderosa que es.