En Unix existen tres bits de permisos especiales que pueden ser asignados a directorios y/o ficheros ejecutables, setuid (set user information), setgid (set group information) y sticky.
setuid
EL bit setuid es asignable a ficheros ejecutables, y permite que cuando un usuario ejecute dicho fichero, el proceso adquiera los permisos del propietario del fichero ejecutado. El ejemplo más claro de fichero ejecutable y con el bit setuid el su
.
su
sirve para ejecutar una shell con identificadores de grupo y de usuario distintos al nuestro, por ello ha de tener este bit y así permitir adquirir al usuario temporalmente permisos administrativos para poder hacer el cambio de usuario.
Podemos ver que el bit está asignado (s) haciendo un ls:
$ ls -l /bin/su -rwsr-xr-x 1 root root 31012 2009-04-04 07:49 /bin/su
Para asignar este bit a un fichero:
# chmod u+s /bin/su
Y para quitarlo:
# chmod u-s /bin/su
Lógicamente, conviene utilizar este bit con extremo cuidado ya que puede provocar una escalada de privilegios en situaciones inseguras. Para que veáis un ejemplo de lo que se podría hacer.
El usuario «alex» no tiene permisos para ejecutar correctamente un fdisk -l:
alex@linux:~$ fdisk -l
La salida es 0, pero si asignamos el bit setuid al binario de fdisk…
# ls -l /sbin/fdisk -rwsr-xr-x 1 root root 93048 2009-02-18 20:43 /sbin/fdisk
Probamos de nuevo a ejecutar fdisk con el usuario «alex» y conseguimos privilegios de root:
alex@linux:~$ fdisk -l Disco /dev/sda: 160.0 GB, 160041885696 bytes 255 cabezas, 63 sectores/pista, 19457 cilindros Unidades = cilindros de 16065 * 512 = 8225280 bytes Identificador de disco: 0x000c3c51 Dispositivo Inicio Comienzo Fin Bloques Id Sistema /dev/sda1 * 1 3232 25959424 7 HPFS/NTFS /dev/sda2 3233 9683 51817657+ 83 Linux /dev/sda3 9684 9855 1381590 82 Linux swap / Solaris /dev/sda4 9856 19457 77128065 83 Linux
Luego nos acordamos de volver a quitarlo:
# chmod u-s /sbin/fdisk
setgid
Si el bit setuid permitía que el proceso adquiriera los permisos del propietario del fichero ejecutado, setgid hace lo mismo pero adquiriendo los privilegios del grupo asignado al fichero, también es asignable a directorios. Este bit entonces será muy útil cuando varios usuarios de un mismo grupo necesiten trabajar con recursos dentro de un mismo directorio.
En el siguiente ejemplo asignamos el bit setgid la carpeta /compartido, le asignamos permisos totales para el propietario y el grupo (770) y el bit segid (2):
$ mkdir compartido && chmod 2770 /compartido
Si hacemos un ls veremos el bit asignado:
$ ls -l drwxrws--- 2 alex alex 4096 2011-04-24 21:27 compartido
Ahora vamos a hacer la prueba de crear un fichero dentro del directorio. Lo vamos a crear estando autenticados como root, pero al tener el bit setgid le asignará el grupo «alex» en lugar de root.
$ su # touch test root@sistemas:/home/alex/compartido# ls -l total 0 -rw-r--r-- 1 root alex 0 2011-04-24 21:28 test # whoami root
En lugar de modo octal podéis asignar también los permisos setgid del siguiente modo:
$ chmog g+s /compartido
Y quitarlo:
$ chmog g-s /compartido
sticky
Este bit suele asignarse en directorios a los que todos los usuarios tienen acceso, y permite evitar que un usuario pueda borrar ficheros/directorios de otro usuario dentro de ese directorio, ya que todos tienen permiso de escritura. Seguro que lo estáis pensando, este bit se asigna siempre en /tmp y /var/tmp.
tmp tiene permisos 777, el bit sticky se asignaría del siguiente modo:
# chmod 1777 /tmp
También así:
chmod o+t /tmp
Y para quitarlo:
chmod o-t /tmp
Si hacemos un ls veremos la «t» asignada:
drwxrwxrwt 13 root root 4096 2011-04-24 20:55 tmp
Esta es una visión general de estos tres bits especiales asignables a ficheros ejecutables y directorios en Unix/Linux.