Onde o Linux rastreia quem é um administrador de grupo através do comando gpasswd?

1

Se eu modificar membros e administradores do grupo usando o comando gpasswd e adicionar um usuário como administrador de grupo, o Linux permitirá que o usuário execute tarefas reservadas de outra forma pelo root.

Ex.

[test1@centos ~]$ gpasswd -a test6 test
Adding user test6 to group test

Se eu tentar realizar a mesma tarefa que um usuário que não foi adicionado como administrador, não será permitido:

[test2@centos ~]$ gpasswd -a test7 test
gpasswd: Permission denied.

Isso precisa ser rastreado em algum lugar. O comando gpasswd tem o bit SUID definido, mas não há indicação de quem está restrito.

Onde isso é rastreado? Como o comando gpasswd sabe quem recebeu permissões elevadas?

    
por theillien 10.04.2016 / 05:53

1 resposta

1

Where is this tracked? How does the gpasswd command know who has been granted elevated permissions?

Não é realmente "rastreado", por si só. gpasswd tem regras para as quais os usuários têm permissão para usar o comando de várias maneiras, e essas regras / permissões são testadas a cada execução do comando. Os resultados desses testes não são armazenados em cache nem armazenados.

Em geral, para executar gpasswd , você deve ser raiz ou deve ser definido como um membro administrativo do grupo que está segmentando ou deve ser o membro primeiro do grupo você está alvejando.

Se você quiser entrar em detalhes, podemos examinar a origem de gpasswd e outras partes da sombra projeto de utilitários .

De acordo com a fonte de gpasswd ( espelho do GitHub ), dependendo dos resultados de #ifdef SHADOWGRP e #ifdef FIRST_MEMBER_IS_ADMIN , uma das três verificações é executada na função check_perms para uma chamada para gpasswd que não usa as sinalizações -A ou -M (comentários abaixo são meus ):

/* Check 1 */
if (!amroot && !is_on_list (sg->sg_adm, myname)) {
        failure ();
}

/* Check 2 */
if (!amroot) {
        if (gr->gr_mem[0] == (char *) 0) {
            failure ();
        }

        if (strcmp (gr->gr_mem[0], myname) != 0) {
            failure ();
        }
}

/* Check 3 */
if (!amroot) {
        failure ();
}

amroot é um valor booleano verdadeiro se o usuário root tiver chamado gpasswd . É definido aqui :

/* The UID of the caller */
static uid_t bywho;
/* Indicate if gpasswd was called by root */
#define amroot  (0 == bywho)

Ser root irá "passar" (ignorar) Verificação 1, Verificação 2 e Verificação 3 ( amroot será true , o que significa que !amroot será false , portanto, a instrução if será ignorada) .

Um usuário não-root pode passar a Verificação 1 se eles forem um membro administrativo do grupo-alvo. Isso é testado passando uma lista dos membros admin do grupo-alvo (sg- > sg_adm) e o nome do usuário que chamou gpasswd (myname) para a função is_on_list , definida here . Se o usuário chamador estiver na lista de administradores do grupo, is_on_list retornará true , que será invertido para false , o que permite que o usuário passe na Verificação 1.

Um usuário não-root pode passar a Verificação 2 se eles forem o primeiro membro listado do grupo que eles estão tentando alterar . Isso é testado ao verificar se o primeiro usuário no grupo de destino é igual ao usuário que chamou gpasswd .

Um usuário não root não pode passar no Check 3.

Nota: Todos os links de origem que eu forneci estão ligados à tag "debian / 4.2-3" no repositório de origem. Isso é para fornecer referências consistentes.

    
por 10.04.2016 / 07:07