CentOS aqui, mas não acho que isso importe porque issodeveser uma questão central do Linux (acho que). Ao tentar instalar e executar o Apache Kafka (um executável Java) em uma caixa CentOS, pensei em uma pergunta que se aplica ao Linux em geral.
Quando você executa um script de shell ou um executável nativo (como java
), o script/executável determina qual usuário ele será executado ou o sistema operacional dita qual usuário o script/executável será executado (ou seja, qual usuário está executando o script /executável)?
É possível e/ou típico que os processos determinem com qual usuário eles são executados? Significadopodeum script/aplicativo especifica que deve ser executado como usuário root ou como algum outro tipo específico de usuário?
De qualquer forma, por que existe uma advertência geral sobre a execução de processos como root em vez de executá-los como usuários não privilegiados?
Responder1
Resposta curta: ambos.
Resposta mais longa (e muito mais útil): Por padrão, o programa será executado como o usuário que o iniciou. No entanto, um programa pode, se escrito para fazer isso e receber as permissões corretas, assumir privilégios de root e/ou voltar para um usuário do "sistema" para ser executado. Essa capacidade deve ser explicitamente concedida ao programa, seja por meio do processo de empacotamento e instalação ou por meio de ações tomadas pelo administrador daquela máquina.
A advertência geral existe porque a experiência histórica em UNIX e Linux tem mostrado que muitas vezes programas que usam privilégios elevados (ou seja, root) que eles não precisam muitas vezes fazem coisas ruins ao sistema. Isso pode ser desde corrupção de dados até processos descontrolados que tornam o restante do sistema inutilizável/sem resposta, até processos que involuntariamente permitem que invasores acessem seu sistema de maneiras que você não deseja.
Responder2
Quando um 'shell script' é executado, ele é executado com as permissões do usuário que executou esse script. A maioria dos serviços (kafka, redis, nginx, etc) instalados usando um gerenciador de pacotes (yum, apt, etc) instala scripts auxiliares para facilitar o controle desses serviços e cria usuários de serviço exclusivos associados a esses serviços (apache, redis, nginx, etc.) Quase todos esses scripts auxiliares são executados inicialmente como root e, em seguida, descartam privilégios para um usuário de serviço atribuído a esse serviço. Isso garante que apenas usuários autorizados (ou seja, usuários autorizados a executar "sudo service kafka start") possam controlar efetivamente esses serviços. Isso significa que o administrador de sistemas Sally pode iniciar, parar e reiniciar o kafka e o nginx, enquanto o desenvolvedor Jim pode estar restrito a apenas iniciar e parar o kafka (ou algo assim). Embora um usuário java possa ser criado pelo administrador, não é algo que eu tenha visto na prática, assim como um usuário Ruby ou um usuário Python. Em vez disso, a propriedade do serviço é mais frequentemente atribuída a um utilizador do serviço relacionado com esse serviço específico.
Alguns processos dependem de serem executados como root (geralmente o daemon do servidor ssh é executado como root). Outros processos se recusarão a iniciar como root (postgresql é um deles).
Se você revisar um script auxiliar para um serviço em /etc/init.d/someservice (ou /etc/init/someservice.conf), o script real que causa escalonamento ou queda de privilégios será codificado lá. Alternativamente, se você estiver logado como usuário stephan e executar algo como /usr/sbin/redis-server -c /etc/redis.conf, verifique esse processo em outra janela, você verá que o redis pertence por Stephan.
Espero que ajude.