Eu acho que muitos detalhes da sua pergunta poderiam ser aplicados igualmente avahi-daemon
, os quais eu olhei recentemente. (Eu poderia ter perdido outro detalhe que difere). A execução do avahi-daemon em um chroot tem muitas vantagens, caso o avahi-daemon seja comprometido. Esses incluem:
- ele não pode ler o diretório inicial de nenhum usuário e filtrar informações privadas.
- não pode explorar bugs em outros programas escrevendo para / tmp. Há pelo menos uma categoria inteira desses erros. Por exemplo, https://www.google.co.uk/search?q=tmp+race+security+bug
- ele não pode abrir nenhum arquivo de soquete unix que esteja fora do chroot, no qual outros daemons possam estar ouvindo e lendo mensagens.
O ponto 3 pode ser particularmente interessante quando você não está usando o dbus ou similar ... Acho que o avahi-daemon usa o dbus, por isso garante o acesso ao dbus do sistema, mesmo de dentro do chroot. Se você não precisar enviar mensagens no dbus do sistema, negar essa capacidade pode ser um recurso de segurança bastante interessante.
gerenciando-o com o arquivo de unidade systemd
Observe que, se o avahi-daemon fosse reescrito, ele poderia optar por confiar no systemd para segurança e usar, por exemplo ProtectHome
. Propus uma alteração ao avahi-daemon para adicionar essas proteções como uma camada extra, juntamente com algumas proteções adicionais que não são garantidas pelo chroot. Você pode ver a lista completa de opções que propus aqui:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Parece que existem mais restrições que eu poderia ter usado se o avahi-daemon não usasse o próprio chroot, algumas das quais são mencionadas na mensagem de confirmação. Não tenho certeza de quanto isso se aplica.
Observe que as proteções que eu usei não limitariam o daemon de abrir arquivos de soquete unix (ponto 3 acima).
Outra abordagem seria usar o SELinux. No entanto, você meio que amarraria seu aplicativo a esse subconjunto de distribuições Linux. A razão pela qual pensei positivamente no SELinux aqui, é que o SELinux restringe o acesso que os processos têm ao dbus, de maneira refinada. Por exemplo, acho que você poderia esperar que systemd
isso não estivesse na lista de nomes de ônibus para os quais você precisava enviar mensagens para :-).
"Gostaria de saber se o uso do sandbox systemd é mais seguro que chroot / setuid / umask / ..."
Resumo: por que não os dois? Vamos decodificar um pouco acima :-).
Se você pensa no ponto 3, usar chroot fornece mais confinamento. ProtectHome = e seus amigos nem tentam ser tão restritivos quanto chroot. (Por exemplo, nenhuma das opções nomeadas do systemd lista negra /run
, onde tendemos a colocar arquivos de soquete unix).
O chroot mostra que restringir o acesso ao sistema de arquivos pode ser muito poderoso, mas nem tudo no Linux é um arquivo :-). Existem opções systemd que podem restringir outras coisas, que não são arquivos. Isso é útil se o programa estiver comprometido, você pode reduzir os recursos do kernel disponíveis, o que pode tentar explorar uma vulnerabilidade. Por exemplo, o avahi-daemon não precisa de soquetes bluetooth e acho que seu servidor da web também não :-). Portanto, não lhe dê acesso à família de endereços AF_BLUETOOTH. Basta colocar a lista de permissões AF_INET, AF_INET6 e talvez AF_UNIX, usando a RestrictAddressFamilies=
opção
Leia os documentos para cada opção que você usa. Algumas opções são mais eficazes em combinação com outras e outras não estão disponíveis em todas as arquiteturas de CPU. (Não porque a CPU está ruim, mas porque a porta Linux para essa CPU não foi tão bem projetada. Eu acho).
(Existe um princípio geral aqui. É mais seguro se você pode escrever listas do que deseja permitir, e não do que deseja negar. Como definir um chroot, é exibida uma lista dos arquivos que você tem permissão para acessar, e isso é mais robusto. do que dizer que você deseja bloquear /home
).
Em princípio, você pode aplicar todas as mesmas restrições antes de setuid (). É tudo apenas código que você pode copiar do systemd. No entanto, as opções de unidade do systemd devem ser significativamente mais fáceis de escrever e, como estão em um formato padrão, devem ser mais fáceis de ler e revisar.
Por isso, recomendo apenas ler a seção de sandbox man systemd.exec
na plataforma de destino. Mas se você quer o projeto mais seguro possível, eu não tenha medo de tentar chroot
(e depois cair root
privilégios) em seu programa de bem . Há uma troca aqui. O uso chroot
impõe algumas restrições ao seu design geral. Se você já possui um design que usa chroot e parece fazer o que você precisa, isso parece ótimo.