Seguridad en archivos

Proteger tus archivos en GNU/Linux puede es la roca fundamental de la seguridad

Los Firewalls, rootkit hunters, IDS, Itrusion prevention systems, etc etc no sirve si el administrador del sistema no sabe lo que esta haciendo. Una de las tareas mas importantes en la seguridad que el administrador debe conocer, es controlar la seguridad en nuestros sistemas de archivos.

En este post haremos un repaso de las medidas de seguridad disponibles en GNU/Linux, a la hora de cuidar nuestros archivos:

UGO

Heredado de Unix, los sistemas de archivos en linux, tienen una lista de control de acceso. Esta lista, enumera a tres sujetos. El usuario (el dueño del archivo), el grupo (grupo dueño del archivo) y otros (es decir, todos los que no son ni dueños ni pertenecientes al grupo dueño del archivo. Cada uno de estos sujetos puede tener permiso para, leer (r de read), escribir (w de write) y ejecución (x de eXecution).  Todo esto ya lo sabemos y si no, la wikipedia puede ser una ayuda.

Hay algunas peculiaridades que debes conocer de este sistema:

Falsa restricción de lectura en carpeta

Si una carpeta no tiene permiso de lectura (r), no podrás listar su contenido (hacer un ls), pero si conoces de la existencia de un archivo dentro de ella, podrás listarlo y leerlo (si tienes permisos sobre el mismo).
Ejemplo:

# ls -ld  test
drwxr-xr-x 1 user group 0 sep 1 12:00 test
# ls -l test/
-rwxr-xr-x 1 user group 0 sep 1 12:00 file
# chmod u-r test
# ls -l test/
ls: no se puede acceder a test: No existe el fichero o el directorio
# ls -l test/file
-rwxr-xr-x 1 user group 0 sep 1 12:00 file

Para evitar esto, la correcta manera de denegar el acceso a una carpeta, es quitando el permiso de ejecución (x):

# ls -ld  test
drwxr-xr-x 1 user group 0 sep 1 12:00 test
# chmod u-x test
# ls -l test/
-????????? ? ? ? ? ? file

De esta manera, si bien podríamos listar los archivos contenidos en la carpeta, no podríamos acceder a ellos, ni a las carpetas que estén dentro.

Falsa restricción de ejecución de scripts

Si queremos que un script no se ejecutable por ciertas personas, debemos tener mucho cuidado. Solamente quitar el permiso de ejecución no siempre sirve ya que si otro usuario tiene permiso de lectura del script puede copiarlo y ejecutarlo. Otra forma de hacer esto mismo es ejecutandoló como “source”

# ls -l script.sh
-rwxr--r-- 1 user group 0 sep 1 12:00 script.sh
# chmod -x script.sh
# . script.sh 

Con un . o bien con el comando source, podemos ejecutar el script como si estuviéramos tirando los comandos directamente desde la consola.

El comando perdido

Pocos conocen le uso del comando ‘newgrp’.  Este comando nos permite cambiar nuestro grupo por defecto momentáneamente. Veamos un ejemplo:

# id user
uid=10000(user) gid=10000(group) groups=10000(group),11000(oracle)
# newgrp oracle
# touch newfile
# ls -l newfile
-rwxr--r-- 1 user oracle 0 sep 1 12:00 newfile

Como verán, el archivo newfile fué escrito con el grupo oracle. Para terminar este switch momentaneo podemos ejecutar exit, ya que newgrp en realidad ha abierto una nueva shell, donde nuestro grupo por defecto es oracle.

Bits especiales

Aunque conocidos, no siempre son bien comprendidos.  El sistema de control de lista de acceso a los archivos tiene unas exenciones llamadas SUID, SGID y Sticky Bit. Los tres bit especiales son mostrados (cuando estan activados) en lugar de la x de ejecución.

El SUID, es un bit que permita que un binario o script, sea ejecutable con los permisos del dueño (user) de dicho archivo (effective user id). Es decir:

#ls -l script.sh
-rwsr-xr-- 1 user group 0 sep 1 12:00 script.sh

Si alguien del grupo group ejecuta dicho script, lo hará con los permisos del usuario (user)  y no con sus permisos.
Esto requiere especial atención dadas sus implicaciones!
El SGID, es igual que el SUID, pero aplicado al grupo.

Y finalmente el Stiky bit, se utiliza hoy en dia, solo para directorios. La wikipedia reza:

Cuando se le asigna a un directorio, significa que los elementos que hay en ese directorio sólo pueden ser renombrados o borrados por el propietario del elemento, el propietario del directorio o el usuario root, aunque el resto de usuarios tenga permisos de escritura y, por tanto, puedan modificar el contenido de esos elementos.

El sticky bit está a menudo configurado para el directorio /tmp.

Estos bits, son un parche, a las limitaciones del sistema de control de acceso, y se complementan con los atributos extendidos que veremos a continuación.

Extended Attributes

Los atributos extendidos es una característica soportada por la mayoría de los sistemas de archivos (tanto en linux, como en los unix, y en windows). Por supuesto, cada cual tiene su propia implementación. En este caso, veremos la implementación de ext2,3 y 4 dado que son los sistemas de archivos mas comunes en GNU/Linux.

Estos atributos extendidos nos permiten añadir peculiaridades al comportamiento de acceso a los archivos.  Veamos cuales son:

  • a : append only 
  • c : compressed
  • d : no dump
  • e : extent format
  • i : immutable
  • j : data journalling
  • s : secure deletion
  • t : no tail-merging
  • u : undeletable
  • A : no atime updates
  • C : no copy on write
  • D : synchronous directory updates
  • S : synchronous updates
  • T : top of directory hierarchy

He señalado sólo dos que están mas relacionados con la seguridad. Los otros, o bien no tienen relevancia en la seguridad, o bien no están realmente implementados.  Cada atributo tiene su explicación y uso, y para mas info les recomiendo este link.

El atributo de Append Only, sirve, por ejemplo, para archivos de logs, a los que se les agrega continuamente información. Adicionalmente no estamos interesados en que sean borrados. Para esto podemos utilizar este atributo, de la siguiente manera:

# lsattr file
---------------- file
#chattr +a file
#lsattr file
-----a---------- file
#echo "more data" > file
bash: file: Operación no permitida
#echo "more data" >> file
#

Como verán, podemos agregar mas data, pero no sobre escribirla. Así mismo si utilizamos el atributo inmutable, el archivo no puede ser modificado en absoluto.
Estos atributos pueden ser asignados sólo por el root, y quitados con el mismo comando chattr.
Si bien no son un garantía, son una barrera mas que ayudan a securizar cierta data.

ACL

El sistema UGO, tiene sus limitaciones, y ACL es la respuesta.
Por ejemplo, una limitación clásica del sistema UGO, es que no podemos dar distintos permisos a distintos usuarios, indistintamente del grupo al que pertenezcan. Esto, si se puede hacer con las ACL.
Para que nuestro sistema de archivos soporte esta característica, hay que montarlo con el flag “acl”, ya sea desde el comando mount o desde el fstab.

/dev/sdb1 /pendrive ext3 acl 1 2

ó

mount -o acl /dev/sdb1 /pendrive

En todo caso, al montar el sistema de archivos con soporte de acl, podemos configurar permisos avanzados (siempre utilizando la metodología de lista de control de acceso)
Archivos con ACLs
Cuando listamos archivos que tienen ACLs, los visualizaremos con un + al final de los permisos:

#ls -l script.sh
-rwxr-xr--+ 1 user group 0 sep 1 12:00 script.sh

Listar ACLs

Para conocer que ACLs tiene un archivo, utilizmos getfacl:

# getfacl script.sh
# file: script.sh
# owner: user
# group: group
user::rw-
user:john:rwx
group::r--
mask::rwx
other::r--

Como ven, en este caso, el usuario john, tiene permisos de lectura,escritura y ejecución.

Establecer ACLs
Finalmente, para establecer una ACL, utilizamos setfacl

# setfacl -m "u:john:r-x" script.sh

En este caso, quitamos el permiso de ejecución a john.
Para su uso mas extedido, te recomiendo leas la doco de RedHat

Conclusiones

Configurar correctamente nuestros archivos, es fundamental. Un bit de permisos mal configurados puede ser la ruina del servidor, por consiguiente de la red..
Aunque estos temas son muy básicos para los administradores avanzados, aveces se pierde de vista su importancia. Además de los sistemas repasados, existen medidas mas avanzadas, como por ejemplo, selinux, tripwire, encriptación LUKE, etc. Estas van mas allá de los sistemas de archivos, pero estan muy relacionadas. Las veremos mas adelante.

Antes de dormir hoy, no olvides revisar tu file sytems 😛

~have fun!