Administrar permisos desde la terminal de Ubuntu

Publicado por P. Ruiz en

En Ubuntu, y en general en todos los sistemas derivados de Unix, los permisos representan un mecanismo de protección para el propio sistema operativo y para los archivos de los usuarios. Sobre todo, debemos tener en cuenta que estos sistemas están pensados para ser utilizados por diferentes usuarios al mismo tiempo y la protección de los datos particulares de cada usuario debe ser un objetivo primordial.

En definitiva, los permisos nos van a permitir controlar quién puede ver, modificar o ejecutar un archivo o directorio en Ubuntu. Y esto es crucial por diferentes motivos:

  • Por seguridad, ya que evitan que usuarios no autorizados accedan o modifiquen archivos importantes. Por ejemplo, así evitamos que un usuario normal pueda cambiar archivos críticos del sistema y dañar su funcionamiento.

  • Por privacidad, ya que protegen información sensible, evitando que cualquier usuario pueda consultarla.

  • Por Orden y Control: En un entorno de trabajo, los permisos ayudan a mantener los archivos organizados y accesibles solo para quienes deben trabajar con ellos. No todos los usuarios necesitan acceso a todos los documentos.

Por todo esto, es importante que aprendamos a interpretar los permisos y administrarlos para que se ajusten a las necesidades específicas de cada momento..

Comprobar los permisos de uno o varios archivos

Una forma básica para saber los permisos que se aplican a uno o varios archivos es el comando ls. Este comando de GNU/Linux está especializado en ofrecernos información relativa a uno o varios archivos. De forma predeterminada realizará su trabajo dentro del directorio actual y mostrará el resultado ordenado alfabéticamente por nombre de archivo.

De forma predeterminada, mostrará una salida compacta formada únicamente por los nombres de los archivos o directorios que encuentre. Sin embargo, solo con utilizar el argumento -l, obtendremos bastantes más detalles. Por lo tanto, será esta la sintaxis que utilicemos:

ls -l

Para un mayor detalle sobre el comando ls, puedes consultar su página del manual, por ejemplo, en el siguiente enlace: https://manpages.ubuntu.com/manpages/xenial/en/man1/ls.1.html

La salida del comando será como en la imagen

Administrar-permisos-desde-la-terminal-de-Ubuntu-001

Analicemos la salida del comando:

  • La primera columna está formada por 10 caracteres e indica el tipo de archivo sus permisos.

    El primer carácter es el tipo de archivo y puede ser un guión (‘-‘) para los archivos normales, una letra ‘d’ para los directorios o una ‘l’ para los enlaces simbólicos, entre otros.

    Los otros nueve caracteres son los permisos y los explicaremos en detalle más abajo.

  • La segunda indica el número de enlaces duros asociados al archivo o directorio.

    En el caso de un archivo, indica las veces es referenciado en el sistema de archivos.

    Si es un directorio, indica el número de subdirectorios que contiene. Como mínimo será un 2, porque todos los directorios tienen una entrada que lo referencia a él mismo (‘.’) y otra para su directorio padre (‘..’).

  • La tercera recoge el nombre de la cuenta propietaria del archivo o la carpeta. En nuestro ejemplo, la cuenta se llama ‘usuario’.

  • La cuarta indica el grupo cuyos miembros tendrán acceso al archivo o a la carpeta. De forma predeterminada, cuando se crea un usuario en Ubuntu, se crea también un grupo con el mismo nombre, que será su grupo principal. Ese es el motivo de que aparezca el mismo nombre dos veces.

  • En la quinta columna se muestra el tamaño del archivo en bytes. Es importante tener en cuenta que en el caso de los directorios este valor no representa el tamaño de su contenido.

  • A continuación encontramos la fecha y la hora en la que se ha modificado el elemento por última vez (en archivos antiguos puede aparecer el año).

  • Y, por último, el nombre del archivo o directorio.

Interpretar el significado de los permisos

Una vez que entendemos la salida del comando ls, estamos listos para analizar los permisos. Y para lograrlo tomaremos como ejemplo la primera línea de la imagen anterior, que tiene el siguiente aspecto:

-rw-rw-r-- 1 usuario usuario 2667942 dic  4 19:40 'cover SOM.png'

El primer carácter es un guión, luego sabemos que se trata de un archivo.

Los siguientes nueve caracteres debemos separarlos en grupos de tres:

  • Los relativos al propietario (owner). Normalmente, será la cuenta de usuario que ha creado el archivo. No obstante, también es posible cambiar el propietario de un archivo. En el ejemplo, rw-.

  • Los relativos al grupo (group). Ese grupo de permisos se asignarán a los miembros del grupo de usuarios que nos muestra ls. En el ejemplo, rw-.

  • Los relativos a otros usuarios (others). Serán el resto de usuarios del sistema, que no son propietarios ni miembros del grupo anterior. En el ejemplo, r–.

Con respecto a significado de los caracteres, es el siguiente:

  • Cuando en la primera posición aparece una r, significa que la cuenta en cuestión tiene permisos para leer el contenido del archivo. Si el permiso no está disponible, aparece un guión (‘‘).

  • Cuando en la segunda posición aparece una w, significa que la cuenta en cuestión tiene permisos para escribir en el archivo. Si el permiso no está disponible, aparece un guión (‘‘).

  • Cuando en la tercera posición aparece una x, puede significar dos cosas:

    1. Si se trata de un archivo, éste podrá ser ejecutado, como un programa o script.

    2. Si se trata de un directorio, significa que se puede acceder a él y ver su contenido.

    Si el permiso no está disponible, aparece un guión (‘‘).

En definitiva, si volvemos al ejemplo de arriba, el propietario del archivo, que es la cuenta usuario, podrá ver su contenido y modificarlo. Lo mismo ocurre con todas las cuentas que sean miembros del grupo usuario. Sin embargo, el resto de los usuarios del sistema solo podrá ver el contenido del archivo, pero no modificarlo.

Ajustar los permisos según nuestras necesidades

Cuando necesitamos modificar los permisos de uno o varios archivos o directorios, podemos usar el comando chmod.

Este comando tiene una característica interesante y es que puede usarse de dos formas diferentes: en modo simbólico (usando caracteres) y en modo numérico (usando valores en octal.

Modo simbólico

En este caso, el comando chmod utiliza dos argumentos: el primero está formado por dos letras separadas por un operador; el segundo será el nombre del archivo, o los archivos, que se verán afectados por el cambio de permisos. En definitiva, algo como esto:

chmod u+x instalar.sh

La primera letra indica el destinatario del permiso y será una de estas:

  • La letra u (user), representa al usuario propietario. Es la que hemos usado en el ejemplo antgerior.

  • La letra g (group), representa al grupo de usuarios que nos mostraba ls en el apartado Comprobar los permisos de uno o varios archivos.

  • La letra o (others), representa al resto de usuarios del sistema, que no son propietarios ni miembros del grupo anterior.

La segunda letra representa el permiso al que nos estamos refiriendo y, como es lógico, podrá ser una r (para el permiso de lectura), una w (para el de escritura) o una x para el de ejecución.

En cuanto al operador, puede ser uno de los siguientes:

  • El símbolo + especifica que se asignará al usuario, o usuarios, representados a su izquierda, el permiso representado a su derecha.

  • El símbolo especifica que se retirará al usuario, o usuarios, representados a su izquierda, el permiso representado a su derecha.

  • El símbolo = especifica que se asignará al usuario, o usuarios, representados a su izquierda, el permiso representado a su derecha, pero se les retirará cualquier otro permiso que tuviesen.

Aplicando en comando anterior, observamos que hemos otorgado al propietario permisos de ejecución sobre el archivo.

Administrar-permisos-desde-la-terminal-de-Ubuntu-004

Observa que incluso ha cambiado el color que utiliza el comando ls para representar el archivo.

Si queremos asignar los mismos permisos a varios tipos de usuarios a la vez, podemos combinar las letras correspondientes. Por ejemplo, para otorgar permisos de ejecución tanto al propietario como al grupo, podemos escribir algo como esto:

chmod ug+x instalar.sh

Aquí hemos sustituido la orden anterior por esta.

Administrar-permisos-desde-la-terminal-de-Ubuntu-005

También podemos asignar varios permisos al mismo tiempo. Por ejemplo, así:

chmod ugo=rw instalar.sh

Ahora, todos tienen los mismos permisos.

Administrar-permisos-desde-la-terminal-de-Ubuntu-006

Incluso, para asignar los mismos permisos a todos, como hemos hecho en este último ejemplo, podemos usar la letra a (all) para indicar el destinatario:

chmod a=rw instalar.sh

Y obtenemos el mismo resultado.

Administrar-permisos-desde-la-terminal-de-Ubuntu-007

Modo numérico

En el modo numérico, los permisos se representan como valores en el sistema de numeración octal. Sin embargo, creo que para entenderlo es mejor que veamos cómo se expresa en binario, y después hagamos la conversión.

La idea es que representemos cada permiso con un bit. De este modo, si un usuario, o conjunto de usuarios, no tiene ningún permiso, lo representaríamos como 000. Y para conceder un permiso concreto, pondríamos a 1 el valor correspondiente. En definitiva, lo que representamos en la siguiente tabla:

Administrar-permisos-desde-la-terminal-de-Ubuntu-002

Por supuesto, cuando necesitamos otorgar diferentes permisos, podremos poner a 1 más de un bit.

Sin embargo, como te decía al principio, en chmod no se utilizan directamente los valores en binario. En su lugar, se emplean sus equivalentes en octal, por lo que deberemos usar una tabla de equivalencias como esta:

Administrar-permisos-desde-la-terminal-de-Ubuntu-003

Así, para asignar permisos de lectura, escritura y ejecución (7) al propietario del archivo instalar.sh, pero solo de lectura y ejecución (5) al grupo y a otros, escribiríamos lo siguiente:

chmod 755 instalar.sh

Podemos establecer diferentes permisos en un solo paso.

Administrar-permisos-desde-la-terminal-de-Ubuntu-008

Puede que así, de entrada, este método te resulte un poco más complejo que el anterior pero, en realidad, si te fijas, todo se reduce a pensar en tres valores en binario y su correspondiente en octal (incluso podrías pensar en decimal, porque los valores coinciden):

  • 100 (4), que representa el permiso de lectura (r).

  • 010 (2), que representa el permiso de escritura (w).

  • 001 (1), que representa el permiso de ejecución (x).

… Y cuando quieras establecer múltiples permisos, solo tienes que sumarlos. Así, para el ejemplo anterior, sabemos que los permisos de lectura, escritura y ejecución del propietario se representan con un 7, porque proviene de 4 + 2 + 1. Y los permisos de lectura y ejecución del grupo y otros es 5, porque proviene de 4 + 1.

Cambiar permisos en varios archivos a la vez

Una característica interesante del comando chmod es su argumento -R, que permite modificar los permisos de forma recursiva. Esto significa que podremos utilizarlo para cambiar los permisos de un directorio y de todos los subdirectorios y archivos que haya dentro de él.

Además, podremos combinarlo con los siguientes argumentos:

  • -f (force) aplica el comando chmod ignorando cualquier error que pueda producirse.

  • -v (verbose) muestra información sobre todos los archivos procesados.

  • -c (changes) muestra información sobre los archivos en los que se hayan establecido correctamente los cambios.

Por ejemplo, imagina que tienes un directorio llamado prueba, que tiene varios archivos y directorios en su interior. Para comenzar, podríamos usar el comando ls, con la siguiente sintaxis para ver la estructura completa:

ls -lR prueba

Ejecutamos el comando

Administrar-permisos-desde-la-terminal-de-Ubuntu-009

Al hacerlo, observamos que, dentro de prueba, tenemos dos subcarpetas (scripts y textos). Sin embargo, tenemos scripts en ambas carpetas (archivos con extensión sh). Por lo tanto, si necesitáramos asignar permiso de ejecución tanto a los miembros del grupo, como a otros, en una sola operación, podríamos escribir algo como esto:

chmod -cR go+x prueba

Como hemos utilizado el argumento -c, obtenemos un detalle de todos los cambios producidos

Administrar-permisos-desde-la-terminal-de-Ubuntu-010

Y para comprobar el resultado, volvemos a usar el comando ls.

Administrar-permisos-desde-la-terminal-de-Ubuntu-011

Como ves, ha funcionado perfectamente y ahora, los usuarios afectados, tienen permiso de ejecución sobre todos los archivos y directorios contenidos dentro de prueba.

Estarás pensando que esta idea es buena cuando todos los archivos son homogéneos y tienen las mismas necesidades pero, en nuestro caso, existen archivos que no deberían verse afectados por el cambio, como los archivos con extensión txt.

Para este tipo de situaciones, necesitaremos recurrir al comando find, que tiene la habilidad de buscar archivos específicos en la ruta que le indiquemos. Por ejemplo, con la sintaxis siguiente buscaríamos, dentro del directorio prueba y todos sus subdirectorios, archivos (-type f) cuyo nombre termine en .sh (-name «*.sh»)

find prueba -type f -name "*.sh"

… Y como vemos, funciona perfectamente

Administrar-permisos-desde-la-terminal-de-Ubuntu-012

Ahora que ya sabemos localizar los archivos que nos interesan, necesitamos conocer un argumento más del comando find. Me refiero a -exec, que tiene la habilidad de realizar una acción sobre cada archivo encontrado por find.

Lo conseguiríamos así:

find prueba -type f -name "*.sh" -exec chmod go+x {} \;

Observa que hemos usado el modo simbólico de chmod, pero nada nos impide usar el modo numérico, si esa fuese nuestra preferencia. Lo importante es que se ejecutará el comando chmod para cada archivo encontrado por find. El símbolo {} representa a un archivo cada vez y \; indica el final de -exec.

En la imagen se incluye la salida del comando ls, para que puedas comprobar la situación de partida.

Administrar-permisos-desde-la-terminal-de-Ubuntu-013

Si volvemos a ejecutar ls después, comprobamos que el cambio se ha producido de forma correcta

Administrar-permisos-desde-la-terminal-de-Ubuntu-014

Para un mayor detalle sobre el comando find, puedes consultar su página del manual, por ejemplo, en el siguiente enlace: https://manpages.ubuntu.com/manpages/focal/en/man1/find.1.html.

Consideraciones finales

Siempre debes prestar atención a los ajustes que realices con el comando chmod, pero especialmente cuando modifiques los permisos de archivos que forman parte del propio sistema operativo. Ten en cuenta que no solo los expondrás a otros usuarios, también a cualquier software malicioso que se ejecute con los privilegios de dichos usuarios.

En definitiva, la compresión y el uso adecuado de los permisos es esencial para la seguridad de todo el sistema y para su correcto funcionamiento. El comando chmod, te ofrece un gran poder y ya sabes, como diría el Tío Ben, “Un gran poder conlleva una gran responsabilidad”.

Y hasta aquí el contenido del artículo. Espero que te resulte útil.