SDB:Fundamentos del sistema de permisos
Artículos recomendados | Artículos relacionados | ||
|
Contenido
Introducción
Como sistema operativo multiusuario, Linux lleva aparejado un sistema de permisos que establece quién puede hacer qué con un fichero determinado. Dado que es el sistema empleado desde los orígines y, de hecho, heredado de Unix, es conocido a veces como sistema de permisos tradicional.
La popularización de la ofimática implicó dos circunstancias: cada vez había más grupos de trabajo que debían de compartir ficheros para realizar su trabajo, y a la vez los grupos de trabajo, muchas veces con apenas integrantes, estaban formados por miembros que podían formar parte de otros grupos de trabajo o cambiar de grupo con facilidad. Esto hizo que en muchas situaciones el sistema de permisos tradicional no fuera suficiente y llevó a la definición de las Listas de control de acceso.
Ambos sistemas proponen una forma de mantener cierta privacidad en los ficheros propiedad de una organización. Sin embargo, también tienen sus limitaciones respecto al uso de exploits en muchos servicios comunes, como por ejemplo en los servidores web. Para resolver esto se optó por un enfoque diferente y se propusieron dos sistemas principalmente: SELinux y Apparmor.
Este documento se ocupa de los dos primeros sistemas, ya que proponen formas de definir quién puede y qué puede hacer con un fichero. SELinux y Apparmor por su parte establecen reglas que limitan qué ficheros pueden ser afectados por un servicio dado, pero dichas reglas afectan al servicio, no a los ficheros en sí.
Axiomática
- Cuanto más se restrinja qué usuarios pueden hacer qué, menos probabilidades habrá de que alguien rompa algo intentando hacer otra cosa. Cuanto más restrinja qué usuarios pueden hacer qué, más probabilidades hay de que alguien haga algo peligroso para el sistema para evitarse trabajo.
- Ni siquiera los administradores experimentados están a salvo de meter la pata y cargarse el sistema. Cualquier administrador poco o nada experimentado, por tanto, es muy peligroso.
- Cualquier comando mal usado es peligroso. Cualquier comando mal usado por el administrador[1] es muy peligroso. Las opciones recursivo y forzar sin preguntar son tan cómodas como peligrosas.
- Antes de usar un comando, lee la mayor cantidad de información posible sobre el mismo. Y trata siempre de ejecutarlo como usuario no administrador. Si requiere privilegios de administrador, insiste con sudo.
- El análisis de las necesidades de seguridad de un sistema dado excede con mucho el ámbito de este documento. Así, en el mismo sólo podrá encontrarse una descripción somera de las herramientas y posibilidades de la gestión de permisos de ficheros.
El sistema tradicional
Desde el punto de vista de un fichero, Linux distingue varias operaciones que se puede realizar con el mismo. Un fichero regular puede ser leído, puede ser modificado y puede ser ejecutado. En cambio, una carpeta o directorio puede ser accedida en lugar de ejecutada.
El permiso de lectura se nombra como r (read), el de modificación se nombra como w (write) y el de ejecución o acceso se nombra x (execution).
Desde el punto de vista del núcleo del sistema operativo Linux los ficheros son utilizados por usuarios. Es más, para Linux un usuario es poco más que un conjunto de configuraciones y permisos sobre ficheros. Los usuarios pueden compartir todas o algunas de estas características y permisos mediante grupos.
En lo que atañe a este documento, Linux distingue entre diferentes usuarios, diferentes grupos de usuarios, y el resto de usuarios. Una nomenclatura adecuada permisos del usuario, permisos del grupo, permisos del resto del mundo.
En un archivo de texto, el significado de los mismos es obvio: si se activa el permiso r se podrá leer el contenido del mismo, si se activa w se podrá modificar y si se activa x se podrá ejecutar (siempre que sea un script o un ejecutable binario[2])
usuario@Leap-PC:~> mkdir prueba
usuario@Leap-PC:~> cd prueba
usuario@Leap-PC:~/prueba> touch fichero.txt
usuario@Leap-PC:~/prueba> ls -l
total 0
-rw-r--r-- 1 karl users 0 dic 30 08:35 fichero.txt
usuario@Leap-PC:~/prueba>
En este caso, podemos ver las propiedades de fichero.txt en las diez primeras letras de la salida de ls -l. La primera letra (en este caso, un guión) indica qué tipo de fichero es: un fichero regular, un directorio, un enlace a fichero, un dispositivo de bloques, etc. Las siguientes 9 letras son los permisos de dicho fichero, agrupados en tres grupos: las primeras tres para el usuario (User), las siguientes tres para el grupo al que pertenece el usuario (Group) y las siguientes tres para cualquier otro usuario del sistema (Other). En ese contexto, All (a) hace referencia a "todos los usuarios". Podemos ver que fichero.txt tiene permisos de lectura y modificación para el usuario, de lectura para el grupo y de lectura también para los demás. Probemos a modificar el fichero:
usuario@Leap-PC:~/prueba> echo "modificar fichero" >> fichero.txt
usuario@Leap-PC:~/prueba> cat fichero.txt
modificar fichero
usuario@Leap-PC:~/prueba>
Esto es lo esperable. Modificamos el fichero así que el contenido del mismo se actualiza como nosotros queríamos.
Lo dicho para los ficheros rige también para los directorios:
usuario@Leap-PC:~/prueba> cd ..
usuario@Leap-PC:~> ls -l
drwxr-xr-x 2 usuario users 24 dic 30 08:35 prueba
Pero aquí las cosas cambian ligeramente. El permiso de lectura sigue significando lo mismo, pero los demás, no. Ahora Escritura es la capacidad de modificar el directorio (incluyendo eliminarlo, modificarlo y por supuesto, añadir ficheros dentro de él), mientras que Ejecución es la capacidad de acceder al mismo.
Para modificar estas propiedades, se usa el comando chmod (cambiar modo). Ejecuta man chmod para aprender más sobre este comando. En general la sintaxis será:
chmod permisos fichero(s)
Los permisos pueden fijarse en modo octal[3] o bien añadirse y quitarse sobre los existentes. Por ejemplo, crearemos otro fichero llamado fichero2.txt y le asignaremos propiedades de escritura para cualquier usuario. Para eso, cambiaremos su modo añadiendo el permiso de escritura (+w) a todos los usuarios del sistema (all, a):
usuario@Leap-PC:~> cd prueba
usuario@Leap-PC:~/prueba> touch fichero2.txt
usuario@Leap-PC:~/prueba> chmod a+w fichero2.txt
usuario@Leap-PC:~/prueba> ls -l
total 4
-rw-rw-rw- 1 usuario users 0 dic 30 08:48 fichero2.txt
-rw-r--r-- 1 usuario users 18 dic 30 08:39 fichero.txt
usuario@Leap-PC:~/prueba>
Por supuesto, si + es añadir un permiso, - es retirar un permiso. |
Fíjate en que en cada grupito de tres letras está activada la letra w. Ahora cualquier usuario del sistema podrá modificar (e incluso eliminar) fichero2.txt.
usuario@Leap-PC:~/prueba> su
Contraseña:
Leap-PC:/home/usuario/prueba # useradd patoso
Leap-PC:/home/usuario/prueba # passwd patoso
Cambiando contraseña para patoso.
Nueva contraseña:
Vuelva a introducir la nueva contraseña:
Contraseña cambiada.
Leap-PC:/home/usuario/prueba # exit
exit
usuario@Leap-PC:~/prueba> su patoso
Contraseña:
patoso@Leap-PC:/home/usuario/prueba> echo "modifica otra vez fichero.txt" >> fichero.txt
bash: archivo.txt: Permiso denegado
patoso@Leap-PC:/home/usuario/prueba> echo "modifica fichero2.txt" >> fichero2.txt
patoso@Leap-PC:/home/usuario/prueba> cat fichero2.txt
modifica fichero2.txt
patoso@Leap-PC:/home/usuario/prueba> exit
exit
Al registrarnos como el usuario patoso, si intentamos modificar el contenido de fichero.txt el sistema no nos lo permite (ya que sólo el usuario propietario puede hacerlo), mientras que si modificamos fichero2.txt funciona sin problemas.
usuario@Leap-PC:~/prueba> chmod a-w fichero2.txt
usuario@Leap-PC:~/prueba> su patoso
Contraseña:
patoso@Leap-PC:/home/usuario/prueba> ls -l
total 8
-r--r--r-- 1 usuario users 22 dic 30 08:51 fichero2.txt
-rw-r--r-- 1 usuario users 18 dic 30 08:39 fichero.txt
patoso@Leap-PC:/home/usuario/prueba> rm fichero2.txt
rm: ¿borrar el fichero regular «fichero2.txt» protegido contra escritura? (s/n) s
rm: no se puede borrar «fichero2.txt»: Permiso denegado
patoso@Leap-PC:/home/usuario/prueba>
chmod a-x elimina la propiedad de escritura para todos los usuarios el archivo deja de ser eliminable. patoso no puede borrarlo, ¿y usuario?
patoso@Leap-PC:/home/usuario/prueba> exit
exit
usuario@Leap-PC:~/prueba> rm fichero2.txt
rm: ¿borrar el fichero regular «fichero2.txt» protegido contra escritura? (s/n) s
usuario@Leap-PC:~/prueba> ls -l
total 4
-rw-r--r-- 1 usuario users 18 dic 30 08:39 fichero.txt
usuario@Leap-PC:~/prueba> cd ..
¿Cómo afecta esto a los directorios?
usuario@Leap-PC:~> su patoso
Contraseña:
patoso@Leap-PC:/home/usuario> rm -rf prueba
rm: no se puede borrar «prueba/fichero.txt»: Permiso denegado
patoso@Leap-PC:/home/usuario> exit
exit
usuario@Leap-PC:~/prueba> cd ..
usuario@Leap-PC:~> chmod a+w prueba
usuario@Leap-PC:~> su patoso
Contraseña:
patoso@Leap-PC:/home/usuario> rm -rf prueba
rm: no se puede borrar el directorio «prueba»: Permiso denegado
patoso@Leap-PC:/home/usuario> ls -l
drwxrwxrwx 2 usuario users 6 dic 30 08:58 prueba
patoso@Leap-PC:/home/usuario> ls prueba
patoso@Leap-PC:/home/usuario>
Si bien el directorio «prueba» no puede ser eliminado por patoso, el contenido del mismo sí ha sido borrado. ¿Por qué no se puede eliminar «prueba»? Muy simple, «prueba» es un directorio que está dentro del directorio de usuario usuario. Puedes pensar en que un directorio es una especie de listado que indica dónde se encuentra realmente el contenido de los ficheros. En este caso, /home/usuario tiene las propiedades adecuadas para su uso por parte de usuario, lo que incluye no poder ser modificable por otros usuarios. Para poder eliminar prueba, habría que activar el permiso de escritura en /home/usuario para el grupo 'users' o para todos los usuarios.
En este ejemplo, patoso es un usuario del mismo grupo que usuario (users). Esto no tiene porqué ser así.
Si quitamos el permiso de lectura a un directorio, el mismo podrá ser listado, pero no así su contenido. Pero esto no quiere decir que no pueda accederse al mismo, solamente significa que no puede leerse su contenido.
usuario@Leap-PC:~> ls prueba/
usuario@Leap-PC:~> chmod a-r prueba
usuario@Leap-PC:~> touch prueba/fichero.txt
usuario@Leap-PC:~> echo "modificar fichero.txt" >> prueba/fichero.txt
usuario@Leap-PC:~> cat prueba/fichero.txt
modificar fichero.txt
usuario@Leap-PC:~> ls prueba
ls: no se puede abrir el directorio prueba: Permiso denegado
usuario@Leap-PC:~> cd prueba
usuario@Leap-PC:~/prueba> ls
ls: no se puede abrir el directorio .: Permiso denegado
usuario@Leap-PC:~/prueba> touch hola.mundo
usuario@Leap-PC:~/prueba> ls
ls: no se puede abrir el directorio .: Permiso denegado
usuario@Leap-PC:~/prueba> chmod a+r ../prueba
usuario@Leap-PC:~/prueba> ls
fichero.txt hola.mundo
usuario@Leap-PC:~/prueba>
En el ejemplo, el directorio prueba sólo tiene suspendidos los derechos de lectura, pero conserva el de modificación y el de acceso.
Falta por observar cómo funciona el derecho de acceso.
usuario@Leap-PC:~> chmod a-x prueba/
usuario@Leap-PC:~> ls prueba
ls: no se puede acceder a prueba/fichero.txt: Permiso denegado
ls: no se puede acceder a prueba/hola.mundo: Permiso denegado
fichero.txt hola.mundo
usuario@Leap-PC:~> cat prueba/fichero.txt
cat: prueba/fichero.txt: Permiso denegado
usuario@Leap-PC:~>
Máscaras
La máscara define los permisos que se asignan a archivos y directorios de nueva creación. Para ello se hace uso del comando umask (ejecuta man umask para aprender más sobre este comando).
usuario@Leap-PC:~> umask
0022
usuario@Leap-PC:~> umask -S
u=rwx,g=rx,o=rx
usuario@Leap-PC:~>
umask muestra la máscara asignada actualmente. Si se provee un número octal, se modifica la máscara para ese número octal. La opción -S muestra los permisos en la misma forma que chmod (rwx).
Los valores octales de la máscara (y lo mismo rige para el uso octal de chmod) son los siguientes: 1 para ejecución, 2 para escritura, 3 ejecución + escritura, 4 para lectura, 5 para ejecución+lectura, 6 lectura+escritura y 7 para ejecución+lectura+escritura. Básicamente, al crear los permisos de un archivo, se le resta a 777 (lectura+escritura+ejecución para todos) el valor de la máscara. Así, en 022 le restamos 0 a la propiedad para usuario (7-0=7), 2 para el grupo (7-2=5 ->ejecución + lectura) y 2 también para Otros (7-2=5).
En los ficheros, por defecto, se evita el permiso de ejecución. |
usuario@Leap-PC:~/prueba> umask 023
usuario@Leap-PC:~/prueba> umask -S
u=rwx,g=rx,o=r
usuario@Leap-PC:~/prueba> mkdir otrodir
usuario@Leap-PC:~/prueba> ls -l
total 3
-rw-r--r-- 1 usuario users 22 dic 30 09:07 fichero.txt
-rw-r--r-- 1 usuario users 0 dic 30 09:09 hola.mundo
drwxr-xr-- 2 usuario users 6 dic 30 17:38 otrodir
usuario@Leap-PC:~/prueba>
En un sistema robusto, es posible que debamos analizar la conveniencia de que la máscara por defecto excluya, por ejemplo, a usuarios distintos del grupo del usuario. Así, un usuario podría tener una máscara tal como 027 (sin permisos de modificación para el grupo y sin permisos de lectura, modificación ni ejecución para los demás.
Listas de Control de acceso
Las personas encargadas de la edición de esta página consideran que aún necesario efectuar cambios, quizás importantes, en la misma. |
Notas
- El usuario llamado root. En el documento se usará el término en castellano porque es mejor evitar ambigüedades con la raíz del sistema / (también llamada root).
- En lugar de la extensión, como en los sistemas DOS y compatibles (incluido Windows), en los sistemas Unix e "Unix-like" lo que define el tipo de archivo es su contenido. Un ejecutable sólo será ejecutado si tiene la propiedad de ejecución válida para el usuario en cuestión y contiene código de shell-script o binario. (Ver man file)
- El sistema numérico octal o de base 8 es muy popular en la informática junto con el hexadecimal. Tiene 8 signos y permite contar de 8 en 8 (del 0 al 7, y de tal forma que 7+1=10).
Las personas encargadas de la edición de esta página consideran que aún necesario efectuar cambios, quizás importantes, en la misma. |