Apuntes sobre permisos

 

Todos los usuarios del sistema están listados en el archivo /etc/passwd. Algunos se crean automáticamente en la instalación del sistema operativo o con la instalación de ciertas aplicaciones. Son los llamados usuarios de sistema o especiales. Ejemplos de estos “usuarios” son mysql, www-data, mail, pulse, irc, games…

# cat /etc/passwd

Aquí nos centraremos en los usuarios standard que representan las cuentas de usuarios individuales y pueden haber tantos como se requiera. Pueden tener directorio personal dentro de la /home con la configuración de sus servicios o pueden carecer de directorio personal.

Para simplificar la gestión de permisos entre tantos usuarios, Linux agrupa todos los usuarios dentro de grupos. De este modo, a la hora de especificar ciertos permisos sobre un conjunto de usuarios, se pueden establecer los permisos directamente sobre el grupo. Cada grupo se identifica por un Group ID o GUID.

Cada usuario pertenece por defecto a un grupo con el mismo nombre y que se conoce como grupo principal o grupo primario de usuario. Además, un usuario puede estar dentro de otros grupos, que serían los grupos secundarios.

Los grupos quedan registrados en el archivo /etc/group:

# cat /etc/group

Todos los archivos y directorios en Linux son propiedad de un usuario y de un grupo y sobre cada archivo recaen unos permisos relativos al usuario, al grupo y al resto de usuarios o de grupos.

Permisos de Usuario, Grupo y Otros

Todos los archivos y directorios en Linux tienen asociado un grupo de permisos que define las posibilidades de lectura, escritura y ejecución que se aplican al usuario propietario del archivo (u), al grupo de usuarios al que pertenece (g), al resto de usuarios que no pertenecen al grupo del usuario (o) y a todos que incluye al usuario, al grupo y a los otros (a) que vienen establecidos por umask y que por defecto son 755 para directorios (rwxr-xr-x) y 644 para ficheros (-rw-r–r–).

$ umask
0022

Para conocer los permisos reales a partir del número que muestra umask (0022) ha de restarse este número de 0777 (rwxrwxrwx), en el caso de directorios y de 0666 (rw-rw-rw-) en el caso de ficheros. Esta diferencia entre ficheros y directorios viene motivada por estar excluido el bit de “ejecución” (x) para el caso de los ficheros quedando su activación reservada para el administrador del sistema.

0777 – 0022 = 0755
0666 – 0022 = 0644

Podemos modificar estos permisos que vienen definidos por defecto ejecutando:

$ umask 077
$ touch archivo.txt
$ mkdir directorio

$ ls -ld archivo.txt directorio

drwx—— 2 templix templix 4096 2007-02-01 02:21 directorio
-rw——- 1 templix templix 0 2007-02-01 02:21 archivo.txt

Veamos que ocurre si pretendemos activar el bit de ejecución (x) con umask:

$ umask 255

Con lo que tendremos, para los nuevos directorios unos permisos de 522 y para los nuevos archivos, que les correspondería 411, se convierte en 422. Comprobamos los nuevos valores creando un directorio y un archivo:

$ mkdir DIR
$ touch archivo
$ ls -l
-r—w–w- 1 templix templix 0 jul 12 21:08 archivo
dr-x-w–w- 2 templix templix 4096 jul 12 21:07 DIR

Volvemos a modificar umask:

$ umask 244

Volvemos a crear un directorio y un archivo para comprobar que los permisos de “archivo” son los mismos que con un umask 255 mientras que los del directorio si han cambiado a 533:

$ mkdir DIR
$ touch archivo
$ ls -l
-r—w–w- 1 templix templix 0 jul 12 22:02 archivo
dr-x-wx-wx 2 templix templix 4096 jul 12 22:02 DIR

Si quisieramos establecer unos permisos concretos, por ejemplo 733 para directorios y 622 para archivos, de forma permanente podríamos añadir a .bashrc la linea:

umask 044

Representación estándar de los permisos

Los permisos asociados a un archivo o carpeta se suelen representar en línea. El primer carácter define el tipo de archivo, seguido de tres caracteres para los permisos del propietario del archivo, otros tres para los permisos del grupo y los tres últimos para los permisos del resto de usuarios. Un clásico “ls -l” podría mostrar:

$ ls -l
drwxr-xr-x 2 templix templix 4096 jul 12 19:14 DIR

Nos centraremos en los 10 primeros caracteres que son los que indican los permisos y los separaremos por grupos según se refieran a los permisos del usuario propietario, los permisos del grupo al que pertenece el usuario y a los otros usuarios que no pertenecen a estos dos primeros grupos:

d rwx r-x r-x

El primer bit indica el tipo de archivo:

– = Se trata de un archivo regular
d = Es un directorio
l = Es un enlace simbólico
b = indica un archivo especial de bloques como un disco rígido o un cd-rom
p = Es una tubería
s = Un socket
c = Es un dispositivo de caracteres como una tty o una impresora

El resto de los 9 bits que vienen a continuación representan los permisos del usuario propietario del archivo o directorio (rwx), los permisos del grupo al que pertenece este usuario (r-x), y los permisos del resto de usuarios (r-x):

r  Permisos de lectura
w Permisos de escritura
x Permisos de ejecución
–  No se da el permiso del lugar que ocupa en la cadena.

Equivalencias:

rwx (7) Lectura, escritura y ejecución
rw- (6) Lectura, escritura
r-x  (5)  Lectura y ejecución
r–  (4) Lectura
-wx  (3) Escritura y ejecución
-w- (2) Escritura
–x  (1) Ejecución
— (0) Sin permisos

Algunos ejemplos de como se establecen con su equivalente en octal:

chmod u=rwx,g=rw,o=rx  (chmod 765) 
chmod u=rwx,g=rx,o=  (chmod 760)
chmod u=rw,g=r,o=rw  (chmod 646)
chmod u=rw,g=r,o=x  (chmod 641)
chmod u=rw,go=  (chmod 600) 
chmod u=rwx,go=x  (chmod 711)
chmod a=rx  (chmod 555)

Las características de estos permisos varian sensiblemente si se refieren a archivos o a directorios:

Referidos a un archivo

Lectura (r): Poder leer su contenido y borrar el archivo pero no modificarlo.
Escritura (w): Modificar el contenido por tuberia pero sin visualizar su interior. Podemos borrarlo
Ejecución (x): Poder ejecutarlo si es un script pero sin visualizarlo ni escribir en él. Podemos borrarlo

Referidos a un directorio

Lectura (r): Poder listar su contenido pero no acceder a ningún archivo aunque tenga todos los permisos (777) ni borrarlos
Escritura (w): Un directorio con solo este permiso no permite hacer nada, ni listar, ni escribir en su interior, ni borrar, ni entrar…
Ejecución (x): Capacidad de entrar en su interior (cd) pero no listar el contenido aunque si sabemos los nombres de los archivos podemos editarlos y escribir en ellos.
Permisos Especiales

Adicionalmente, existen tres tipos de permisos especiales denominados: setuid, setgid y sticky bit y que determinan ciertos tipos de permisos que no quedan cubiertos con los anteriores. De modo general los permisos setuid/setgid permiten que un proceso lanzado por un usuario se ejecute con euid/egid de otro usuario. Un ejemplo podria ser el programa passwd.

# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54192 nov 20 2014 /usr/bin/passwd

Cuando un usuario ejecuta “passwd” para cambiarse la contraseña, el proceso modifica el fichero /etc/shadow propiedad de root mientras que el usuario no puede ni hacer un “cat” a dicho fichero.

setuid: El bit setuid (valor octal es 4000) se puede asignar a archivos ejecutables y establece que el proceso vinculado al archivo pueda adquirir los permisos del propietario del archivo en el momento de su ejecución. Se utiliza para que un usuario normal pueda ejecutar un archivo con permisos elevados y se refleja con una “s” en el lugar que tendría que ocupar la “x” de ejecutable del propietario. Algunos ejemplos:

$ ls -al /usr/bin/sudo
-rwsr-xr-x 1 root root 128592 feb 23 17:05 /usr/bin/sudo
$ ls -al /bin/su
-rwsr-xr-x 1 root root 40168 nov 20 2014 /bin/su

Para establecer este tipo de permiso se usa cualquiera de las dos opciones:

# chmod 4775 script.sh
# chmod u+s script.sh

Para conocer todos los ejecutables que existen en el sistema con setuid activado:

# find / -type f -perm -4000 -print 2>/dev/null

Un ejemplo práctico:

El comando fdisk ha de lanzarse como root:

# ls -l /sbin/fdisk
-rwxr-xr-x 1 root root 105176 mai 31 17:02 /sbin/fdisk
# fdisk -l

Si lo lanzamos como usuario normal nos da error. Le asignamos el bit setuid:

# chmod 4755 /sbin/fdisk
# ls -l /sbin/fdisk
-rwsr-xr-x 1 root root 105176 mai 31 17:02 /sbin/fdisk

Ya lo podemos lanzar como usuario sin privilegios (En debian ha de colocarse la rutas absoluta):

$ /sbin/fdisk -l

Para volver a los permisos originales:

# chmod 0755 /sbin/fdisk

setgid: El bit setgid (valor octal de 2000), de forma análoga al caso de setuid, determina que un archivo se pueda ejecutar por todo el grupo con los mismos privilégios del propietario y se refleja con una “s” en el lugar que tendría que ocupar la “x” de ejecutable del grupo del propietario. Un ejemplo práctico sobre su uso:

$ mkdir PRUEBAS
$ ls -ld PRUEBAS
drwxr-xr-x 2 templix templix 4096 jul 12 13:25 PRUEBAS

Ahora, en este directorio creamos dos ficheros, uno como root y otro como usario normal:

# touch PRUEBAS/file.txt
$ touch PRUEBAS/archivo.txt

Comprobamos los permisos:

$ ls -l PRUEBAS
-rw-r–r– 1 templix templix 0 jul 12 16:54 archivo.txt
-rw-r–r– 1 root root 0 jul 12 16:52 file.txt

Vemos que file.txt pertenece a root del grupo root y por tanto, como usuario normal, este archivo no podrá ser eliminado. Modificamos los permisos del directorio, como usuario normal, añadiendo el bit setgid:

$ chmod 2755 PRUEBAS (chmod g+s PRUEBAS)
$ vdir

drwxr-sr-x 2 templix templix 4096 jul 12 10:45 PRUEBAS

Creamos un archivo como root:

# touch PRUEBAS/fichero.txt

Comprobamos nuevamente permisos:

$ ls -l PRUEBAS
-rw-r–r– 1 templix templix 0 jul 12 17:12 archivo.txt
-rw-r–r– 1 root templix 0 jul 12 17:16 fichero.txt
-rw-r–r– 1 root root 0 jul 12 17:12 file.txt

Vemos que fichero.txt creado por root ya no pertenece al grupo root sino al grupo del usuario (templix) y, aunque file.txt continue figurando como perteneciente al grupo root, en realidad tambien pertenece al grupo del usuario propiedad del directorio, por tanto como usuario normal podremos eliminar los dos archivos propiedad de root:

$ rm PRUEBAS/fichero.txt
$ rm PRUEBAS/file.txt

Resumiendo: En un directorio con setgid activado, en el que varios usuario crean archivos, cada usuario podrá añadir, borrar o modificar los archivos de su propiedad, pero solo el propietario del directorio podrá incidir en todos los archivos ya que todos los ficheros o directorios que se creen o copien en un directorio con setgid activado, adquirirán las características del directorio padre.

Para conocer todos los ejecutables que existen en el sistema con setgid activado:

# find / -type f -perm -2000 -print 2>/dev/null

sticky: el bit sticky (con valor octal de 1000) solo se aplica a directorios y se usa basicamente para permitir que varios usuarios puedan crear ficheros o directorios en ese directorio pero que cada uno solo pueda modificar o borrar los de su propiedad. Naturalmente el propietario de este directorio o root podrán interactuar con cualquier archivo de su interiorr. Este bit prevalece sobre el resto de permisos. Se refleja con una “t” en el lugar que tendría que ocupar la “x” de ejecutable del grupo “otros”.

$ ls -al /

drwxrwxrwt 25 root root 4096 jul 12 10:17 tmp

El sistema para establecer este tipo de permiso es con alguna de las siguientes opciones:

# chmod 1777 dir
# chmod a+t dir

Aunque no muy común, tambien existen ejecutables, archivos o directorios que pueden tener setgid, setuid y sticky activados simultaneamente. En este caso los octales que los identifican son 5000 (4000+1000), 6000 (4000+2000) y 7000 (4000+2000+1000) y se crean:

# chmod 6755 script.sh
# chmod 7777 dir

Un caso especialísimo: Ejecutar binarios sin permisos de ejecución

En el caso que tengamos un binario sin permisos de ejecución, pero aún tengamos permisos de lectura sobre éste lo podemos ejecutar mediante la libreria ld-linux:

32 bits: /lib/ld-linux.so.2
64 bits: /lib64/ld-linux-x86-64.so.2

Un ejemplo: /usr/bin/nmap:

# ls -l /usr/bin/nmap
-rwxr-xr-x 1 root root 2441824 jun 28 13:47 /usr/bin/nmap

Le quitamos el permiso de ejecución de /usr/bin/nmap para “otros”:

# chmod o-x /usr/bin/nmap
# ls -l /usr/bin/nmap
-rwxr-xr– 1 root root 2441824 jun 28 13:47 /usr/bin/nmap

Si intentamos ejecutar nmap como usuario normal:

$ nmap locahost
bash: /usr/bin/nmap: Permission denied

Probamos con la libreria menionada y especificando la ruta absoluta a nmap:

$ /lib64/ld-linux-x86-64.so.2 /usr/bin/nmap localhost

Starting Nmap 6.47 ( http://nmap.org ) at 2015-07-25 07:59 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 995 closed ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

La única condición es que el binario tenga permisos de lectura.

Por lo tanto, no basta en quitar permisos de ejecución para que no sea ejecutable, deberemos quitar siempre también el permiso de lectura para evitar esta forma de ejecución de binarios. Para el caso de scripts no funciona.

Share

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *