Penso che molti dettagli della tua domanda potrebbero applicarsi allo stesso modo avahi-daemon
, che ho esaminato di recente. (Potrei aver perso un altro dettaglio che differisce però). L'esecuzione di avahi-daemon in un chroot ha molti vantaggi, nel caso in cui avahi-daemon sia compromesso. Questi includono:
- non può leggere la home directory degli utenti ed esfiltrare informazioni private.
- non può sfruttare i bug di altri programmi scrivendo in / tmp. Esiste almeno un'intera categoria di tali bug. Ad esempio https://www.google.co.uk/search?q=tmp+race+security+bug
- non può aprire alcun file socket unix esterno al chroot, su cui altri daemon potrebbero ascoltare e leggere messaggi.
Il punto 3 potrebbe essere particolarmente utile quando non si utilizza dbus o simili ... Penso che avahi-daemon usi dbus, quindi si assicura di mantenere l'accesso al dbus di sistema anche dall'interno del chroot. Se non hai bisogno della possibilità di inviare messaggi sul dbus di sistema, negare tale capacità potrebbe essere una bella funzionalità di sicurezza.
gestendolo con il file di unità systemd
Si noti che se avahi-daemon è stato riscritto, potrebbe potenzialmente scegliere di fare affidamento su systemd per la sicurezza e utilizzare ad es ProtectHome
. Ho proposto una modifica ad avahi-daemon per aggiungere queste protezioni come livello aggiuntivo, insieme ad alcune protezioni aggiuntive che non sono garantite da chroot. Puoi vedere l'elenco completo delle opzioni che ho proposto qui:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Sembra che ci siano più restrizioni che avrei potuto usare se avahi-daemon non avesse usato chroot stesso, alcune delle quali sono menzionate nel messaggio di commit. Non sono sicuro di quanto questo valga però.
Nota, le protezioni che ho usato non avrebbero limitato il demone dall'apertura di file socket unix (punto 3 sopra).
Un altro approccio sarebbe usare SELinux. In ogni caso, legheresti la tua applicazione a quel sottoinsieme di distribuzioni Linux. La ragione per cui ho pensato positivamente a SELinux qui, è che SELinux limita l'accesso che i processi hanno su dbus, in modo fine. Ad esempio, penso che ci si potrebbe aspettare spesso che systemd
non sia nell'elenco dei nomi di autobus a cui era necessario poter inviare messaggi a :-).
"Mi chiedevo se l'uso di sandboxing systemd fosse più sicuro di chroot / setuid / umask / ..."
Riepilogo: perché non entrambi? Decodificiamo un po 'quanto sopra :-).
Se si pensa al punto 3, l'uso di chroot fornisce più confinamento. ProtectHome = e i suoi amici non provano nemmeno a essere restrittivi come chroot. (Ad esempio, nessuna delle liste nere delle opzioni systemd nominate /run
, in cui tendiamo a mettere file socket unix).
chroot mostra che limitare l'accesso al filesystem può essere molto potente, ma non tutto su Linux è un file :-). Esistono opzioni di sistema che possono limitare altre cose, che non sono file. Questo è utile se il programma è compromesso, è possibile ridurre le funzionalità del kernel disponibili, in cui potrebbe tentare di sfruttare una vulnerabilità. Ad esempio avahi-daemon non ha bisogno di socket bluetooth e immagino che il tuo server web non lo sia :-). Quindi non dargli accesso alla famiglia di indirizzi AF_BLUETOOTH. Autorizza solo AF_INET, AF_INET6 e forse AF_UNIX, usando l' RestrictAddressFamilies=
opzione.
Leggi i documenti per ogni opzione che usi. Alcune opzioni sono più efficaci in combinazione con altre e alcune non sono disponibili su tutte le architetture della CPU. (Non perché la CPU è difettosa, ma perché la porta Linux per quella CPU non era così ben progettata. Penso).
(C'è un principio generale qui. È più sicuro se puoi scrivere elenchi di ciò che vuoi consentire, non di ciò che vuoi negare. Come definire un chroot ti dà un elenco di file a cui sei autorizzato ad accedere, e questo è più robusto che dire che vuoi bloccare /home
).
In linea di principio, è possibile applicare personalmente tutte le stesse restrizioni prima di setuid (). È tutto solo codice che puoi copiare da systemd. Tuttavia, le opzioni di unità di sistema dovrebbero essere significativamente più facili da scrivere e, poiché sono in un formato standard, dovrebbero essere più facili da leggere e rivedere.
Quindi posso consigliare vivamente di leggere la sezione sandboxing man systemd.exec
sulla piattaforma di destinazione. Ma se si desidera che la maggior parte del disegno sicuro possibile, non avrei paura di provare chroot
(e poi cadere root
i privilegi) nel programma pure . C'è un compromesso qui. L'utilizzo chroot
impone alcuni vincoli al design generale. Se hai già un design che utilizza chroot e sembra fare ciò di cui hai bisogno, suona piuttosto bene.