
En Linux a parte de los permisos normales, R, W y X, existen otros tres tipos de permisos especiales, que nos podrían ayudar a trabajar de una manera más correcta con ficheros o carpetas, estos son los permisos que aparecen como titulo de la entrada. A continuación hablare de manera rápida de cada uno de ellos, de como funcionan, de como se establecen y como se quitan.
SetUID
El permiso SetUID en un archivo provoca que cualquier usuario que ejecute el fichero obtenga los permisos del propietario del fichero, es decir si tenemos los siguientes permisos:
-rwx—— file.sh
Un usuario que no sea el propietario del fichero no podrá ejecutarlo, ni leerlo, ni escribirlo. Entonces para conseguir que un usuario cualquiera tenga los permisos del propietario del fichero en el momento de ejecutarlo, establecemos el SetUID en el fichero, y lo hacemos de la siguiente manera:
simbolicamente: $chmod u+s file.sh | para removerlo $chmod u-s file.sh
en base octal: $chmod 4700 file.sh | para removerlo $chmod 0700 file.sh
Un ejemplo del uso del permiso SetUID esta en el fichero /etc/shadow, este almacena las contraseñas cifradas de todos los usuarios del sistema, y “solo puede ser escrito por el propietario, que es root, y leído por los usuarios que pertenezcan al grupo del propietario root”, pero lo entrecomillo ya que como todos sabemos, cuando ejecutamos el comando $passwd con cualquier usuario este fichero es modificado, aunque este no sea Root, ni pertenezca al grupo ¿como es posible esto?, pues gracias a que el comando passwd tiene un permiso especial SetUID. Si vemos sus permisos con un ls -l, veremos que en la columna de los permisos del usuario en vez de tener una X, de execute, tiene una s.
-rwsr-xr-x 1 root root 47032 Oct 2013 /usr/bin/passwd
Por tanto cuando se ejecuta este comando se obtienen los permisos del propietario, es decir podemos escribirlo.
También hay que tener en cuenta que el propietario del fichero podría no tener permisos de ejecución sobre el fichero, si esto es así el permiso especial SetUID no haría nada, para observar si se tiene establecido el permiso de ejecución por el propietario o no, Linux nos muestra el permiso estableciendolo con una ‘S’ mayúscula.
-rwS—— file.sh
SetGID
Este permiso especial es similar al SetUID, pero trabaja bajo los permisos del grupo y no del propietario. Este tiene dos formas de funcionar, sobre un directorio o un fichero.
En un fichero es similar a SetUID, trabaja dando los permisos del grupo al usuario que ejecuta el archivo, un ejemplo del uso de este permiso especial esta en el comando $wall
$ ls -l /usr/bin/wall
-rwxr-sr-x. 1 root tty 10996 Oct 21 2013 /usr/bin/wall
Como podemos ver el permiso especial está establecido en el grupo, y que el grupo es tty, esto es porque el comando wall envia mensajes a las terminales y necesita escribir datos en los siguientes ficheros de dispositivos:
$ ls -l /dev/tty?
crw——-. 1 root tty 4, 0 Mar 29 2013 /dev/tty0
crw–w—-. 1 root tty 4, 1 Oct 21 19:57 /dev/tty1
En un directorio actúa estableciendo siempre el grupo del propietario como grupo para todos los ficheros/directorios que se creen dentro del mismo, a modo de ejemplo tenemos el directorio /tmp/data
$ ls -ld /tmp/data
drwxrwsrwx. 2 root demo 4096 Oct 30 23:20 /tmp/data
El grupo del directorio es demo y tiene establecido el permiso especial SetGID, creamos un fichero dentro con un usuario el cual tiene como grupo admin
$touch /tmp/data/file.txt
$ls -l /tmp/data/file.txt
drwxrwsrwx. 2 sysadmin demo 4096 Jun 21 23:25 /tmp/data/file.txt
Como podemos observar el grupo se mantiene, por ende si creamos otro directorio este heredará el mismo grupo y el permiso especial SetGID, y por ende su contenido también tendrá los resultados del permiso especial.
para cambiar los permisos podemos hacerlo de dos maneras:
simbolicamente: $chmod g+s file.sh | para removerlo $chmod g-s file.sh
en base octal: $chmod 2700 file.sh | para removerlo $chmod 0700 file.sh
Sticky bit
El sticky bit se utiliza en directorios compartidos, es decir, directorios en los que muchos usuarios pueden escribir, y como bien sabemos si un usuario puede escribir en un directorio también puede borrar aunque no sea propietario del archivo que borra. Para estos casos se utiliza el sticky bit, para cuando queremos que varios usuarios añadan rchivos, pero solo puedan borrarlos cuando sean propietarios de los mismos.
Para establecer el permiso sticky bit, lo podremos hacer de dos maneras:
simbólicamente: $chmod o+t directorio| para removerlo $chmod o-s directorio
en base octal: $chmod 1700 directorio | para removerlo $chmod 0700 directorio
la salida del comando ls -l muestra el sticky bit como una t en la posición de ejecución de los permisos de Otros:
drwxrwxrwt
Como comentamos una ‘T’ o una “S” mayúscula no significan errores como tal, simplimente indican que el permiso de ejecución no esta establecido en el fichero. Esto es igual para SetUID, SetGID y Sticky Bit.