GNU/Linux >> Tutoriales Linux >  >> Linux

Mastering systemd:protección y sandboxing de aplicaciones y servicios

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:

Nuevas opciones de seguridad en Red Hat Enterprise Linux 8

Las nuevas opciones de seguridad systemd disponibles en Red Hat Enterprise Linux 8 son:

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

ReadWriteDirectories=

ReadOnlyDirectories=

InaccessibleDirectories=

Se comporta de manera similar a ProtectSystem , pero estas tres opciones permiten un control detallado del acceso al sistema de archivos.

[¿Quiere probar Red Hat Enterprise Linux? Descárguelo ahora gratis.]

Un ejemplo

Si ha llegado hasta aquí, podría estar pensando:"Está bien, esto parece realmente poderoso, pero es mucho para recordar". Afortunadamente, a partir de Red Hat Enterprise Linux 8.1, agregamos un comando para que sea mucho más fácil consultar y verificar el estado de estas opciones:

systemd-analyze security [unit]

Este comando genera una instantánea rápida de cómo el sistema está aprovechando systemd sandboxing de y también puede ver la configuración individual por unidad. Este diseño simplifica la identificación de las opciones disponibles, así como la visualización de su uso a nivel granular.

Aquí está el resultado del httpd.service predeterminado unidad:

Esta salida de systemd-analyze security muestra el nombre, una descripción conveniente y una clasificación de exposición, que demuestra el consumo de configuraciones de seguridad disponibles por servicio y genera una puntuación de exposición ponderada a partir de qué tan aislado está el servicio. Vale la pena señalar que esta herramienta no está destinada a proporcionar una visión u opinión holística de seguridad para el código o la aplicación que se ejecuta en el sistema. Solo porque httpd.service regresa como UNSAFE en una instalación predeterminada no significa que el servicio no sea seguro.

Ahora que sabemos cómo consultar unidades y ver qué controles están en uso, veamos cómo aplicarlos a un servidor web simple. Este ejemplo de propósito general sirve como punto de partida fácil para otros servicios y aplicaciones.

Activar las opciones de seguridad

Primero, cree un drop-in de systemd para agregar las opciones de seguridad. Para Red Hat Enterprise Linux 8, ejecute:

# systemctl edit httpd

O, si lo prefiere, cree manualmente /etc/systemd/system/httpd.service.d/security.conf .

Independientemente de la forma en que haya accedido al archivo, ahora agregue:

[Service]
ProtectSystem=strict
ProtectHome=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
NoNewPrivileges=yes
PrivateTmp=yes

Para Red Hat Enterprise Linux 7, podemos usar una plantilla similar:

[Service]
ProtectSystem=full
ProtectHome=yes
PrivateDevices=yes
NoNewPrivileges=yes
PrivateTmp=yes

Una vez que guarde el archivo y reinicie el servicio, el httpd El servicio estará significativamente aislado del resto del sistema operativo. Si el servicio alguna vez se ve comprometido, la posibilidad de una ruptura y el consiguiente daño se reduce drásticamente.

Los ejemplos anteriores son un excelente punto de partida para bloquear servicios, aplicaciones y unidades que se ejecutan en su sistema. Por supuesto, debe probarlos para asegurarse de que sean apropiados para su caso de uso antes de implementarlos en toda su flota. Por ejemplo, si quisiéramos servir contenido de los directorios de inicio de los usuarios, no incluiríamos ProtectHome=yes , pero en su lugar, utilice ProtectHome=read-only . También vale la pena señalar que no hay nada de malo en incluir las opciones más nuevas agregadas en RHEL 8 en un archivo de unidad que se ejecuta en RHEL 7. Se emitirá un mensaje de notificación y se ignorará la opción.

Ver los resultados

Ahora podemos ver las opciones en uso ejecutando systemd-analyze httpd :

Puede ver que ahora se aplican varias opciones en el servidor web. La calificación también ha cambiado de UNSAFE a MEDIUM . Si bien es completamente posible habilitar más opciones y bloquear aún más el servicio, nos estaríamos desviando del objetivo de proporcionar un ejemplo práctico que se aplicará con éxito a muchos servicios y aplicaciones en el mundo real. Nunca antes había sido tan sencillo limitar el acceso de un servicio tradicional al sistema operativo subyacente.

Conclusión

Para los desarrolladores interesados ​​en asegurar su propio software, las opciones de seguridad relevantes se pueden agregar fácilmente a los archivos de unidad incluidos con su aplicación. Red Hat recomienda encarecidamente a los desarrolladores que "incorporen" tanta seguridad como sea posible de forma predeterminada, y esta es una de las formas más sencillas de lograr ese objetivo.

Para aquellos que se preguntan si las funciones de seguridad que se muestran aquí son redundantes con SELinux, existe una superposición de funciones, pero son en gran medida independientes. Estos ajustes se aplicarán independientemente de si se utiliza SELinux o no. Esta característica es de gran valor cuando SELinux no es una opción viable debido a requisitos de políticas o aplicaciones para ciertos sistemas. En un mundo ideal, estos se usarían with SELinux como parte de un enfoque de seguridad en capas.

Espero que haya disfrutado aprendiendo lo fácil que es aislar y aislar cargas de trabajo instaladas en Red Hat Enterprise Linux 8 con systemd . Ahora, siga adelante y, cuando corresponda, aplique este conocimiento en todo su(s) entorno(s). En el próximo artículo de esta serie, veremos el uso de grupos de control de Linux, también conocidos como cgroups , a través de systemd para proteger recursos valiosos del sistema y resolver el problema del "vecino ruidoso".


Linux
  1. Servicios de inicio, detención y reinicio en el servidor systemd RHEL 7 Linux

  2. Cómo administrar y enumerar servicios en Linux

  3. Cómo administrar los servicios de Systemd con Systemctl en Linux

  4. Regex y grep:Flujo de datos y bloques de construcción

  5. Cómo enumerar los servicios de Systemd en Linux

Aventuras de plasma - 5.19.4 probada y comprobada

Cómo agregar y anclar aplicaciones personalizadas en Plasma

Y la mejor distro de 2019 es...

Cómo desinstalar aplicaciones WINE

Servicios y protocolos de red

Journalctl:Cómo leer y editar registros de Systemd

    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 .