Resumen de seguridad en GNU/Linux

Destacado

Este es un compendio o índice de las entradas publicadas hasta ahora sobre los sistemas y elementos de seguridad en los entornos GNU/Linux. La lista la iré modificando e incrementando conforme vaya añadiendo nuevos contenidos.

He dividido la lista en tres apartados. Primero tenemos los sistemas de seguridad que incrementan directamente la seguridad del sistema, que he denominado como los sistemas de endurecimiento de binarios en tiempo de compilación. Como su nombre indica, son opciones que se utilizan a la hora de construir los ejecutables y no es necesario ninguna intervención posterior.

Después tenemos los que he denominado opciones de seguridad del sistema, en los que es necesario conocer como configurar y parametrizar las distintas opciones con el fin de poder sacarle el mayor partido.

Finalmente también incluyo el uso de algunas aplicaciones destinadas a mejorar o incrementar la seguridad de los sistemas, auditar, escanear o hacer uso de alguna de las tecnologías de seguridad del sistema facilitando su uso.

Endurecimiento de binarios en tiempo de compilación

Protección de ejecutables: NX

El kernel de linux soporta el bit NX desde la versión 2.6.8 (de agosto de 2004). Prácticamente todos los sistemas operativos actualmente implementan este tipo de protección. En Window se conoce con el nombre de "Data Execution Prevention" (DEP).

La idea es que la memoria que permite escribir en ella no debe ejecutar código al igual que la que permite ejecutar código no debe permite escribir en ella. Hace uso de una características hardware (el bit NX - no-execute bit), o en algunos casos por una emulación por software.

Protección de ejecutables: ASLR

Esta técnica fue incluida en el kernel de linux en su versión 2.6.12 (de junio de 2005) aunque se podía instalar anteriormente en forma de parche. ASLR o Address Space Layout Randomization es una técnica utilizada para mitigar los ataques contra los desbordamientos de buffer, haciendo que algunos segmentos de la aplicación no tengan una posición fija en memoria, variando de forma aleatoria en cada ejecución.

Protección de ejecutables: RELRO

Determinadas formas de ataque se basan en el uso de las secciones .plt y .got con el fin de poder explotar una vulnerabilidad de una aplicación. Con la idea de limitar la posibilidad de sobrescribir estas zonas de memoria se añadieron unas opciones en la colocación de las secciones y la capacidad de escribir en ellas, conocidas como Relocation Read-Only (RELRO).

Protección de ejecutables: PIE

PIE o 'Position Independent Executables' son programas ejecutables binarios hechos enteramente de código independiente de posición. La finalidad de crear binarios PIE es poder crear ejecutables ELF con los mismos atributos que un objeto de biblioteca compartida: código independiente de la posición (PIC) y una dirección base de 0x0 para que el kernel pueda reubicar el binario en tiempo de ejecución.

Protección de ejecutables: Stack Protector (Canaries)

Los canaries, stack guard o stack protector, son valores conocidos (security cookies) que se colocan entre un buffer y los datos de control en la pila para monitorizar los desbordamientos de buffer. Cuando el buffer se desborda, los primeros datos que se corromperán generalmente serán el security cookie y, por lo tanto, una verificación fallida de estos datos alertarán sobre un desbordamiento que luego se puede manejar, por ejemplo, invalidando los datos dañados o finalizando de forma controlada.

Protección de ejecutables: FORTIFY_SOURCE

El objetivo de FORTIFY_SOURCE es calcular el número de bytes que se copian de un origen a un destino para verificar que no se excede la capacidad del buffer de origen. Aunque no puede detectar todos los buffer overflows si añade un nivel más de protección para algunas funciones especialmente sensibles a este tipo de problema. Cuando esta macro detecta que un buffer a sido sobrepasado interrumpe la ejecución del programa, muestra un error y aborta la ejecución.

Opciones de seguridad del sistema

Sistema clásico de permisos en GNU/Linux

En el sistema de permisos clásico de GNU/Linux cada fichero tiene un grupo de 9 permisos (bits) que controlan quien tienen acceso de lectura, escritura o ejecución de un fichero, más tres bits adicionales especiales conocidos como set-user-ID, ser-group-ID y sticky bit. Este grupo de 12 bits se implementa en el conjunto de propiedades del fichero y forman lo que se conoce como modo de acceso.

I-node flags, ACL y atributos extendidos en GNU/Linux

Estas son extensiones que se han añadido con el fin de complementar el sistema básico de permisos. Los I-node Flags son valores binarios que pueden estar presentes o ausentes en un determinado fichero. Estos valores no forman parte de las extensiones estándar de GNU/Linux sino que son propios del sistema de ficheros. Los atributos extendidos se usan para aplicar listas de control de acceso ACL y capabilities, pero también se pueden usar para guardar metadatos asociados a los ficheros. Las listas de control de acceso ACL son una forma de ampliar el sistema tradicional de permisos de 9 + 3 bit asignados a propietario/grupo/otros. Cada fichero o directorio puede tener asociado un ACL que lista las reglas de permisos que se le aplican.

Acceso desde código a permisos, ACL, capabilities y atributos en ficheros

Como crear una aplicación en C que nos muestre los permisos y atributos de los ficheros y carpetas. La aplicación se basa en una llamada a la función statx donde le pasamos como parámetro el nombre del fichero que queremos examinar. También buscaremos los i-node flags con ioctl, los atributos extendidos con listxattr, listaremos la ACL con funciones acl_get_xxx y los capabilities del fichero con las funciones cap_xxx.

Capabilities - Compartimentar al todopoderoso root

La función de capabilities en GNU/Linux es dividir los privilegios disponibles para los procesos que se ejecutan como usuario root en grupos más pequeños de privilegios. De esta manera un proceso puede ejecutarse con privilegios de usuario pero con ciertas capabilities que le permiten realizar unas tareas especificas que de otra forma estarían reservadas solo al usuario root.

Computación Segura con filtros - SECCOMP BPF

Seccomp BPF (SECure COMputing with filters) son filtros expresados como un programa BPF (Berkeley Packet Filter). Proporcionan un medio de filtrar el número de system calls que un determinado proceso puede acceder. Los filtros operan como con los filtros de socket, excepto que los datos sobre los que se opera están relacionados con la llamada al sistema que se realizan, es decir, el número de llamada al sistema y los argumentos de la llamada.

cgroups - Grupos de Control en GNU/Linux

Los cgroups o grupos de control, son una característica del kernel Linux que permite que los procesos se organicen en grupos jerárquicos con el fin de limitar y monitorear el uso de varios tipos de recursos. Con cgroups cada proceso corre en su propio espacio del kernel y de la memoria. Cuando se tienen la necesidad, un administrador puede configurar fácilmente un cgroup para limitar los recursos que puede utilizar un proceso.

cgroups - Grupos de control con systemd

Desde la llegada del sistema de inicio systemd los cgroups son una parte integral del sistema operativo y cada proceso se ejecuta en su propio grupo de control. De forma predeterminada systemd crea automáticamente una jerarquía de unidades slice, scope y service para proporcionar una estructura unificada para el árbol de cgroups.

Las unidades service, scope y slice se asignan directamente a los objetos del árbol cgroup. Cuando se activan estas unidades, se asignan directamente a las rutas de cgroup construidas a partir de los nombres de las unidades. Estas unidades se pueden crear manualmente por el administrador del sistema o dinámicamente por programas.

Seguridad con AppArmor: Introducción

AppArmor es un sistema de seguridad MAC (Mandatory Access Control o Control de acceso Obligatorio) para GNU/Linux. El sistema AppArmor utiliza unos perfiles de acceso escritos en un lenguaje amigable para el administrador, con el fin de limitar a los programas el acceso a un determinado grupo de ficheros, capabilities, accesos de red y limites de recursos, conocidos como la política o perfil de acceso de AppArmor para el programa.

Namespaces - Aíslar los procesos GNU/Linux en sus propios entornos de sistema

GNU/Linux proporciona distintos namesapaces que han sido introducidos paulatinamente en el kernel desde la versión 2.6.23. Los namespaces permiten encapsular recursos globales del sistema de forma aislada, evitando que puedan interferir con procesos que estén fuera del namespace, sin tener que recurrir a máquinas virtuales. Los cambios en el recurso global son visibles para otros procesos que son miembros del namespace, pero son invisibles para otros procesos fuera de él. Un uso de los namespaces es implementar contenedores.

Uso de fs-verity en kernel 5.7

A partir de la versión 5.5 del kernel de linux se incluye la opción de verificación de integridad y protección de autenticidad transparente para ficheros de solo lectura. Esto nos permite activar la comprobación de integridad y la comprobación de autenticidad de un determinado fichero.

Aplicaciones y herramientas de seguridad

Crear claves GnuPG y uso de clave maestra offline

Con el fin de cifrar el correo y mantenerlo ocultos a miradas indiscretas podemos utilizar las claves GPG para cifrar y firmar correos. En este caso se crean las claves desde la línea de mandatos y se utilizan subkeys con el fin de tener una clave maestra offline y no tener que llevarla siempre instala, por ejemplo en el portátil.

Usar libsecret para manejar claves en Gnome Keyring

GNOME Keyring es una colección de componentes en GNOME que almacena secretos, contraseñas, claves, certificados y los pone a disposición de las aplicaciones. Las aplicaciones que usan GNOME Keyring pueden almacenar estos secretos y usarlos cuando los necesitan. Al estar integrado con el inicio de sesión del usuario, el almacenamiento secreto se puede desbloquear cuando el usuario inicia sesión en el sistema.

Aislar procesos en sandboxing con Firejail

Las técnicas de sandboxing (caja de arena) se utilizan para aislar determinados procesos con el fin de que tengan una visión parcial y limitada de los recursos disponibles del sistema. El objetivo es limitar la posibilidad de acceder a recursos, principalmente en el caso de fallo o que el proceso se vea comprometido y explotado por algún malware o atacante, limitando entonces el alcance que pueden hacer dentro del sistema. 

Lo que hace firejail es crear un sandbox utilizando las propiedades y características de seguridad que incluyen actualmente los sistemas GNU/Linux como son seccomp, capabilities, namespaces o AppArmor entre otras, de forma transparente para el usuario.

 

Modificado por última vez enJueves, 26 Noviembre 2020 09:02
(1 Voto)
Etiquetado como :

Más en esta categoría:

« Seguridad con AppArmor: Introducción

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.