Conceda privilégios de usuário para alternar o processo UID, GID

4

Estou escrevendo um aplicativo que cria processos de trabalho executados com outras credenciais de usuários. Este programa funciona na raiz. No entanto, quero executá-lo com uma conta menos privilegiada.

Existe alguma maneira que eu possa dar uma conta de usuário a permissão para atribuir UID, GID para o processo que cria?

Em outras palavras, existe alguma maneira de limitar / conceder privilégios de usuário a determinados conjuntos de configurações? Obrigado!

    
por Archer 23.01.2018 / 23:22

1 resposta

3

Dar a um processo o direito de alterar seu UID é equivalente a dar-lhe o direito de ser executado como root, já que ele pode apenas mudar seu UID para root. Então, mesmo que você fizesse isso, não haveria nenhum benefício.

Você pode melhorar a segurança dessa configuração reduzindo o risco de que o programa possa ser induzido a fazer algo não intencional como root. Isso não reduzirá o impacto de um comprometimento total (se um invasor for capaz de fazer com que seu programa execute código arbitrário), mas poderá reduzir o impacto de um comprometimento parcial (onde o invasor só consegue convencer seu programa a fazer algum coisa específica, por exemplo, para ler um arquivo e exibi-lo). Para reduzir o risco, reduza a janela de tempo durante a qual o programa é executado como root. Faça com que ele seja executado como um usuário dedicado, mas mantenha seu UID real configurado como 0. Quando o programa precisa ser root, ele alterna temporariamente seu UID efetivo para 0 e, em seguida, retorna.

Note que isto não é realmente prático em um programa multithread já que o ID do usuário é para um processo inteiro, não por thread.

Para maior robustez e segurança, implemente a separação de privilégios: divida seu programa em dois processos, um que é executado como raiz e outro que é executado como um usuário dedicado. O processo que é executado como root deve fazer o mínimo possível. Recebe solicitações do outro processo, valida-as na medida do possível e as executa. Então, mesmo que o outro processo seja defeituoso, o máximo que ele pode fazer é emitir solicitações válidas.

Para necessidades simples, em vez de escrever um programa que é executado como root, você pode ter uma regra sudo que permita diretamente que o programa principal execute comandos como um terceiro usuário. Em vez de confiar em um programa de raiz intermediário para realizar a validação, você pode incorporar a validação na regra sudo, por exemplo,

myapp_user ALL = (ALL:ALL) validate_and_run

Isso permite que myapp_user execute um comando como qualquer usuário, mas o comando deve ser validate_and_run (com qualquer argumento).

    
por 24.01.2018 / 00:08