Creo que muchos detalles de su pregunta podrían aplicarse igualmente avahi-daemon
, lo que vi recientemente. (Sin embargo, podría haber perdido otro detalle que difiere). Ejecutar avahi-daemon en un chroot tiene muchas ventajas, en caso de que avahi-daemon se vea comprometido. Éstos incluyen:
- no puede leer el directorio de inicio de ningún usuario y extraer información privada.
- no puede explotar errores en otros programas escribiendo a / tmp. Hay al menos una categoría completa de tales errores. Por ejemplo, https://www.google.co.uk/search?q=tmp+race+security+bug
- no puede abrir ningún archivo de socket Unix que esté fuera del chroot, en el que otros demonios pueden estar escuchando y leyendo mensajes.
El punto 3 podría ser particularmente agradable cuando estás no usando dbus o similares ... Creo usos avahi-daemon dbus, por lo que se asegura de mantener el acceso al sistema de dbus incluso desde dentro del chroot. Si no necesita la capacidad de enviar mensajes en el sistema dbus, negar esa capacidad podría ser una buena característica de seguridad.
administrándolo con el archivo de unidad systemd
Tenga en cuenta que si se reescribe avahi-daemon, podría optar por confiar en systemd por seguridad, y usar, por ejemplo ProtectHome
. Propuse un cambio a avahi-daemon para agregar estas protecciones como una capa adicional, junto con algunas protecciones adicionales que no están garantizadas por chroot. Puede ver la lista completa de opciones que propuse aquí:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Parece que hay más restricciones que podría haber usado si avahi-daemon no usara chroot, algunas de las cuales se mencionan en el mensaje de confirmación. Sin embargo, no estoy seguro de cuánto se aplica.
Tenga en cuenta que las protecciones que utilicé no habrían limitado el demonio de abrir archivos de socket Unix (punto 3 anterior).
Otro enfoque sería utilizar SELinux. Sin embargo, estaría vinculando su aplicación a ese subconjunto de distribuciones de Linux. La razón por la que pensé en SELinux positivamente aquí, es que SELinux restringe el acceso que los procesos tienen en dbus, de una manera muy precisa. Por ejemplo, creo que a menudo se puede esperar que systemd
no esté en la lista de nombres de autobuses a los que necesita para poder enviar mensajes :-).
"Me preguntaba si usar sandboxing systemd es más seguro que chroot / setuid / umask / ..."
Resumen: ¿por qué no ambos? Decodifiquemos un poco lo anterior :-).
Si piensa en el punto 3, usar chroot proporciona más confinamiento. ProtectHome = y sus amigos ni siquiera intentan ser tan restrictivos como chroot. (Por ejemplo, ninguna de las listas negras de opciones de systemd nombradas /run
, donde tendemos a colocar archivos de socket Unix).
chroot muestra que restringir el acceso al sistema de archivos puede ser muy poderoso, pero no todo en Linux es un archivo :-). Hay opciones de systemd que pueden restringir otras cosas, que no son archivos. Esto es útil si el programa se ve comprometido, puede reducir las características del kernel disponibles, en las que podría intentar explotar una vulnerabilidad. Por ejemplo, avahi-daemon no necesita enchufes bluetooth y supongo que su servidor web tampoco :-). Por lo tanto, no le dé acceso a la familia de direcciones AF_BLUETOOTH. Simplemente incluya en la lista blanca AF_INET, AF_INET6 y quizás AF_UNIX, usando la RestrictAddressFamilies=
opción.
Lea los documentos de cada opción que use. Algunas opciones son más efectivas en combinación con otras, y algunas no están disponibles en todas las arquitecturas de CPU. (No porque la CPU sea mala, sino porque el puerto de Linux para esa CPU no estaba tan bien diseñado. Creo).
(Hay un principio general aquí. Es más seguro si puedes escribir listas de lo que quieres permitir, no lo que quieres negar. Como definir un chroot te da una lista de archivos a los que puedes acceder, y esto es más robusto que decir que quieres bloquear /home
).
En principio, puede aplicar las mismas restricciones usted mismo antes de setuid (). Todo es solo código que puedes copiar de systemd. Sin embargo, las opciones de la unidad systemd deberían ser significativamente más fáciles de escribir, y dado que están en un formato estándar, deberían ser más fáciles de leer y revisar.
Por lo tanto, le recomiendo leer la sección de sandboxing man systemd.exec
en su plataforma de destino. Pero si desea el diseño más seguro posible, no tendría miedo de probar chroot
(y luego eliminar los root
privilegios) en su programa también . Hay una compensación aquí. El uso chroot
impone algunas restricciones en su diseño general. Si ya tiene un diseño que usa chroot, y parece hacer lo que necesita, eso suena bastante bien.