De la heredad de permisos y propietarios de Unix

2 de abril de 2016 • fjbalon

La comprensión del fichero o archivo, file para los anglosajones, es fundamental para comprender la estructura y funcionamiento lógico de Unix. Un fichero es una colección de bytes agrupados bajo un mismo nombre, simple. En Unix, todo es un fichero; todo. Incluso un directorio es un fichero especial que agrupa otros ficheros, y estos a su vez se agrupan en otros directorios. Es la estructura lógica de catalogación.

Los directorios se ordenan en una jerarquía muy clara y concisa en Unix, y al tronco de estos directorios se les denomina árbol; por eso el inicio de todo es la raíz.

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.

Recuerda, iniciado, que 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/fjbalon/fichero) o rutas relativas (../../fjbalon/fichero), respectivamente. Algunos comodines referidos en las rutas son . (directorio actual), .. (directorio padre), $\sim$ (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:

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 caracter indicará el tipo de archivo, como indicación al usuario, que se catalogan en:

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:

chown root nombre_del_fichero # Cambiamos el propietario del fichero a root
chown juan:administradores nombre_del_fichero # Cambiamos el propietario a juan y el grupo a administradores
chown :controladores nombre_del_fichero # Cambiamos sólo el grupo propietario a controladores

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:

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.