martes, 10 de marzo de 2015

SEGURIDAD Y PRIVILEGIOS DE ACCESO EN LINUX

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.

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.


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 - )

Privilegios especiales


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 tmpdrwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmpdrwxrwxrwt 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.



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.


Comandos


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.

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.


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

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

No hay comentarios:

Publicar un comentario

analytics