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