Introducción

Los permisos asociados a ficheros y directorios, son una de las medidas de seguridad básicas en los sistemas. Generalmente, el usuario propietario será la persona que ha creado el fichero, pero ésta puede ser alterada después de su creación. Existen tres tipos básicos de permisos, que son de:
  • Lectura: permite a los usuarios leer el archivo especificado.
  • Escritura: permite a los usuarios modificar el archivo especificado.
  • Ejecución: permite a los usuarios ejecutar el archivo especificado.
Cuando se asignan estos permisos, Linux guarda un registro de los mismos que posteriormente aparece reflejado en la lista de archivos, con lo cual, se crea un estado que se expresa mediante marcas:
  • r (read): acceso de lectura.
  • w (write): acceso de escritura.
  • x (execute): acceso de ejecución.
Dichas marcas, pueden ser visibles con un formato largo mediante el comando, ls -l. Ésta es una salida típica:

drwxr-xr-x 2 Pepe Pepe 4096 jun 6 12:50 lg
-rwxrwxr-x 1 Pepe Pepe 0 jun 6 12:49 kgl.py
drwxr-xr-x 2 Pepe Pepe 4096 jun 6 12:50 scripts

Chmod Bits
FIGURA 1.1: Propiedades de la tabla de permisos
Como podemos observar en la Figura 1.1, el primer carácter especifica el tipo de recurso. En este campo existen varios:
  • - representa un archivo.
  • b representa un archivo de bloques especial.
  • c representa un archivo de caracteres especiales.
  • d representa un directorio.
  • l representa un enlace simbólico
Finalmente, los nueve caracteres restantes se dividen en tres grupos:
  • Los permisos del propietario: estos permisos muestran el acceso del propietario del archivo
  • Permisos de grupo: estos permisos muestran el acceso del grupo al archivo.
  • Permisos mundiales: estos permisos muestran los derechos que tiene el resto del mundo a acceder a este archivo (si tiene alguno).
Vamos a aplicar esto al script en Python de Pepe. Como podemos observar, este recurso es un archivo.
-rwxrwxr-x 1 Pepe Pepe 0 jun 6 12:49 kgl.py
Por consiguiente, Pepe (el propietario del archivo) tiene todos los derechos de acceso en él, con lo cual puede leer, escribir y ejecutar el archivo.
-rwxrwxr-x 1 Pepe Pepe 0 jun 6 12:49 kgl.py
De igual modo, los usuarios del grupo (del grupo Pepe) también pueden leerlo, escribirlo y ejecutarlo.
-rwxrwxr-x 1 Pepe Pepe 0 jun 6 12:49 kgl.py
Y finalmente, aquellos que no sean Pepe y que no pertenezcan a su grupo, tienen derecho a leer y ejecutar el archivo, pero en cambio, no pueden escribir en él.

En resumen:
  • El primer carácter representa normalmente si es un archivo (-) o un directorio (d).
  • El primer conjunto de los tres caracteres indica los privilegios del usuario.
  • El siguiente conjunto, los privilegios del grupo.
  • Y finalmente, el último conjunto indica los privilegios del resto de usuarios.

chmod: cambiar los permisos de los archivos

Para definir los permisos a un usuario concreto sobre un archivo o un directorio, se utiliza el comando chmod. Existen tres tipos de operadores:
  • El operador - quita los permisos.
  • El operador + agrega permisos.
  • El operador = asigna permisos.
Veámos un claro resumen de como podemos quitar, agregar o asignar estos operadores.
  • r: Éste carácter añade o quita el permiso de lectura. Ejemplo: chmod +r nombre de archivo
  • w: Éste carácter añade o quita el permiso de escritura. Ejemplo: chmod -w nombre de archivo
  • x: Éste carácter añade o quita el permiso de ejecución. Ejemplo: chmod +x nombre de archivo
Un método consiste en añadir letras (r, w, x) para asignar permisos a archivos individuales o directorios. Otro es utilizar el sistema octal, con el cual se pueden añadir valores octales y que veremos en el siguiente apartado.

Sistema octal

El sistema octal, es un sistema numérico en base 8 que utiliza los dígitos de 0 a 7.
La siguiente tabla resume el esquema octal y lo que representa cada número, aunque seguidamente lo veremos con más detalle.
Sistema octal
FIGURA 1.2: Valores octales
  • 0000: Equivale a --- por lo que no tenemos ningún permiso.
  • 0001: Equivale a --x por lo que el propietario tiene permisos de ejecución.
  • 0002: Equivale a -w- por lo que el propietario tiene permisos de escritura.
  • 0004: Equivale a r-- por lo que el propietario tiene permisos de lectura.
  • 0010: Equivale a --x por lo que X grupo tiene permisos de ejecución.
  • 0020: Equivale a -w- por lo que X grupo tiene permisos de escritura.
  • 0040: Equivale a r-- por lo que X grupo tiene permisos de lectura.
  • 0100: Equivale a --x por lo que otros tienen permisos de ejecución.
  • 0200: Equivale a -w- por lo que otros tienen permisos de escritura.
  • 0400: Equivale a r-- por lo que otros tienen permisos de lectura.
  • 1000: Éste modo denominado Sticky bit, es aplicado a directorios importantes (como /tmp) con privilegios especiales. El bit asignado a un directorio sólo puede ser renombrado o borrado por el propietario del elemento del directorio o root aunque el resto tenga permisos de escritura. Además, éstos se indentifican mediante una t en la última posición de la propiedad de permisos. Ejemplo: drwxrwxrwt 13 root root 4096 jun 6 22:44 tmp
  • 2000: Éste modo denominado bit SETGID (Set Group ID) está orientado a facilitar el trabajo en grupo cuando varios usuarios deben de acceder a una colección común de ficheros y directorios. Se representan mediante la letra S. Por ejemplo, drwxrws--- 2 Pepe profesorado 4096 jun 3 22:12 Documentos el propietario del directorio y los miembros del grupo profesorado pueden acceder a este directorio. Los usuarios que no sean miembros de este grupo se “asignan” al mismo, con lo cual puede suponer un riesgo de seguridad si se definiera el valor root SUID en un programa.
  • 4000: Finalmente, éste modo denominado bit SETUID (Set User ID) es un atributo de archivo especial que indica al sistema que debe ejecutar los programas marcados con un ID de usuario en concreto. Por ejemplo, el programa vipw normalmente necesita permisos de usuario root para acceder a /etc/passwd, por tanto un usuario normal no podría cambiar dicho archivo, ya que sería demasiado peligroso otorgar a todos los usuarios acceso directo a él.
NOTA: Si los atacantes pueden explotar las debilidades de los programas root de SUID, potencialmente pueden obtener privilegios de root.
Los archivos de bit SUID y SGID pueden ser buscados de la siguiente forma: find / \( -perm -4000 -o -perm 2000 \) -ls > archivos_con_suid_sgid.txt con lo que nos hará un listado en un archivo de texto que posteriormente podemos analizar para otorgar los permisos adecuados para así, obtener un sistema mucho más seguro.
Finalmente, podemos facilitar las cosas reduciendo rápidamente los permisos del propietario, de grupos y otros usuarios a un número de tres dígitos utilizando los siguientes valores:
  • 0: Sin permisos.
  • 1: Ejecución.
  • 2: Escritura
  • 3: Escritura y ejecución (actualmente no se utiliza mucho).
  • 4: Lectura.
  • 5: Lectura y ejecución.
  • 6: Lectura y escritura.
  • 7: Todo el conjunto: lectura, escritura y ejecución.
Veámos un caso práctico:
[cloti@ ~]$ pwd; cd /home/pepe/
/home/cloti
bash: cd: /home/pepe/: Permiso denegado


[pepe@ ~]$ chmod 755 /home/pepe/; ls -l /home
drwx------ 4 cloti secretaria 4096 jun 7 01:45 cloti
drwx------ 4 juan profesorado 4096 jun 7 01:45 juan
drwxr-xr-x 4 pepe profesorado 4096 jun 7 01:41 pepe

[cloti@ ~]$ cd /home/pepe/; ls -l
-
rw-r--r-- 1 pepe profesorado 548 jun 7 02:20 Álgebras.doc
drwxr-xr-x 2 pepe profesorado 4096 jun 7 02:19 Exámenes
drwxr-xr-x 2 pepe profesorado 4096 jun 7 02:20 Física
drwxr-xr-x 2 pepe profesorado 4096 jun 7 02:20 Matemáticas
drwxr-xr-x 2 pepe profesorado 4096 jun 7 02:20 Prueba de acceso
-
rw-r--r-- 1 pepe profesorado 897 jun 7 02:20 Tema 4 Funciones.docx

Primeramente, podemos observar como el usuario cloti intenta acceder a la carpeta pepe (/home/pepe), la cual le deniega el acceso. Seguidamente, nuestro protagonista Pepe ha decidido darle permisos de lectura y ejecución a Cloti, que posteriormente ha podido acceder igual que podría hacerlo Juan siendo éste de su mismo grupo.