Eliminar Privilégios do Processo

10

Eu tenho um processo iniciado por um damon rodando como root, agora eu quero "rebaixar" os privilégios deste processo para aqueles do seu usuário médio. Isso é possível? Se sim como?

PS: executando o unix em um mac

    
por Samantha Catania 23.09.2011 / 08:13

5 respostas

5

O processo em si tem que chamar setuid (2). Você também deve investigar a execução dentro do chroot (8) se você ainda não estiver. Tanto quanto sei, não há como a raiz mudar o fluxo de outro processo.

Se o motivo pelo qual você está rodando como root é ligar portas, sugiro executá-lo como um usuário normal em uma porta mais alta e usar o ipfw (8) no OS X para encaminhar a porta 80/443 / etc para o porta mais alta:

link

    
por 23.09.2011 / 08:54
11

sudo tcpdump -Z usa initgroups (3), setgid (2) e setuid (2) para eliminar os privilégios de root de seu próprio processo.

# code taken from: 
# http://www.opensource.apple.com/source/tcpdump/tcpdump-32/tcpdump/tcpdump.c

/* Drop root privileges and chroot if necessary */
static void
droproot(const char *username, const char *chroot_dir)
{
...
            if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
               setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
                    fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
                        username, 
                        (unsigned long)pw->pw_uid,
                        (unsigned long)pw->pw_gid,
                        pcap_strerror(errno));
                    exit(1);
            }
...
}
    
por 23.09.2011 / 10:48
3

Você pode executar comandos como outros usuários usando su :

 su USERNAME -c COMMAND

Será executado COMMAND com privilégios perdidos para USER .

Observe que, por padrão, su usará o interpretador de shell do usuário de destino para executar o comando. Por outro lado, o comportamento padrão de sudo é tratar o COMMAND como um programa independente, que é executado no ambiente atual. É claro que esses comportamentos padrão podem ser alterados com vários switches e variáveis de ambiente.

    
por 23.09.2011 / 08:54
2

Para eliminar privilégios, você precisa de um usuário não raiz para acessar. Então é só uma questão de mudar para esse usuário:

#define UNPRIV_UID  48
#define UNPRIV_GID  48

if (getuid() == 0) { // we are root
    // setting UID/GID requires root privileges, so if you don't set
    // the GID first, you won't be able to do it at all.
    if (setgid(UNPRIV_GID)!=0) die("Failed to set nonroot GID");
    if (setuid(UNPRIV_UID)!=0) die("Failed to set nonroot UID");
}

ASSERT(getuid() != 0); 

Note que isto é feito dentro do programa , em vez de em um script de wrapper. Muitos programas exigem privilégios de root para algum propósito específico (por exemplo, para ligar a uma porta de baixa numeração), mas não precisam de root depois disso. Então, esses programas serão iniciados como root, mas depois abandonarão os privilégios quando não forem mais necessários.

Se você não precisa de privilégios de root, então não o execute como root. Por exemplo:

# Change this:
myprog -C /my/config/file

# To this:
sudo -u someuser myprog -C /my/config/file
# Or this
su someuser -c "myprog -C /my/config/file"
    
por 23.09.2011 / 11:17
0

Se você estiver executando um executável diferente, ou seja, chamando execve ou outra função exec familiy, talvez indiretamente por meio de uma função como system ou popen , e o processo filho deve executar sem privilégios desde o início, então a maneira mais simples é obter um shell envolvido e chamar su . Aqui está uma visão geral de como o código pode parecer em Perl, mostrando as citações necessárias para:

$shell_command = quotemeta($path_to_executable) . " --option";
$shell_command =~ s/'/'\''/; # protect single quotes for the use as argument to su
$su_command = sprintf("su -c '%s' %s", $shell_command, quotemeta($user_name));
open(PIPE, "$su_command |") or die;

Se o processo filho precisar ser iniciado como root, mas descartar privilégios posteriormente, consulte o código nesta resposta , que ilustra como fazer o downgrade de privilégios em um processo.

    
por 23.09.2011 / 09:33