Permisos y Propietarios en Linux
Table of Contents
ToggleIntroducción
Linux asocia cada archivo con un número de propiedades por seguridad y otras razones, conocidas como permisos, son atributos especiales que controlan la capacidad de los usuarios para realizar varias operaciones sobre ellos. En esta página explicaremos los permisos y propietarios de forma detallada que se disponen en los sistema Linux.
¿Qué son los permisos en Linux?
Los sistemas estilo Unix tales como Linux, son inherentemente sistemas operativos multiusuarios, y tienen la necesidad de proporcionar mejor control, para que un usuario con intenciones maliciosas no pueda interferir con otros archivos de usuarios. Por ejemplo, un usuario puede tener información sensible que otro usuario puede querer acceder. Sin permisos de archivos, el otro usuario puede ser capaz de acceder a ellos. Pero con los permisos debidamente configurados, el usuario no puede leer el archivo.
Cada archivo, directorio, o dispositivo tiene un grupo de permisos asociados con él. Estos permisos son visibles con el comando ls y la opción –l (lista) ,
Por ejemplo:
# ls –l
Partimos esta cadena en cuatro secciones:
Descripción y significados
Campos | Descripción | Información/Significado |
1 | Tipo | – (Archivo) d (Directorio) l (link simbólico) b (dispositivo de bloque) c (dispositivo de caracter) s (socket) |
2 | Permisos de Usuarios | Asociado al usuario que lo creó |
3 | Permisos de Grupos | Asociado al grupo del usuario |
4 | Permisos de Otros | Cualquier otro que no sea el usuario o no esté en el grupo |
5 | Links asociados o directorios contenidos | |
6 | Usuario propietario | |
7 | Grupo | |
8 | Tamaño | |
9 | Fecha | |
10 | Fecha y Hora | |
11 | Nombre de archivo/directorio |
Permisos de usuario
En cada bloque de tres los caracteres r , w , y x significan que el archivo puede ser leído (Read), escrito/modificado (Write), o ejecutado (eXecute).
Un guión significa que el permiso no está puesto (por ejemplo, arriba, el archivo test.txt se puede leer y modificar por el propietario, pero no se puede ejecutar).
Por ejemplo:
r-x significa que los permisos de lectura y ejecución están puestos, pero no el de escritura.
Como regla, es más fácil utilizar la sigla U.G.O (Usuarios, Grupos y Otros), a cada grupo de tres caracteres le pertenecen los permisos correspondientes.
Cuando hablamos de ‘otros’ es todo aquel que no sea el usuario propietario, ni se encuentre en el grupo definido del archivo.
Otra forma de ver los permisos de manera más detallada es la siguiente:
$ stat /bin/bash
De esta forma, estamos viendo los atributos generales que posee un inodo, que es el objeto que representa los datos dentro del sistema de archivos.
Los componentes informativos de un fichero están compuestos por un campo y tres secciones, que son las siguientes:
Permiso r
Permite la lectura (Read) de un archivo. Éste es el único permiso necesario para copiar un archivo. Cuando se aplica a un directorio, se pueden leer o ver sus archivos.
Permiso w
Permite escribir (Write) en un archivo. Con él se pueden cambiar, modificar o sobreescribir los contenidos del archivo. Cuando se aplica en un directorio, este permite borrar y mover archivos incluso si no se tiene el permiso de escritura específica sobre el archivo individual.
Permiso x
Permite de ejecutar (eXecute) un archivo. Aplicado a un directorio, este permite el acceso al mismo. Cuando se aplica a un conjunto con permisos de lectura dentro de un directorio, este permite buscar dentro de dicho directorio.
En el caso que notemos que falte uno de estos permisos veremos un línea ‘–‘, la cual significa que hay un permiso sin asignar. Por ejemplo, r-x indica que ese usuario puede leer y ejecutar, pero no escribir.
A continuación estaremos detallando algunos comandos para la configuración de permisos:
Comando chmod
Muchos permisos se ponen automáticamente cuando se crea un archivo. Estos permisos están basados en el usuario, las preferencias administrativas y los datos. chmod ( change mode ) permite cambiar los permisos de acceso de un archivo o directorio.
La sintaxis básica de esta utilidad es la siguiente:
# chmod [modificadores] (opciones) {archivo/directorio}
Donde los modificadores son los permisos antes vistos. Se pueden utilizar muchas opciones con el comando chmod. Las utilizadas más frecuentemente son los siguientes:
-v Lista los archivos y directorios a los que se les va aplicando el comando, a medida que el mismo se ejecuta.
-R Aplica el comando chmod recursivamente a todos los archivos y subdirectorios.
Cambiar permisos:
A cada archivo se le asigna automáticamente un conjunto de permisos, que se puede definir con el comando umask. Para cambiar los permisos predeterminados, se usa el comando chmod , que modifica los permisos de lectura, escritura, y ejecución para el usuario, grupo y otros.
La forma que tenemos de poder cambiar los permisos son con letras o números. Con letras podemos hacerlo utilizando u, g, o, a (usuario, grupo, otros, todos los permisos)
Por ejemplo:
Agregar ejecución y quitar escritura al usuario, agregar lectura y escritura a otros.
# chmod u+x,u-w,o+rw hola.txt
Defino para usuario grupo y otros lectura y escritura en el archivo test.txt
# chmod ugo=rw test.txt
Agregar ejecución para usuario, grupo y otros.
# chmod a=x test.txt
Defino lectura y escritura para el usuario para el directorio etc de manera recursiva.
# chmod -R u=rw etc
De esta forma, lo que podemos hacer es + agregar un permiso, – quitar un permiso o = igualar un permiso a todos esos valores. También, contamos con la manera numérica para poder definir los permisos.
Permisos númericos:
4 Lectura
2 Escritura
1 Ejecución
0 Ningún permiso
Para definir los permisos de manera numérica a un archivo o directorio hay que ingresar tres números, el primero será para los permisos de Usuario, el segundo para el Grupo y el tercero para Otros.
Definir lectura para el usuario y el grupo, los demás nada:
# chmod 440 test.txt
Cuando se quiere definir más de un permiso lo que se hace es combinar los valores
Definir todo para el usuario, lectura y ejecución para el grupo y lectura para otros:
# chmod 754 test.txt
En este ejemplo el 7 es el resultado de la suma de 4 (lectura), 2 (escritura) y 1 (ejecución). Definiendo la totalidad de los permisos para el usuario propietario. Luego para el grupo tiene el valor 5 de la suma de los valores 4 (lectura) y 1 (ejecución). Por último, para otros solo el permiso de la lectura 4
Comando chown
El comando chown cambia el propietario de cada archivo, usuario o grupo, pero sólo si se le especifica un nombre de usuario (o UID numérico); entonces, ese usuario se convierte en el propietario de cada archivo dado, y el grupo al que pertenece, no cambia. Si al nombre de usuario lo sigue un signo de dos puntos y un nombre de grupo o GID numérico, sin espacios entre ellos, entonces, también se cambia el grupo al que pertenece cada archivo.
La sintaxis básica de esta utilidad es la siguiente:
# chown [opciones] usuario:grupo fichero
Se pueden utilizar opciones con el comando chown. Las utilizadas más frecuentemente son las que se muestran en la siguiente tabla:
Opciones:
-c Muestra un mensaje donde menciona solamente aquellos ficheros cuyo propietario cambia realmente.
-f No muestra mensajes de error sobre ficheros cambiarse.
-R Cambia de forma recursiva el propietario de directorios y sus contenidos.
-v Describe la acción efectuada (o no) para cada fichero de forma interactiva.
Ejemplo:
Asignar el propietario usuario1 al directorio /directorio1 de manera recursiva (a todo su contenido)
# chown -R usuario1 /directorio1
El comando chgrp se usa para cambiar solamente el grupo propietario de un archivo o directorio. El comando busca en el fichero /etc/group para confirmar la existencia del grupo especificado antes de cambiar los permisos.
La sintaxis básica de esta utilidad es la siguiente:
# chgrp [opciones] grupo fichero
Se pueden utilizar opciones con el comando chgrp . Las utilizadas más frecuentemente son las que se muestran a continuación.
Opciones:
-c Muestra un mensaje donde menciona solamente aquellos ficheros cuyo propietario cambia realmente.
-h Actúa sobre enlaces simbólicos propiamente en vez de sobre lo que apunten. Disponible solamente si el sistema proporciona la primitiva lchown
-f No muestra mensajes de error sobre ficheros cuyo grupo no pueda cambiarse.
-R Cambia recursivamente el grupo al que pertenecen directorios y sus contenidos. (Y continúa incluso si se encuentran errores.)
-v Describe la acción efectuada (o no) para cada fichero de forma interactiva.
El usuario root puede efectuar los cambios al grupo que desee; para que un usuario pueda hacerlo, debe ser el propietario del archivo y pertenecer al grupo donde está efectuando el cambio.
Comando umask
Se utiliza para visualizar/configurar la máscara de permisos para creación de archivos y directorios.
Algunos ejemplos:
$ umask –p
umask 0002
$ umask –S
u=rwx,g=rwx,o=rx
El umask es la inversa del chmod . En el caso de umask el valor 022 es el equivalente a 755 en chmod. El umask lo podemos calcular como la cantidad de números que faltan para llegar a 7 .
En el caso de definir un umask 000 al crear un archivo el permiso máximo chmod será 666, en cambio para un directorio será 777 .
En el resultado del comando se ven cuatro cifras. La primera es la que va a definir el SUID, SGID o Stickybit.
Permisos Especiales
Los sistemas UNIX emplean, típicamente, tres permisos o modos adicionales. Estos permisos especiales se asignan a archivos o directorios en conjunto, no a cada clase de forma separada (como sucedía con los permisos básicos).
Estos tres permisos, un bit por cada uno de ellos, permiten 8 combinaciones posibles que se expresan con un dígito en base 8 (del 0 al 7, uno por cada combinación posible) que se antepone al modo de permisos. Así, el modo se ampliaría ahora del 0000 al 7777 .
Pueden ser utilizados 3 tipos de permisos en determinadas circunstancias. Aparte de los siempre aplicables de lectura, escritura y ejecución, algunas veces es necesario algo más para un archivo o directorio.
Estos permisos especiales son los 3 siguientes:
- Asignar ID de usuario (set user ID) (SUID)
- Asignar ID de grupo (set group ID) (SGID)
- Sticky bit
SUID
Permiso set user ID, setuid o SUID:
Cuando un archivo tiene este permiso asignado y es ejecutado, el proceso resultante asumirá el ID de usuario efectivo del propietario del archivo. El ejemplo típico es el cambio de una clave de usuario: ningún usuario debería poder modificar /etc/shadow directamente. La única forma de poder modificarlo debería ser a través del comando correspondiente, que necesariamente tendrá que tener asignado el setuid . Es decir, el comando /usr/bin/passwd ejecutado por un usuario se ejecutará como si lo hubiese invocado el root , de manera de poder modificar /etc/shadow.
Ejemplo:
Se puede ver que en los permisos del usuario aparece una “ s ” en vez de una “ x ”
# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 42345 Oct 23 2022 /usr/bin/passwd
Este permiso se puede setear con:
# chmod 4655 archivo
# chmod u+s archivo
Para ver todos los archivos que hay con este permiso en el sistema:
# find / -perm -4000 2>/dev/null
SGID
Permiso set group ID, setgid o SGID: cuando un archivo que tiene este permiso asignado se ejecuta, el proceso resultante asumirá el ID de grupo efectivo definido en el archivo. Cuando el setgid le es asignado a un directorio, todo archivo y directorio creado por debajo de este heredarán dicho permiso, a diferencia del comportamiento por defecto que es usar el grupo primario del usuario efectivo al asignar el grupo de archivos nuevos y directorios.
Ejemplo:
$ ls -ld /directory
drwxr-sr-x 2 usuario usuario 4096 Oct 15 14:13 /directory
$ sudo mkdir /directory/new_directory
$ ls -ld /new_directory
drwxr-sr-x 2 root usuario 4096 Oct 15 14:15 new_directory
Este permiso se puede setear con:
# chmod 2755 directorio (o un archivo)
# chmod g+s directorio (o un archivo)
Ver todos los archivos que hay con ese permiso en el sistema:
$ find / -perm -2000 2>/dev/null
Sticky Bit
Este permiso no trabaja como los otros permisos especiales. Con un valor numérico de 1000, sus operaciones difieren cuando están aplicadas a un directorio o a un archivo. Cuando está aplicado a un directorio, evita que los usuarios borren archivos de las carpetas que les conceden el permiso de escritura, a menos que sean el propietario del archivo. Por defecto, cualquier usuario que tenga permiso de escritura en un directorio puede borrar archivos dentro de ese directorio, incluso si no tiene el permiso de escritura de ese archivo. Hoy en día con las técnicas actuales de administración de memoria ya quedó en desuso.
Cuando se aplicaba sobre un archivo, el archivo se convertía en “sticky” (bloqueado). La primera vez que se accedía o se ejecuta el archivo y se carga en memoria, permanecía cargado en memoria de modo que pudiera iniciar más rápidamente. Si el archivo no es ejecutable, el último bit de permiso se convierte en “ T ”. Si el archivo es un fichero ejecutable, o el permiso se aplica a un directorio, el bit pasado se convierte en una “ t ”. Cuando se aplica el permiso chmod y las letras, aparece “ t ” de todos modos (sea archivo o directorio).
El directorio /tmp cuenta con este permiso activo, porque es un directorio en el que todos los usuarios tienen permiso de escritura, pero nadie podrá borrar ningún archivo que no le pertenezca.
Ejemplos:
Este permiso se puede setear con
# chmod 1755 directorio (o un archivo)
# chmod o+t directorio (o un archivo)
$ ls -ld /tmp
drwxrwxrwt 23 root root 41132 Oct 12 14:13 /tmp
Ver todos los archivos que hay con ese permiso en el sistema:
# find / -perm -1000 2>/dev/null
Si desea saber sobre los permisos de usuarios en Sistemas Windows, ya sea para que vea las diferencias o comparaciones con Linux, le recomiendo que lea el artículo LSP en Windows de nuestro blog.