En este momento estás viendo Permisos en ficheros y directorios en sistemas GNU/Linux

Permisos en ficheros y directorios en sistemas GNU/Linux

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ís­tica 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

BinarioOctalModo de Fichero
0000
0011–x
0102-w-
0113-wx
1004r–
1015r-x
1106rw-
1117rwx

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

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.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.