Noticias

Endurecimiento del servicio Systemd | Diario de Linux

Entrada

En un momento en el que los ataques de piratas informáticos ocurren a diario, es de fundamental importancia minimizar la superficie de ataque. La contenedorización es probablemente la mejor forma de aislar un servicio que se pone a disposición del notorio. Sin retención, esto no siempre es posible por varias razones. Por ejemplo, considere una aplicación de sistema más antigua desarrollada sobre systemd. Esto podría servirse al mayor las capacidades de un sistema operante basado en systemd y podría ser administrado por una entidad de systemd, o podría obtener actualizaciones automáticamente usando un temporizador de systemd, y así sucesivamente.

Oportuno a esto, vamos a explicar cómo se puede mejorar la seguridad de un servicio systemd. Pero primero tenemos que dar un paso antes por un momento. Con las últimas versiones, systemd ha implementado algunas características de seguridad interesantes, especialmente sandboxing. En este artículo, mostraremos paso a paso cómo proteger los servicios con la ayuda de ciertas instrucciones y verificaremos con la suite systemd proporcionada.

Depurar

Systemd proporcionó una útil interesante llamamiento disección systemd. Este comando analiza la configuración de seguridad y espacio separado de uno o más servicios especificados. El comando búsqueda varias configuraciones de servicio relacionadas con la seguridad y asigna a cada una un valía numeral para el «nivel de exposición», dependiendo de la importancia de la configuración. Luego, se calcula un nivel de exposición caudillo para toda la pelotón mediante una estimación en el rango de 0.0 a 10.0 que muestra cuán expuesto está un servicio a la seguridad.

De esta forma podemos revisar paso a paso las mejoras que se han realizado en nuestro servicio systemd. Como puede ver, varios servicios ahora están marcados como INSEGUROS. Es probable que esto se deba a que no todas las aplicaciones utilizan la funcionalidad proporcionada por systemd.

Empezado

Comencemos con un ejemplo simple. Queremos crear una pelotón systemd para iniciar el comando python3 -m http.server como servicio:

[Unit]
Description=Simple Http Server
Documentation=https://docs.python.org/3/library/http.server.html

[Service]
Type=simple
ExecStart=/usr/bin/python3 -m http.server
ExecStop=/bin/kill -9 $MAINPID

[Install]
WantedBy=multi-user.target

Guarde el archivo y colóquelo en el directorio del sistema específico de su distribución.

Al revisar los riesgos de seguridad mediante systemd-analyze security Obtenemos el posterior resultado:

Inicio del servicio Systemd

El valía de la seguridad es ahora 9,6/.10 y está traumatizado como INCIERTO. Ahora veamos cómo puede alentar el servicio coetáneo para hacerlo más seguro.

PrivateTmp

Se crea un espacio de nombres del sistema de archivos en /tmp/systemd-private-*-[unit name]-*/tmp en ocupación de un global /tmp o /var/tmp. Muchos de los archivos de dispositivos publicados con Red Hat Enterprise Linux contienen esta configuración, que elimina toda una clase de vulnerabilidades relacionadas con la predicción y el reemplazo de archivos que se utilizan en /tmp. [4]

Así es como aparecerá el servicio a posteriori de insertar la posterior testimonio:

[Unit]
Description=Simple Http Server
Documentation=https://docs.python.org/3/library/http.server.html

[Service]
Type=simple
ExecStart=/usr/bin/python3 -m http.server
ExecStop=/bin/kill -9 $MAINPID

# Sandboxing features
PrivateTmp=yes

[Install]
WantedBy=multi-user.target

Este es el resultado del que venimos systemd-analyze::

simplehttp.service                        9.2 UNSAFE    😨

¡Correctamente! Lo bajamos 9,6 a 9.2. Veamos cómo hacerlo aún más seguro.

NoNewPrivileges

Evita que el servicio y los procesos secundarios relacionados aumenten los permisos. [4] Agregue la posterior tendencia:

NoNewPrivileges=true

El posterior resultado es:

simplehttp.service                        9.0 UNSAFE    😨

Restringir espacios de nombres

Restringe todos o un subconjunto de espacios de nombres al servicio. La política aceptada cgroup, ipc, net, mnt, pid, user, y uts. [4]. Agregue la posterior tendencia:

RestrictNamespaces=uts ipc pid user cgroup

Como puede ver hacia lo alto, eso es net El espacio de nombres no se estableció porque el servicio debe vincularse a una interfaz de red. Aislar net de un servicio de red lo inutilizará.

simplehttp.service                        8.8 EXPOSED   😨

Resultados finales

Una vez que agregamos las otras instrucciones al servicio, obtenemos un servicio como el posterior:

[Unit]
Description=Simple Http Server
Documentation=https://docs.python.org/3/library/http.server.html

[Service]
Type=simple
ExecStart=/usr/bin/python3 -m http.server
ExecStop=/bin/kill -9 $MAINPID

# Sandboxing features
PrivateTmp=yes
NoNewPrivileges=true
ProtectSystem=strict
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH
RestrictNamespaces=uts ipc pid user cgroup
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
PrivateDevices=yes
RestrictSUIDSGID=true
IPAddressAllow=192.168.1.0/24

[Install]
WantedBy=multi-user.target

Eventualmente logra este resultado:

simplehttp.service                        4.9 OK       😃

Lo bajamos 9,6 a 4.9Ese es un muy buen resultado. Ahora todo el sistema está parcialmente seguro.

Conclusiones

Ahora podemos mejorar la seguridad de nuestro sistema. Sin retención, recuerde que no siempre tenemos que aplicar todas las directivas systemd. Así que tenemos que comprobarlos paso a paso para asegurarnos de que todos son válidos. Siquiera necesitamos obtener una puntuación pérdida por cada servicio. Es importante proteger nuestro sistema con las precauciones adecuadas.

Puedes encontrar Aquí un pequeño compendio de jugadas de Ansible para configurar una demostración del posterior artículo. Esto podría ayudarlo a practicar con esta característica asombrosa introducida por systemd.

Alessio Greggi es informático y estudió en la Universidad de Roma en Tor Vergata. Ha trabajado como analista de seguridad y DevOps. Trabaja principalmente con scripts de shell, Python, Go y Ansible. Puede comunicarse con Alessio a través de LinkedIn.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba