Esta serie de artículos explorará algunas de mis capacidades favoritas de Red Hat Enterprise Linux (RHEL) 8 que están habilitadas por systemd
. Por lo tanto, esta serie asume la familiaridad con los conceptos básicos de systemd
. Si necesita una buena introducción, hay una gran cantidad de documentación del producto en el Portal del cliente de Red Hat, así como en el sitio del proyecto. Alternativamente, hay una serie de presentaciones disponibles en YouTube para ponerse al día antes de continuar.
Systemd proporciona una cantidad significativa de funciones de seguridad que se pueden usar para aislar servicios y aplicaciones entre sí, así como del sistema operativo subyacente. En muchos casos, systemd
proporciona fácil acceso a los mismos mecanismos proporcionados por el kernel de Linux que también se utilizan para crear aislamiento para contenedores de Linux. Tener la capacidad de proporcionar aislamiento tipo contenedor para aplicaciones y servicios tradicionales es poderoso porque ahora es fácil mejorar la seguridad y el aislamiento de las cargas de trabajo sin el impacto operativo que requieren los contenedores. Vale la pena señalar que los cambios operativos y organizacionales inspirados por la adopción de contenedores son saludables y valiosos. Sin embargo, incluso en la empresa más experta en contenedores, hay una gran cantidad de implementaciones tradicionales de Linux en las que la seguridad es una prioridad máxima. Como veremos, las cargas de trabajo en estos sistemas pueden beneficiarse con solo unos pocos ajustes en los archivos de unidad correspondientes.
Opciones de seguridad comunes a Red Hat Enterprise Linux 7 y 8
La mayoría de las opciones exploradas a continuación aceptan un true
binario o false
configuración que los hace fáciles de habilitar. Hay algunas que contienen opciones adicionales, y también se muestran las más significativas. Consulte la documentación completa y las páginas man para obtener más detalles. Si no le importa el meollo de estas opciones, no dude en pasar a la siguiente sección, donde juntaremos estas opciones para obtener ejemplos más coherentes:
Opción | Descripción |
---|---|
PrivateTmp=yes | Crea un espacio de nombres del sistema de archivos en /tmp/systemd-private-*-[unit name]-*/tmp en lugar de un /tmp compartido o /var/tmp . Muchos de los archivos de unidad que se envían con Red Hat Enterprise Linux incluyen esta configuración y elimina toda una clase de vulnerabilidades relacionadas con la predicción y el reemplazo de archivos utilizados en /tmp . |
PrivateNetwork= | Proporciona un espacio de nombres de red para el servicio con solo una interfaz de bucle invertido disponible. Una gran opción para aplicaciones que no requieren comunicación de red externa. |
SELinuxContext= | Ejecuta la aplicación en un contexto específico. Esta opción es una buena idea para definir cuándo una política está disponible para aplicaciones enviadas fuera de RHEL. Un buen manual de SELinux está disponible aquí. |
NoNewPrivileges= | Evita que el servicio y los procesos secundarios relacionados aumenten los privilegios. |
ProtectSystem=yes | Hace /usr y /boot de solo lectura a la aplicación. Establecer esta opción en full también hace /etc solo lectura. En Red Hat Enterprise Linux 8, hay una opción adicional llamada strict eso también hace que /dev , /proc y /sys solo lectura. |
ProtectHome=yes | Hace /home , /root y /run/user aparecer vacío. Una opción adicional es read-only , que hace exactamente lo que dice. También nuevo en RHEL 8, tmpfs superpondrá un sistema de archivos efímero y grabable en estos puntos. Debido a que estos directorios se utilizan para almacenar claves SSH y otra información potencialmente confidencial, es una buena idea prohibir el acceso de las aplicaciones. |
ProtectDevices=yes | Crea un /dev privado espacio de nombres que contiene solo pseudodispositivos como /dev/null y /dev/random , que no dan acceso al hardware real. También deshabilita CAP_MKNOD para que no se puedan crear nuevos nodos de dispositivos. |
CapabilityBoundingSet= | Acepta una lista blanca y una lista negra de capacidades privilegiadas para la unidad. Las capacidades de Linux desglosan el acceso del usuario raíz al sistema para que el acceso privilegiado pueda identificarse mejor. El ejemplo clásico es para NTP o chrony para poder configurar el reloj del sistema pero no realizar otras acciones privilegiadas. Más detalles están disponibles en la página de manual de capacidades (7). |
| Se comporta de manera similar a ProtectSystem , pero estas tres opciones permiten un control detallado del acceso al sistema de archivos. |
Opción | Descripción |
---|---|
ProtectKernelTunables=yes | Deshabilita la modificación de /proc y /sys . |
ProtectKernelModules=yes | Prohíbe cargar o descargar módulos y máscaras /usr/lib/modules de la aplicación. |
ProtectControlGroups=yes | Deshabilita el acceso de escritura a /sys/fs/cgroup/ . |
RestrictNamespaces= | Restringir todos o un subconjunto de espacios de nombres al servicio. Acepta cgroup , ipc , net , mnt , pid , user y uts . |
AssertSecurity= | Requiere una serie de requisitos que debe cumplir el sistema para que se inicie el servicio. Si las capacidades enumeradas no están disponibles, el servicio no se ejecutará y se registrará el evento. Opciones como selinux y uefi-secureboot son útiles para muchos entornos. |
MemoryDenyWriteExecute= | Deshabilita la asignación de memoria que se puede escribir y ejecutar simultáneamente. |
RestrictRealtime=yes | Prohíbe la programación en tiempo real. |
PrivateMounts=yes | Hace que el servicio se ejecute en un espacio de nombres de montaje privado. |
DynamicUser=yes | Efectivamente crea un usuario transitorio para la aplicación. Esta opción probablemente justifica su propia publicación para explorar, pero brevemente, el systemd la implementación es brillante porque dinámicamente (como sugiere el nombre) crea un UID y un GID conectando un nss módulo que "crea" al usuario sobre la marcha. Estos usuarios simplemente no existen cuando el servicio no se está ejecutando. Esta función es más útil para aplicaciones sin estado, pero los directorios se pueden asignar para escribir. |
SystemCallFilter= | Le permite incluir en la lista blanca y en la lista negra llamadas del sistema individuales o usar los grupos de llamadas fáciles de usar que systemd proporciona. Si está familiarizado con seccomp filtrado con contenedores, esta opción proporciona exactamente lo mismo. En un sentido general, la mayoría de los usuarios encontrarán @system-service Filtro valioso, que permite las llamadas al sistema relevantes que necesitan la mayoría de los servicios. Los usuarios pueden ver la lista de grupos y llamadas al sistema disponibles ejecutando systemd-analyze syscall-filter . |