É uma boa prática executar um daemon em uma conta de usuário não raiz?

13

Eu desenvolvi um aplicativo que usa o NTP para alterar o tempo da rede e sincronizar dois dos meus computadores. É executado como root, uma vez que apenas este último pode alterar a hora e a data no Linux (eu acho).

Agora, quero executá-lo como usuário. Mas preciso acessar o horário.

  • É uma boa prática executar um daemon em uma conta de usuário não raiz?
  • Devo dar ao meu aplicativo um recurso como CAP_SYS_TIME?
  • Não introduz uma vulnerabilidade de segurança?
  • Existe uma maneira melhor?
Anônimo12223
fonte
Normalmente, o daemon NTP deve ser executado como a ntpconta de usuário (pelo menos nos sistemas Linux), portanto você não deve fazer essa alteração. Qual pacote NTP você instalou?
6
A execução de um daemon em uma conta não raiz é denominada "descartando privilégios de root" e é uma boa prática comumente conhecida, pois limita os possíveis danos às vulnerabilidades de segurança no daemon.
1
Consulte a Wikipedia para " Separação de privilégios ".
Kusalananda
Eu compilei o NTP a partir das fontes. Eu não tenho um grupo NTP
Anonymous12223
@xhaltar Você pode criar o grupo e o usuário NTP. Para configurar como um serviço é iniciado (usuário, grupo etc.), você pode criar / editar o script init do serviço, criar / configurar uma unidade systemd.
Pl4nk

Respostas:

15

É uma boa prática executar um daemon em uma conta de usuário não raiz?

Sim, e isso é comum. Por exemplo, o Apache inicia como raiz e depois bifurca um novo processo como www-data (por padrão).
Como dito anteriormente, se o seu programa for hackeado (por exemplo, injeção de código), o invasor não terá acesso root, mas ficará limitado aos privilégios que você concedeu a esse usuário específico.

Devo dar uma "capacidade" como "CAP_SYS_TIME"?

É uma boa ideia, pois você evita usar o setuid e limita as permissões a esse recurso muito específico.

Devo usar outra maneira de fazer isso que seria considerado "Boas Práticas"?

Você pode aumentar a segurança, por exemplo:

  • Execute o serviço como usuário não privilegiado, sem shell.
  • Use chroot para bloquear o usuário no diretório inicial.
Pl4nk
fonte
Nota: O Chroot não oferece segurança se você estiver root e executando no Linux. O usuário root pode criar um diretório no chroot, abrir o diretório raiz do chroot, chroot para o novo diretório, chdir até a raiz real e depois chroot para a raiz real. O BSD corrige isso, impedindo que o diretório fd esteja em um chroot.
Kevin
@ Kevin Se você é root, também pode rastrear processos fora do chroot, e existem muitas outras maneiras de contorná-lo. Um mero chroot não pode manter raiz no.
Gilles 'stop SO estar mal'
//, emp.jar.st , na verdade, cria um usuário por razões de segurança. Muito boa prática.
Nathan Basanese
Aguarde, se eu sou USUÁRIO, posso bloquear o USUÁRIO em um diretório específico? Como "/ opt" (por exemplo)?
Anonymous12223
@xhaltar Para bloquear um processo executado USERem um diretório, use-o chroot(execute-o como usuário root). No entanto, você deve criar e inicializar uma prisão (diretório) antes. Em resumo, você deve colocar as bibliotecas e os binários de que seu processo precisa nessa prisão e depois ligar chroot <path/to/jail> <command>. Um bom tutorial com alguns dos exemplos que você precisa está disponível aqui
Pl4nk
13
  • Devo usar outra maneira de fazer isso que seria considerado "Boas Práticas"?

A menos que você tenha razões fortes e irrefutáveis, você deve usar o pacote NTP que acompanha sua distribuição GNU / Linux. O daemon NTP padrão levou anos para amadurecer e vem com recursos sofisticados, como diminuir ou acelerar o relógio do sistema para sincronizá-lo com a rede ou com o relógio GPS. Ele foi adaptado para sincronizar relógios, por isso provavelmente é a melhor ferramenta disponível para esse fim.

ntpdainda é mantido, a julgar pelas atualizações recentes (no momento em que escrevemos este post). Se você precisar de mais recursos, sugiro que entre em contato diretamente com os desenvolvedores, confie no que eles têm a dizer sobre isso.


fonte
5

Se você possui um programa que precisa ser capaz de executar a função X (por exemplo, manipular o relógio) e pode ter o privilégio / poder de executar a função X e nada mais, isso é melhor do que fornecer a lata inteira de alfabeto sopa. Isso é conhecido como o princípio do menor privilégio . Considere, e se o seu programa tiver um erro - um erro de programação comum ou uma vulnerabilidade de segurança explorável. Se estiver sendo executado como "root", poderá remover os arquivos de todos - ou enviá-los para um invasor. Se a única coisa que o programa é capaz de fazer é manipular o relógio (e funções não privilegiadas, como manipular arquivos em um diretório bloqueado), isso é o pior que pode acontecer se o programa ficar desonesto.

G-Man diz que 'restabelece Monica'
fonte