Permisos de archivos y directorios en Linux

En Linux los permisos de archivos y directorios son clave para ir dominando temas avanzados. Si eres administrador de sistemas, desarrollador o solo quieres aprender más sobre el tema de permisos, entonces estas en el post adecuado. De aquí saldrás con las herramientas necesarias que te ayudaran a desenvolverte por tu cuenta. Te sugiero que leas de inicio a fin, pero también practiques en una máquina virtual o WSL. Lo importante es que no te quedes con la teoría, sino que también te pongas manos a la obra. ¿Listo? GOOOOOO 

Contenido

Ver permisos de archivos y directorios

La forma más común de ver los permisos es con la terminal y el comando ls -l. El resultado contiene varias columnas que se explican a continuación: 

$ ls -l
-rw-r--r-- 1 idword idword 177 Apr 13 13:52 create_dummy_file.cpp
Permisos en archivos y directorios - Resultado del comando ls -l

El tipo de archivo indica si se trata de un archivo o directorio:

  • “-” para archivos comunes (el que veras en la mayoría de los casos). 
  • “d” para directorios. 
  • “b” archivo de bloque. 
  • “c” archivo de caracteres. 
  • “p” archivo pipe. 
  • “s” archivo de socket. 
  • “l” enlace simbólico. 

También es importante mencionar que en Linux todos los archivos pertenecen a un usuario y un grupo. De allí el nombre propietarios que se mostraba en la imagen anterior. 

Antes de explicar la columna de permisos primero debes saber que existen 3 tipos que podrían considerarse básicos. Cada uno tiene un valor octal por defecto (esto te servirá después). 

  • r (read) – valor octal 4
  • w (write) – valor octal 2
  • x (execute) – valor octal 1

Ahora si veamos en detalle la columna de permisos:

Permisos en archivos y directorios - Descripción de permisos

Los permisos de “other” son para cualquier otro usuario o grupo diferentes al usuario y grupo propietarios.

Los permisos rwx actúan diferente cuando se trata de un archivo o un directorio.

Para archivos: 

  • “r” permite ver el contenido del archivo. 
  • “w” permite guardar cambios en el archivo. 
  • “x” permite ejecutar el archivo (script, programa). 

Para directorios: 

  • “r” permite listar el contenido. 
  • “w” permite crear, renombrar y borrar archivos. 
  • “x” permite acceder al directorio, ejecutar un archivo o iniciar una tarea dentro del directorio. 

Algunas notas para rescatar de lo anterior es que para borrar un archivo se necesita el permiso a nivel directorio. Para ejecutar archivos (scripts, programas, etc.) ocupas el permiso “x” a nivel directorio y archivo. 

Genial, ahora tienes lo necesario para saber cómo obtener los permisos de un archivo o directorio. El siguiente paso por aprender es modificar los permisos.

Modificar permisos de archivos y directorios

El comando chmod es tu mejor amigo para modificar los permisos. Existen dos formas de hacerlo: Modo simbólico y Modo absoluto.

Permisos en modo simbólico

El modo simbólico es user friendly pues es sencillo de manejar y recordar. Esta forma de proporcionar permisos utiliza lo que se conoce como contextos.

Contextos de permisos: 

  • “u” para usuarios. 
  • “g” para grupos. 
  • “o” para otros. 
  • “a” para todos (all). 

También se utilizan los llamados operadores de permisos:

  • “+” para agregar uno o varios permisos. 
  • “-” para remover uno o varios permisos. 
  • “=” reemplaza los permisos actuales por los que se especifiquen.

Y finalmente se ocupan los atributos de permisos que ya conoces: rwx (read, write, execute).

La forma basica de usar chmod es:

$ chmod {CONTEXTO(s)_PERMISO}{OPERADOR DE PERMISO}{ATRIBUTO(s)} {ARCHIVO o DIR}

Si no se especifica el contexto de permiso el sistema asumirá que se usa “a” (all).

Ejemplos de modo simbólico

Agrega el permiso de ejecución para el usuario propietario:

$ chmod u+x MYSCRIPT 

Remueve el permiso de ejecución para el usuario propietario:

$ chmod u-x MYSCRIPT

Agrega el permiso de escritura en el directorio para el grupo propietario:

$ chmod g+w MYDIR

Agrega el permiso de ejecución en el archivo para el usuario propietario, el grupo propietario y otros:

$ chmod +x OTHERSCRIPT

Asigna el permiso de lectura, escritura y ejecución para “otros”:

$ chmod o=rwx FILE1 

Designa el permiso de lectura para “otros”, si el archivo ya tenía otros permisos estos serán reemplazados por el permiso “r”:

$ chmod o=r FILE1

Asigna el permiso de escritura al grupo propietario y otros:

$ chmod go+w FILEX 

Asigna permiso de ejecución al usuario, grupo y otros. Si habia otros permisos, estos seran reemplazados y solo quedara activo el de ejecución:

$ chmod a=x FILEY

Asigna todos los permisos al usuario, asigna permiso lectura y ejecucion al grupo, asigna permiso de lectura a otros:

$ chmod u=rwx,g=rx,o=x file2.txt

Permisos en modo absoluto

Esta forma de proporcionar permisos hace uso de los números octales que van del 0 al 7. Cada permiso (rwx) tiene un valor octal asignado por defecto: 

  • r (read) – valor octal 4
  • w (write) – valor octal 2
  • x (execute) – valor octal 1

A partir de esos números puedes sumar los valores para asignar más de un permiso: 

  • 3 = asigna permiso “w” y “x” (2 + 1 = 3) 
  • 5 = asigna permiso “r” y “x” (4 + 1 = 5) 
  • 6 = asigna permiso “r” y “w” (4 + 2 = 6) 
  • 7 = asigna todos los permisos rwx (4 + 2 + 1 = 7) 

El modo absoluto se usa en la forma:

$ chmod {OPERADOR DE PERMISO}{NUMERO OCTAL DE 1 a 3 DIGITOS} {ARCHIVO o DIR}

Por ejemplo:

$ chmod +740 MYFILE

El primer digito es para los permisos del usuario propietario, el segundo para el grupo propietario y el tercero para “otros”.

Similar al modo simbólico, puedes usar los operadores “-”, “+” y “=” antes del número. Es válido decir que el operador default es “=” en el modo absoluto ya que reemplaza todos los permisos con los que le especificas en el comando. 

Usar los 3 dígitos es una práctica común pero también puedes usar 1 o 2 dígitos. El operador que uses juega un papel importante. Operadores “+” o “” con un digito significa que estas modificando los permisos de “otros”. Si lo haces con dos dígitos entonces modificas los permisos del grupo y “otros”. Si el operador que usas es “=” entonces estarás asignando el valor final de los permisos, lo que puede llevar a remover los que ya existen. 

Ejemplos de modo absoluto

Agrega todos los permisos al usuario, grupo y “otros”, chmod =777 y chmod 777 serian equivalentes para este escenario:

$ chmod +777 FILE

Agrega el permiso de ejecución en el archivo (solo para “otros”). Los demas permisos permanecen intactos (si es que había):

$ chmod +1 FILE

Remueve el permiso de escritura para el grupo propietario y remueve el permiso de ejecución para “otros”. Los demás permisos permanecen intactos (si es que había):

$ chmod -21 FILE

No hace nada, el equivalente es chmod +000:

$ chmod –000 FILE

Remueve todos los permisos (he aquí la importancia del operador):

$ chmod 000 FILE

Asigna todos los permisos como valor final al usuario y grupo propietario, asigna el permiso de lectura a “otros”:

$ chmod 774 FILE

Siempre que proporciones permisos es una buena práctica verificarlos con el comando ls -l o cualquier otro método que utilices para ver los permisos. 

Permisos default en nuevos archivos y directorios

Ahora es tiempo de reflexionar sobre la existencia de nuevos archivos y directorios y su relación que tienen con los permisos. Aquí ya vamos entrando a las artes oscuras de Linux.

Muchos no se lo cuestionan, pero cada vez que creas un nuevo archivo o directorio, estos tendrán permisos predefinidos por el sistema. 

¿Es posible cambiar esos permisos que vienen por defecto?. La respuesta es sí, el comando umask es nuestra herramienta para este propósito.

Lo primero por aprender es consultar el valor actual de los permisos default para archivos y directorios nuevos. El comando umask te ayudan a verificar esta información y se puede hacer en modo simbólico o numérico.

Permisos default en modo simbólico

¿Te es familiar? A estas alturas ya deberías saber leer el resultado del comando simbólico en umask.

$ umask -S
u=rwx,g=rx,o=rx

Permisos default en modo numérico

El resultado en el modo numérico puede parecer raro, pero acá te lo explico. Lo que pasa con umask –p es que te muestra los permisos haciendo una resta y por si no fuera poco lo hace en el sistema octal jaja (estos loquillos de Linux). 

$ umask -p
umask 0022

Resaltar que el resultado numérico tiene 4 dígitos. 

  • El primer digito representa los permisos especiales SUID y SGID (ya hablaremos de ellos en otro momento). 
  • El segundo digito representa los permisos de usuario. 
  • El tercer digito representa los permisos de grupo. 
  • El 4 digito representa los permisos de “otros”. 

Anteriormente ya había mencionado que los valores octales van del 0 a 7 y que los permisos rwx ya tienen un valor octal asignado por defecto. Si sumamos todos los valores esto nos da el 7 como el número mayor. Si analizamos nuevamente la salida de umask –S y convertimos los resultados a octal tendríamos algo así: 

$ umask -S
u=rwx,g=rx,o=rx
u=421,g=41, o=41 #en octal

Posteriormente sumamos cada permiso por contexto separado: 

u=7,g=5,o=5

Finalmente aplicamos la formula 7 – valor de contexto sumado, y llegaríamos al mismo resultado que umask –p

u=7-7,g=7-5,o=7-5
u=0,g=2,o=2
022

$ umask -p
umask 0022

Modificar permisos default

Para modificar los permisos default con umask es posible usar los operadores “+”, “-” y “=” y contextos “u”, “g”, “o” y “a”, y atributos “r”, “w”, y “x” tal como en el modo simbólico de chmod. También es posible usar el modo octal, pero recuerda que aquí los permisos se aplican a la inversa, o mejor dicho haciendo la resta octal correspondiente y no se pueden usar los operadores como en chmod y el modo absoluto, pero si se puede especificar de 1 a 3 dígitos.

Ejemplos de umask

Asigna todos los permisos al usuario, permiso lectura y ejecucion al grupo y permiso de lectura a “otros”:

$ umask u=rwx,g=rx,o=x

Remueve el permiso de ejecución al usuario y grupo propietarios:

$ umask ug-x

agrega el permiso de escritura y ejecución al usuario y “otros”:

$ umask uo+wx

Asigna todos los permisos al usuario, grupo y “otros”:

$ umask 000

Designa los permisos lectura y escritura solo para “otros”:

$ umask 1

Asigna permiso de lectura al grupo, asigna permiso escritura y ejecución a “otros”:

$ umask 34

Asigna permiso de ejecución al usuario, grupo y “otros”:

$ umask 666

Remueve todos los permisos al usuario, grupo y “otros”:

$ umask 777

La principal diferencia entre chmod y umask es que chmod cambia permisos a archivos/directorios existentes, mientas que umask cambia los permisos a los archivos/directorios nuevos que van a ser creados.

Usuario y grupo propietario

Todos los archivos pertenecen a un usuario y grupo a los cuales se les considera propietarios. Siempre que creas un archivo o directorio, tu usuario y grupo primario serán los propietarios, pero esto lo puedes cambiar fácilmente. 

Y ¿cuál es el propósito de cambiar el propietario de un archivo o directorio? Recuerda que cada archivo tiene permisos de usuario, grupo y otros. Al cambiar el propietario lo que estás haciendo es algo así como redirigir los permisos a un nuevo usuario o grupo. Un escenario común es cuando el administrador (root) crea una carpeta que solo debe ser accesible y contralada para un usuario en particular. Al crear la carpeta el usuario y grupo pertenecerán a root pero esto puede cambiarse para que el propietario sea el usuario para quien se va a designar dicha carpeta. 

Cambiar usuario y grupo propietario

Para cambiar el usuario propietario se usa el comando chown y también lo puedes usar para cambiar el grupo. El comando requiere permisos de root, veamos algunos ejemplos.

Cambia el propietario por el usuario que se espeficique:

$ chown {usuario} {archivo/directorio}

Cambia el usuario y grupo propietario por el que se espefique:

$ chown {usuario}:{grupo} {archivo/directorio}

Cuando se crea un usuario se crea tambien un grupo al cual pertenecera el usuario (conocido como grupo primario). El siguiente comando cambia el usuario propietario por el que se especifique pero también asigna el grupo primario de dicho usuario:

$ chown {usuario}: {archivo/directorio}

Cambia el grupo propietario por el que se especifique:

$ chown :{grupo} {archivo/directorio}

El comando chgrp también te ayuda a cambiar el grupo:

$ chgrp {grupo} {archivo/directorio}

Permisos especiales en archivos y directorios

Ahora estamos entrando a la deep web de los permisos. Aqui vamos a hablar de los permisos especiales SUID, SGID y Sticky bit.

Permisos especiales Set User ID (SUID) y Set Group ID (SGID)

Empezamos con Set User ID (SUID) que se aplica principalmente en archivos ejecutables. Primero recuerda que por defecto el propietario de un archivo tiene todos los permisos (rwx). Al activar el permiso SUID permites que otro usuario adquiera los permisos del propietario, en este punto también accedería al resto de archivos del propietario mediante el ejecutable. Por esta razón debes ser cuidadoso con este permiso.

Supongamos que se activa SUID en un ejecutable que crea archivos, al crearlos lo hará con el usuario propietario del ejecutable y no con el usuario que lo ejecuta. 

Es importante que el permiso “x” (ejecución) este activo para “others”, de otra forma los usuarios no podrán ejecutar los archivos aunque SUID se encuentre activado.

El funcionamiento de SGID es similar a SUID, la diferencia es que es a nivel grupo. Ambos permisos se usan principalmente para evitar proporcionar permisos de escritura de manera directa a otros usuarios. Cuando se activa SUID o SGID, veras una “s” en los permisos del usuario o grupo.

Acá te dejo una lista de los comandos en Linux que hacen uso de SUID y SGID:

Permisos especiales SUID y GUID

Comandos para activar SUID y SGID.

SUID en modo simbolico:

$ chmod u+s archivo

SUID en modo absoluto:

$ chmod 4### archivo

SGID en modo simbolico:

$ chmod g+s archivo

SGID en modo absoluto:

$ chmod 2### archivo

Para remover el permiso usa “” en el modo simbolico y 0 en el modo absoluto.

Permiso especial Sticky bit

Este tipo de permiso permite que solo el propietario de un archivo, el propietario del directorio o el usuario root puedan renombrarlo o eliminarlo. Se debe otorgar a los directorios, lo cual afectara archivos y directorios dentro. Si das el permiso a un archivo, no funcionara.

La carpeta /tmp es un ejemplo donde se utiliza este tipo de permiso. La “t” indica que el sticky bit se encuentra activo y aparece en los permisos de “otros”:

$ ls -l /
drwxrwxrwt 10 root root 4096 Apr 13 15:31 tmp

Para activar el sticky bit se usa alguno de los siguientes comandos.

Activa el sticky bit en modo simbólico:

$ chmod +t directorio

Activa el sticky bit en modo absoluto:

$ chmod 1### directorio

Al igual que SUID y SGID, puedes usar “” para remover el permiso en modo simbólico o “0” en modo absoluto.

Recomendaciones

Por ahora tienes bastante material para aprender, lo cierto es que aún hay cosas por ver, pero dejare eso para un siguiente post. Mi recomendación por ahora es que empieces a usar los comandos que se describen aquí. Solo he puesto las formas básicas de cada comando, pero siempre puedes hacer uso de man {comando} o comando –help para revisar todas las opciones que tienes disponibles y aclarar dudas. También puedes hacer uso de Google o cualquier otra fuente de información que te ayude con el tema. 

Comparte si te gustó.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *