Comprender y Aplicar Permisos Especiales (SUID, SGID, Bit de Adhesión)
En este paso, explorará los permisos especiales en Linux: SUID (Set User ID), SGID (Set Group ID) y el Sticky Bit. Estos permisos proporcionan un control mejorado sobre la ejecución de archivos y el comportamiento de los directorios.
Los permisos especiales se representan mediante un dígito adicional en el modo de permiso octal, colocado antes de los tres dígitos estándar (propietario, grupo, otros).
- SUID (Set User ID):
- Valor octal: 4
- Efecto en archivos: Cuando se ejecuta un archivo ejecutable con SUID, se ejecuta con los permisos del propietario del archivo, no del usuario que lo ejecutó. Esto se usa comúnmente para programas que necesitan privilegios elevados para realizar ciertas tareas, como el comando
passwd (que necesita escribir en /etc/shadow, un archivo propiedad de root).
- En la salida de
ls -l: Una s aparece en lugar del permiso de ejecución x del propietario. Si el propietario no tiene permiso de ejecución, aparece una S mayúscula.
- SGID (Set Group ID):
- Valor octal: 2
- Efecto en archivos: Similar a SUID, pero el ejecutable se ejecuta con los permisos del propietario del grupo del archivo.
- Efecto en directorios: Los archivos y subdirectorios creados dentro de un directorio habilitado para SGID heredan la propiedad del grupo de ese directorio, en lugar del grupo principal del usuario que los creó. Esto es muy útil para directorios compartidos donde todos los archivos deben pertenecer a un grupo específico.
- En la salida de
ls -l: Una s aparece en lugar del permiso de ejecución x del grupo. Si el grupo no tiene permiso de ejecución, aparece una S mayúscula.
- Sticky Bit:
- Valor octal: 1
- Efecto en archivos: Ninguno.
- Efecto en directorios: Los usuarios pueden crear archivos en el directorio, pero solo pueden eliminar o renombrar archivos que les pertenezcan. Esto evita que los usuarios eliminen o muevan archivos de otros usuarios en un directorio compartido (por ejemplo,
/tmp).
- En la salida de
ls -l: Una t aparece en lugar del permiso de ejecución x de otros. Si otros no tienen permiso de ejecución, aparece una T mayúscula.
Demostremos estos permisos especiales.
Ejemplo de SUID
Crearemos un programa C simple que intenta leer un archivo restringido.
Primero, cree un archivo que solo root pueda leer:
sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt
Verifique sus permisos:
ls -l ~/project/secret_data.txt
Salida:
-rw------- 1 root root 0 Jun 6 17:36 /home/labex/project/secret_data.txt
Ahora, cree un programa C read_secret.c que intente leer este archivo:
nano ~/project/read_secret.c
Pegue el siguiente código en read_secret.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE *fp;
char buffer[256];
printf("Attempting to read /home/labex/project/secret_data.txt...\n");
fp = fopen("/home/labex/project/secret_data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
printf("Successfully read file.\n");
return 0;
}
Guarde y salga de nano (Ctrl+S, Ctrl+X).
Compile el programa:
gcc ~/project/read_secret.c -o ~/project/read_secret
Ahora, intente ejecutarlo como labex:
~/project/read_secret
Debería ver un mensaje "Error opening file: Permission denied", ya que labex no tiene acceso de lectura a secret_data.txt.
Ahora, hagamos que read_secret sea propiedad de root y establezcamos el bit SUID.
sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret
Verifique los permisos:
ls -l ~/project/read_secret
Salida:
-rwsr-xr-x 1 root root 17704 Jun 6 01:02 /home/labex/project/read_secret
Observe la s en el conjunto de permisos del propietario. Ahora, ejecute el programa de nuevo como labex:
~/project/read_secret
Esta vez, debería leer el archivo con éxito (aunque está vacío, por lo que no se imprimirá ningún contenido, pero el mensaje "Successfully read file." indica éxito). Esto se debe a que el bit SUID hizo que el programa se ejecutara con los permisos de root.
Ejemplo de SGID (en Directorio)
Creemos un directorio compartido y un nuevo grupo.
sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir
Ahora, establezca el bit SGID en shared_dir:
sudo chmod g+s ~/project/shared_dir
Verifique los permisos:
ls -ld ~/project/shared_dir
Salida:
drwxrws--- 2 labex shared_group 6 Jun 6 01:02 /home/labex/project/shared_dir
Observe la s en el conjunto de permisos del grupo.
Ahora, cree un archivo dentro de shared_dir:
touch ~/project/shared_dir/new_file.txt
Verifique la propiedad de new_file.txt:
ls -l ~/project/shared_dir/new_file.txt
Salida:
-rw-r--r-- 1 labex shared_group 0 Jun 6 01:02 /home/labex/project/shared_dir/new_file.txt
Aunque el grupo principal de labex es labex, el new_file.txt heredó la propiedad del grupo shared_group de shared_dir debido al bit SGID.
Ejemplo de Sticky Bit
El directorio /tmp es un ejemplo clásico de un directorio con el sticky bit establecido. Creemos un directorio similar.
sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload
El 1 en 1777 es el valor octal para el sticky bit. 777 otorga permisos completos al propietario, grupo y otros.
Verifique los permisos:
ls -ld ~/project/public_upload
Salida:
drwxrwxrwt 2 root root 6 Jun 6 01:02 /home/labex/project/public_upload
Observe la t en el conjunto de permisos de otros.
Ahora, simulemos que otro usuario crea un archivo en este directorio. Como solo tenemos el usuario labex, crearemos un archivo como labex y luego intentaremos eliminarlo después de cambiar su propiedad a root (simulando a otro usuario).
Cree un archivo como labex:
touch ~/project/public_upload/labex_file.txt
Cambie su propiedad a root:
sudo chown root:root ~/project/public_upload/labex_file.txt
Ahora, intente eliminar labex_file.txt como labex:
rm ~/project/public_upload/labex_file.txt
Verá un mensaje que le pregunta si desea eliminar el archivo protegido contra escritura, y después de confirmar con y, obtendrá un error "Operation not permitted". Esto se debe a que el sticky bit impide que los usuarios eliminen archivos que no les pertenecen dentro de ese directorio, aunque labex tenga permiso de escritura en el directorio public_upload. Solo root o el propietario de labex_file.txt (root en este caso) pueden eliminarlo.
Para limpiar, necesitará sudo para eliminar labex_file.txt:
sudo rm ~/project/public_upload/labex_file.txt
Limpieza
Elimine los archivos y directorios creados, y el usuario/grupo:
sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group