Los privilegios de acceso
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)
PD: El
artículo original fue escrito por lami20j contribuidor de
CommentCaMarche