Seguridad - Privilegios de acceso - GNU/Linux

Mayo 2017



Prefacio


El objetivo de este artículo no es de enseñarles que privilegios debe darles a sus archivos o directorios ni por qué. El uso de la administración de usuarios, grupos u otros así como los permisos otorgados, depende de cada configuración, de la estrategia puesta en práctica por el administrador de su sistema y también de sus necesidades.
En su lugar en este artículo encontrará una breve presentación de los privilegios que el sistema GNU/Linux utiliza así como los comandos utilizados para hacerlo.

I. Generalidades


En un sistema GNU/Linux todo es un archivo, comprendido los archivos especiales que designan los periféricos. Linux divide los archivos en varias categorías:
  • los directorios
  • los archivos ordinarios (programas, archivos de configuración, archivos de datos, etc…)
  • los archivos especiales (tipo bloc o carácter)


El sistema de archivos en GNU/Linux está organizado en un árbol de directorios, no habiendo necesidad de mencionar el nombre del disco o de la partición para tener acceso.

II. Los privilegios


En un sistema GNU/Linux, se atribuyen privilegios a todos los archivos por 3 identidades:
  • el propietario- es el usuario que ha creado el archivo o el usuario que root ha designado como propietario
  • el grupo (que no es necesariamente el grupo del propietario)
  • los otros (aquellos que no hacen parte del grupo)


El comando ls –l nos permite mostrar los privilegios de un archivo en GNU/Linux.

Para cada identidad (ver más arriba), existen 3 privilegios para acceder:
  • r - read (privilegio de lectura)
  • w - write (privilegio de escritura)
  • x - execute (privilegio de ejecución)


La visualización de los privilegios está representada por una cadena de 9 caracteres, precedida de un carácter, que representa el tipo de archivo.

Estos 9 caracteres, reagrupados de 3 en 3 (rwx rwx rwx), definen las 3 identidades (propietario, grupo y los otros).

Para cada privilegio existente vemos una letra entre r,w o x (ver más arriba) y si no existe un privilegio utilizamos un guion (no confundir con el primer guion que significa – archivo regular).
Significado		Símbolo	Propietario	  Grupo		Otros
______________________________________________________________________
archivo regular	-	
directorio		d
periférico carácter	c
periférico bloc		b	  r w x		  r w x		r w x
enlace simbólico	l
tube llamado		p
socket local		s

______________________________________________________________________

Ejemplo:
-rwxr-x---
Lo que significa que:
  • se trata de un archivo regular (el 1er carácter es un guion -)
  • el propietario tiene todos los privilegios (ReadWriteExecute o sea LeerEscribirEjecutar)
  • los miembros del grupo tienen el privilegio de Leer (el 1er carácter es r) y Ejecutar (el 3er carácter es x), en cambio no tienen el privilegio de Escribir (el 2do carácter es un guion -)
  • los otros no tienen ningún privilegio, ni de lectura, ni de escritura, ni de ejecución (los 3 caracteres son guiones - )

III. Los privilegios especiales


1. El Sticky bit


El Sticky bit es un privilegio especial en el que el comportamiento es diferente para los archivos ejecutables y directorios.
Corresponde a la letra t o al número 1000.
Si los privilegios de ejecución no son dados entonces es la letra T que corresponde.
  • los archivos ejecutables – el programa permanecerá en memoria para ser ejecutado posteriormente
  • los directorios – si el sticky bit es otorgado en un directorio, sólo el propietario podrá eliminar sus archivos (es el caso de los directorios /tmp y /var/tmp en GNU/Linux)


Ejemplo:
$ ls -l / | grep tmp;ls -l /var | grep tmp
drwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmp
drwxrwxrwt 4 root root 4096 2006-07-22 10:23 tmp

Para mostrar los privilegios de /tmp y /var/tmp.
Se observa que el último carácter en la serie de los 9 en los privilegios es una t y no una x o un guión.

2. Los privilegios de endoso


SetUID y SetGID
Los privilegios de endoso en GNU/Linux están representados por:
  • la letra s (si se ha otorgado el privilegio x)
  • la letra S (si no se ha otorgado el privilegio x)

Numéricamente el privilegio de endoso está representado de la manera siguiente:
  • 4000 – para el endoso de la identidad del propietario
  • 2000 – para el endoso de la identidad del grupo

El comportamiento de los privilegios de endoso.
  • Para los archivos de programas o ejecutable
    • SUID = 4000 – el proceso tiene los privilegios del propietario del programa ejecutado
    • SGID = 2000 - el proceso tiene los privilegios del grupo del programa ejecutado
    • Para los directorios
    • SGID = 2000 – los archivos que se encuentran en el directorio pertenecen al grupo del directorio


Los privilegios de endoso son muy importantes para la seguridad.

En lugar de dar el acceso a un archivo, se da el privilegio de acceso a un comando.
El kernel o núcleo, al momento de la ejecución del comando endosa la identidad del propietario o del grupo del comando en lugar de la del usuario que ha ejecutado el comando.
Por lo tanto el acceso al archivo se hace por medio del comando y no directamente.

Cuando un usuario se conecta a un sistema GNU/Linux, éste posee 2 UID (UserIDentity) y 2 GID (GroupIDentity): el real y el efectivo.
  • Al momento de la ejecución de un comando los UID y GID son los reales, los efectivos son atribuidos al comando.
  • Cuando los privilegios de endoso no son otorgados, entonces los UID y GID efectivos son idénticos a los UID y GID reales.
  • Si los privilegios de endoso son otorgados entonces el UID y/o GID efectivos son los del comando. Lo que quiere decir que los UID y GID efectivos son los que controlan los privilegios de acceso a un comando.


Para conocer los archivos con los privilegios de endoso de su sistema escriba en un terminal el comando siguiente:
# find / -perm -2000 -o -perm -4000 -exec ls -l {} \; 2>/dev/null


Un buen ejemplo es el comando crontab. Este comando crea un archivo en /var/spool/cron/crontabs para el usuario que ha ejecutado el comando crontabs. El acceso al directorio /var/spool/cront/crontabs es prohibido a los usuarios excepto root.
$ cd /var/spool/cron/crontabs/
bash: cd: /var/spool/cron/crontabs/: Permiso no concedido


Cuando el usuario lanza el comando crontab –e (para editar su archivo /var/spool/cron/crontabs/nom_user), el comando se ejecuta con el UID y GID real del usuario pero con el UID y GID efectivo de root.

$ ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab 26872 2004-07-28 22:44 /usr/bin/crontab

Vemos que el comando crontab es el propietario de root y que hace parte del grupo crontab con el privilegio SGID.

Y como root tiene el privilegio de crear en /var/spool/cron/crontabs el archivo.

# ls -l /var/spool/cron/crontabs/lami20j
-rw------- 1 lami20j crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/lami20


Podemos ver que el usuario lami20j es el propietario del archivo y que tiene los privilegios de lectura y escritura. Sin embargo no lo puede hacer directamente.

IV. Los comandos


1. Chmod


El comando Chmod (CHangeMODe) permite definir y cambiar los privilegios de acceso de un archivo o un conjunto de archivos.
Entre las opciones del comando chmod (las que no son numerosas – ver man chmod) citaré solamente dos:
  • v para verbose (visualización en la salida estándar STDOUT del resultado del comando)
  • R trata los directorios recursivamente (aplicación del comando al árbol de directorios completo del directorio en cuestión)


Hay dos modos de usar el comando chmod:
  • de modo literal
  • de modo numérico


El modo literal
Si ha leído atentamente hasta aquí, entonces debería adivinar el modo literal.
Este es el uso de letras que ya le son conocidas r, w y x para especificar los privilegios que se deseen.
La novedad es que vamos a utilizar también letras para designar las identidades de las que hemos hablado líneas arriba: el propietario, el grupo y los otros.
Chmod utiliza la notación siguiente:
  • u- para el propietario (user)
  • g- para el grupo (group)
  • o-para los otros (other)
  • a- para todos (all)


Otra notación será utilizada para atribuir y/o retirar privilegios.
  • + (más) para atribuir
  • - (menos) para retirar
  • = (igual) para fijar el acceso exacto

Aquí un pequeño esquema de construcción para chmod
         Identidad   Operador  Tipo de acceso
_____________________________________
	   u	    +	      r
chmod	   g	    -	      w
	   o 	    =	      x
	   a		
_____________________________________


No podemos imaginar todas las combinaciones posibles, aun si eso parece posible considerando que existen pocos operadores y privilegios.

Lo que complica las cosas es más bien el número de usuarios, el número de archivos y su repartición en el(los)

disco(s) y las particiones de las que no se conoce tampoco el número, etc.

En cambio algunas reglas le ayudarán si alguna vez utiliza el comando chmod.
  • Varias identidades y tipos de acceso pueden ser utilizadas.

Ej: chmod go-wx archivo para los miembros del grupo y los otros retiramos el privilegio de escritura y ejecución.
  • varios conjuntos de operadores y tipos de acceso pueden ser utilizados.
    • Ej: chmod o+r-w archivo atribuye el privilegio de lectura pero retira el privilegio de escritura para los otros.
    • las cadenas pueden ser combinadas separándolas por comas.
    • Ej: chmod u+x,og-w archivo atribuye el privilegio de ejecución para el propietario y retira los derechos de escritura para los miembros del grupo y los otros. ¡Atención! No hay ningún espacio entre las cadenas separadas por las comas.
    • Para aplicar el comando chmod a un directorio y su contenido (sub-directorios, archivos) se utiliza el comando chmod -R privilegios Directorio



Trucos:
  • Cuando se ha omitido la identidad, será utilizado el valor a
    • chmod -R +w directorio
    • el tipo de acceso puede ser omitido si el signo igual (=) es utilizado para eliminar todos los accesos
    • chmod o= archivo

El modo numérico
Proprietario		      Grupo		      Otros
__________________________________________________________________
LecturaEscrituraEjec	LecturaEscrituraEjec	LecturaEscrituraEjec
__________________________________________________________________
 400	200    100	  40	 20    10	   4	  2	1


Para comprender el uso de chmod con el modo numérico a continuación un ejemplo.

Ejemplo: en un archivo deseamos establecer los privilegios siguientes:
-propietario
Lectura + escritura +ejecución = 400 + 200 + 100 =700
-grupo
Lectura + ejecución = 40 + 10 = 50
-los otros
Lectura + ejecución = 4 + 1 = 5
En total esto da 700 + 50 + 5 = 755
Ahora vamos a utilizar el resultado obtenido con chmod.
chmod -v 0755 archivo
o
chmod 0755 archivo
pero en este caso el resultado del comando no es mostrado en la salida estándar

Podemos escribir simplemente chmod 755 archivo
En resumen, el principio no es complicado. Establecemos los privilegios que deseamos para cada identidad y hacemos la adición. Por el resto chmod se encarga.
Ahora que hemos visto el modo numérico de utilizar el comando chmod, supongo que quizás haya encontrado la respuesta a una pregunta que tal vez le haya atravesado el espíritu.
Se trata de la atribución de los privilegios de endoso.
SUID	SGID	Sticky bit
__________________________
4000	2000	  1000
__________________________

Para agregar un privilegio de endoso, aparte de los privilegios habituales, inserte en el cálculo el o los privilegios de endoso que necesite.

Tomemos el caso precedente 700 + 50 + 5 = 755

Para agregar el privilegio de endoso del grupo escribimos 2000 + 700 + 50 + 5 = 2755
¡Recuerde! Se trata de los privilegios para un comando, lo que significa que el privilegio de ejecución debe ser otorgado.

Que yo sepa no hay manera de regresar a los privilegios precedentes una vez que haya ejecutado el comando. Si conoce uno, seria simpático que me lo diga.

Una idea descabellada sería guardar en primer lugar los privilegios existentes en un archivo con ls -l o ls –Rl y enseguida crear un script para analizar este archivo, pero esto complicaría las cosas y a decir verdad nunca he necesitado hacerlo.

Otra idea, también descabellada, seria salvar con tar par luego, en caso que perdiera los privilegios, regresar a la configuración original.

Por consiguiente antes de modificar los privilegios de un archivo o un árbol de directorios primero dé una ojeada a los privilegios que ya existen.

2. umask


El comando umask permite definir los privilegios por defecto de un archivo o directorio al momento de ser creados. Dicho de otro modo, éste indica los privilegios que se deben retirar al momento de su creación.
El comando umask, al igual que el comando umask (modo numérico) toma como argumentos 3 cifras, que esta vez representan los privilegios que no deseamos otorgar.

$ umask 0022 archivo


Hay que saber que el periodo de vida del comando umask está limitado a la sesión shell activa.
Para una duración permanente ver los archivos de configuración de su shell. Para el shell bash podemos utilizar el archivo ~/.bashrc

Personalmente sólo utilizo el comando umask para pequeños test con el único propósito de comprender el comando chmod.

La comprensión de los privilegios para los archivos en un sistema GNU/Linux está bastante ligada a la gestión de los usuarios y grupos.

Además de los privilegios que hemos visto líneas arriba, en un sistema GNU/Linux encontramos también los ACLs (Access Control List) que permiten otorgar privilegios suplementarios, los cuales detallaremos en otro artículo. Vaya a Seguridad Los Access Control Lists (ACLs)

Consulta también

Publicado por Carlos-vialfa. Última actualización: 12 de agosto de 2008 a las 19:03 por Carlos-vialfa.
El documento «Seguridad - Privilegios de acceso - GNU/Linux» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.