Permisos, stiky bit, SUID, SGID y enlaces
Los sistemas operativos GNU/Linux, basados en UNIX, son sistemas multiusuario, donde varios usuarios, incluso simultáneamente, pueden iniciar sesión. Por ello existen mecanismos que permiten proteger los ficheros y directorios.
El acceso a estos ficheros se restringe según las clases de usuarios. Vamos a ver como se administran estos permisos, a petición de varios lectores de este blog, tras la publicación del artículo sobre proteger ficheros y directorios en sistemas GNU/Linux, donde se explicaba, someramente este asunto.
Sumario
- Clases de usuarios
- Tipos de permisos
- Cambiar permisos con el modo normal
- Cambiar permisos con el modo octal
- Cambiar el propietario y el grupo de los ficheros
- Permisos especiales
- sticky bit
- SUID
- SGID
- Enlaces
- Enlace simbólico
- Enlace fuerte (hard link)
Clases de usuarios
Los permisos se articulan en función de las clases de usuarios. Para definir los permisos tenemos que saber que estos se otorgan al propietario, al grupo y a otros.
- propietario (owner): Es la persona que ha creado el fichero
- grupo (group): Los usuarios se pueden integrar a grupos para administrar sus permisos
- otros (other): Cualquier otro usuario del sistema
- todos (a) : Incluye al propietario, al grupo y a otros.
Tipos de permisos
Los tipos de usuario descritos, pueden acceder a los ficheros en función de los siguientes permisos, esta característica la provee el sistema de ficheros.
- permiso de lectura: permite acceder y leer el contenido del fichero
- permiso de escritura: permite acceder y modificar el contenido del fichero
- permiso de ejecución: permite ejecutar un fichero como un programa
Esto lo podemos ver al listar un directorio con «ls -l», donde lo primero que encontramos es el triplete de permisos. El primer carácter indica si el fichero es un directorio «d» o si es un fichero regular «-«. Los tres siguientes caracteres indican los permisos de lectura (read) «r», escritura (write) «w» y ejecución (execute) «x», para el usuario (propietario). Los tres siguientes indican estos tres permisos para el grupo al que pertenece el usuario y los tres últimos, los permisos para otros usuarios. Si alguno de estos permisos no están habilitados aparecerá en su lugar el carácter «-«. Veamos.
drwxr- xr-x | esto nos indica que es un directorio «d», que el propietario «rwx» tiene permisos de lectura «r», escritura «w» y ejecución «x», que el grupo al que pertenece el usuario los tiene de lectura y ejecución «r-x» y que otros usuarios los tienen de lectura y ejecución «r-x» |
-rwxr–r– | En este caso es un fichero regular «-«, los permisos son de lectura, escritura y ejecución para el propietario «rwx», de lectura para el grupo «r–» y para otros «r–«. |
En los directorios, el permiso de ejecución, se convierte en permiso de búsqueda recursiva en su interior.
Veamos un ejemplo. Si queremos que un fichero regular, tenga permisos completos para el propietario, de lectura para el grupo y ninguno para otros, sería
-rwxr-----
Cambiar permisos con el modo normal
Para cambiar los permisos utilizamos el comando «chmod» (change modes). Este comando tiene la siguiente sintaxis.
Con el primer argumento especificamos a quien modificamos los permisos: será «u» para el propietario, «g» para el grupo y «o» para otros. Con «a» afectarán a todos, los cambios que apliquemos. Los podemos utilizar combinándolos (ugo). Seguidamente con «+» y «-«, añadiremos o quitaremos permisos. Con «r», «w» y «x» los establecemos. Para terminar nos faltará el nombre del fichero/directorio. Si en vez de introducir el nombre de fichero/directorio, lo sustituimos por un «*», afectará a todos los ficheros del directorio en el que nos encontremos.
Lo vemos con unos ejemplos
Para quitar el permiso de ejecución al propietario
chmod u-x nombre_fichero
Si queremos dar permisos totales al propietario
chmod u+rwx nombre_fichero
Para quitar permiso de ejecución al grupo sería
chmod g-x nombre_fichero
Dar permisos completos a todos
chmod a+rwx nombre_fichero
Cambiar permisos con el modo octal
El formato de los permisos «rwx rwx rwx» puede representarse mediante nueve dígitos utilizando la lógica binaria; de manera que un 1 en un dígito significa que el correspondiente permiso está habilitado y 0 , deshabilitado (o denegado).
Agrupando estos dígitos de tres en tres y obteniendo la representación en octal para cada grupo, el resultado es un número de tres dígitos octales que muestra secuencialmente los permisos para cada uno de los tres grupos. Así, los permisos «rwx r-x r-x» se representarían como «111 101 101» en binario y como «755» utilizando valores octales.
Observa la siguiente tabla de equivalencias
Binario | Octal | Modo de Fichero |
000 | 0 | — |
001 | 1 | –x |
010 | 2 | -w- |
011 | 3 | -wx |
100 | 4 | r– |
101 | 5 | r-x |
110 | 6 | rw- |
111 | 7 | rwx |
Siguiendo las correspondencias de la tabla podemos sustituir los argumentos antes vistos, por la notación octal. Veámoslo con unos ejemplos. Para dar todos los permisos a todos,
chmod ugo+rwx nombre_fichero o chmod a+rwx nombre_fichero
es lo mismo que
chmod 777 nombre_fichero
Para proporcionar permiso de lectura, escritura y ejecución «7» para el usuario, permiso de lectura y escritura «6» para el grupo y, permiso de lectura «4» para otros.
chmod 764 nombre_fichero
Y para dar todos los permisos al propietario y grupo, y de lectura y ejecución a otros
chmod 775 nombre_fichero
Así pues, si no queremos que nadie tenga acceso al fichero/directorio, mas que nosotros mismos con todos los permisos,
chmod 700 nombre_fichero
También lo podemos hacer con el navegador de ficheros en la pestaña «Permisos» del cuadro de diálogo «Propiedades» del fichero en cuestión.
Cambiar el propietario y el grupo de los ficheros
En Sistemas GNU/Linux podemos cambiar la propiedad de los ficheros con el comando «chown». Necesitaremos privilegios de sudo. La sintaxis es la siguiente
sudo chown usuario:grupo nombre_fichero
Con el comando anterior estaríamos cambiando al propietario y al grupo a la vez. Pero también lo podemos hacer por separado, usando, para cambiar el grupo el comando «chgrp». El ejemplo anterior sería
sudo chown usuario nombre_fichero sudo chgrp grupo nombre_fichero
Podemos añadir las opciones «-Rv» para que, con «-R (recursive)» opere sobre directorios con recursividad y con «-v (verbose)» muestre un mensaje por cada fichero/directorio procesado. Con «-c (changes)» actuará como con «verbose», pero informará sólo si se hizo algún cambio.
Permisos especiales
Existen una serie de permisos especiales en GNU/Linux, que, aunque no son habituales, es recomendable conocerlos.
sticky bit
Es un permiso especial que se utiliza sobre directorios. Cuando se asigna este permiso, los elementos que hay en este directorio, solo pueden ser renombrados o borrados por su propietario o por root. Los demás usuarios, que tengan permiso de lectura y escritura, los podrán acceder y modificar pero no renombrar o borrar. La sintaxis es como sigue
chmod 1775 nombre_directorio # En octal chmod a+t /directorio # Modo normal chmod a-t /directorio # Quitar permiso
Veámoslo con un ejemplo. Creamos con el usuario root un directorio público y le otorgamos el permiso especial «sticky bit»
sudo mkdir ~/Ocultar/Compartida sudo chmod 777 ~/Ocultar/Compartida sudo chmod a+t ~/Ocultar/Compartida
Vemos que hemos creado el directorio Compartida, le hemos dado todos los permisos y le hemos añadido el «stiky bit» (añadiendo una «t» al final de los permisos). Ahora podremos comprobar que, cada usuario puede borrar sus propios ficheros, pero otros usuarios no pueden borrar los ficheros de otros usuarios aunque si los pueden modificar.
SUID
Cuando se activa el bit SUID sobre un fichero significa que el que lo ejecute va a tener los mismos permisos que el que creó el fichero. Esto es útil en algunas ocasiones, aunque hay que utilizarlo con cuidado, ya que puede acarrear problemas de seguridad
chmod 4775 nombre_fichero ls -l chmod -x nombre_fichero ls -l
Como podemos ver en la última línea le quitamos el permiso de ejecución al fichero y en los permisos se reemplaza la «s» minúscula por la «S» mayúscula.
SGID (permiso especial usuario efectivo)
El bit SGID es lo mismo que SUID, pero a nivel de grupo. Es decir, todo fichero que tenga activado el SGID, tendrá los privilegios del grupo al que pertenece.
Esta opción es muy útil cuando necesitamos configurar un directorio para que colaboren diferentes usuarios. Si se aplica este bit al directorio, cualquier fichero creado en dicho directorio, tendrá asignado el grupo al que pertenece el directorio.
Por ejemplo, si un usuario que tiene permiso de escritura en un directorio, crea un fichero dentro de este directorio, ese fichero pertenece al mismo grupo que el directorio y no al grupo del usuario.
sudo chmod g+s "directorio" sudo chmod 2555 "fichero"
Lo podemos usar para otorgar permisos a determinados comandos. Por ejemplo, para otorgarle el permiso especial usuario efectivo al comando «fdisk». Si ejecutamos el comando como usuario normal, la salida estandar es «bash: fdisk: orden no encontrada». Es necesario tener privilegios de sudo para ejecutarlo, como vemos en la siguiente captura.
Pero le podemos dar el permiso especial para que lo ejecute un usuario normal con,
sudo chmod u+s /sbin/fdisk
Comprobamos los permisos
Si lo pruebas no te olvides de quitarlo
sudo chmod u-s /sbin/fdisk
Si no te funciona es porque tienes que modificar el PATH. Como el comando está en /sbin/fdisk, tienes que añadir esta ruta a la variable $PATH del usuario. Para ello compruébalo consultando el valor de la variable
$PATH
Y añade, si no está incluida la ruta lo siguiente
export PATH="$PATH:/usr/local/sbin:/usr/sbin"
Y ya podrás ejecutar el comando
fdisk -l
Enlaces
Otros mecanismos que nos proporcionan la gran mayoría de sistemas de ficheros son los que llamamos enlaces. Los enlaces son accesos directos a un fichero, desde otra zona del sistema de ficheros.
Este mecanismo nos permite acceder a directorios o ficheros de forma más rápida y cómoda, sin tener que desplazarnos por la jerarquía de directorios.
En sistemas GNU/Linux tenemos dos tipos de enlaces
Enlace simbólico
Los enlaces simbólicos significan que sólo estamos creando un apuntador o puente hacia el fichero o directorio, de forma que si borrásemos el fichero destino, el enlace no apuntaría a ninguna parte.
Para crear un enlace simbólico tenemos que usar la opción «-s» con el comando «ln». Por ejemplo, para crear un enlace a /etc/network, ejecutaríamos
ln -s /etc/network
Y lo vemos en el entorno gráfico
Enlace fuerte (hard link)
Un enlace fuerte sólo se puede crear entre ficheros o directorios de una misma unidad debido al mecanismo interno que se utiliza para gestionarlos. La sintaxis es la misma pero sin la opción «-s».
A diferencia del enlace simbólico, hace un duplicado del fichero. De hecho, internamente no es exactamente un duplicado, es como dos entradas que apuntan a los mismos datos (inodo). De este modo, si modificamos uno u otro, los dos quedan iguales. La ventaja de este tipo de enlace es que si borramos cualquiera de las dos copias del fichero la otra todavía se conserva.
Por ejemplo, para crear un enlace duro al fichero /etc/apt/sources.list, ejecutaríamos
ln /etc/apt/sources.list
Y con el navegador de ficheros
Para borrarlos
rm -r network sudo rm -r sources.list
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.