Existe uma maneira no Linux de ter um usuário não root verificando se outro usuário não root tem permissões para uma pasta / arquivo?

6

O cenário é este - eu tenho um programa de linha de comando que pode não ser executado como root, parte dos requisitos é avisar se outro usuário tiver permissões de gravação para alguma pasta / arquivo

por exemplo.

  • Estou executando como usuário não raiz A
  • Gostaria de obter a resposta para a pergunta: "o usuário B tem permissões de gravação para a pasta F"

Então minhas perguntas são

  • É possível fazer como usuário root? se sim como?
  • Existe alguma maneira de fazer isso como um usuário não raiz?
por Eran Medan 28.05.2014 / 18:44

5 respostas

6

Em geral, a única maneira de saber se o usuário B pode gravar no diretório D é para o usuário B tentar gravar no diretório D.

Então, como root, você pode su para o usuário e tentar. Embora isso possa não ser 100% preciso, uma vez que o usuário que faz login e digita sua senha pode alterar as coisas (por exemplo, um módulo pam pode configurar chaves de criptografia com base na senha do usuário).

Quase tão preciso, novamente como root, você pode su para o usuário e usar o access(2) syscall ou similar. Provavelmente, isso é o que o shell faz se você usar test -w e também o que /usr/bin/test faz. Embora, conforme a página de manual avisa, no NFSv2, a verificação real é feita pelo servidor, mas o teste para o access syscall é feito localmente, portanto, pode estar errado. Da mesma forma, os sistemas de arquivos FUSE podem fazer o mesmo.

(O access(2) manpage também menciona uma condição de corrida que é fundamental para o que você está fazendo: as permissões de B em D podem mudar entre quando você checa e quando B realmente tenta escrever para D.)

Além disso, você precisa decidir o quanto está disposto a aceitar:

  1. Você pode definir o diretório e verificar os usuários & grupos (como várias das outras respostas mostram)
  2. Você também pode verificar as ACLs no diretório.

Mas mesmo se você fizer isso, o seguinte irá te enganar:

  1. Com o NFS e vários outros sistemas de arquivos de rede, o servidor decide se o acesso é permitido. Pode tomar essa decisão com base em, bem, o que quiser. Considere, por exemplo, as várias opções de exportação do NFS para o squash.
  2. As verificações de permissões são feitas pelo sistema de arquivos; sistemas de arquivos não Unix podem fornecer respostas inesperadas (como o usuário Unix é mapeado para um SID para NTFS?). Todas as apostas estão desativadas com, por exemplo, sistemas de arquivos FUSE.
por 28.05.2014 / 19:38
4

"does user B has write permissions to folder F"

A capacidade do usuário A de determinar isso depende do acesso de A à pasta F. Por exemplo, se F é /home/B/foo/bar e A não pode ler /home/B/foo , A não pode nem verificar se existe F, muito menos quais permissões estão definidas isso.

Presumindo que A tem acesso de leitura a F e pode, portanto, stat() 1 para obter as permissões, o próximo passo é determinar se B é o proprietário ou no grupo. Com relação a este último, você pode obter uma lista de usuários no grupo com getgrent() (C nativo - tem uma página man; note que isso não leva um argumento, mas sim itera /etc/group uma entrada de cada vez) , que retorna um struct group :

       struct group {
           char   *gr_name;       /* group name */
           char   *gr_passwd;     /* group password */
           gid_t   gr_gid;        /* group ID */
           char  **gr_mem;        /* group members */
       };

O último campo, gr_mem , é um array de strings contendo a lista de nomes de usuários (essa lista é terminada com um NULL pointer). Isso, combinado com o modo de arquivo, é informação suficiente para lhe dizer se um determinado usuário tem permissão de escrita.

Um exemplo usando getgrent() , para imprimir uma lista de grupos com IDs e membros:

#include <stdio.h>
#include <sys/types.h>
#include <grp.h>

// std=c99

int main (void) {
    struct group *ent = getgrent();
    while (ent) {
        printf (
            "%s GID %d\n",
            ent->gr_name,
            ent->gr_gid
        );
        int i = 0;
        char *p = ent->gr_mem[i];
        while (p) {
            printf("\t%s\n", p);
            p = ent->gr_mem[++i];
        }
        ent = getgrent();
    }
    return 0;
} 

O acesso a /etc/group (e uso de getgrent() ) não requer privilégios.

1 Você não menciona qual idioma está usando, mas esperamos que "stat" seja razoavelmente agnóstico. getgrent() deve ser principalmente portado também, mas depende do idioma.

    
por 28.05.2014 / 19:08
2

Responda à primeira pergunta (em execução como root):

SIM - > su - userB -c '<command as userB to touch file in folderF>'

Responda à segunda pergunta:

TALVEZ - > somente se o usuário não estiver dentro do mesmo grupo que o usuárioB e tentar tocar em um arquivo na pastaF

    
por 28.05.2014 / 18:48
2

Não tenho conhecimento de um único comando para cumprir esse propósito, mas existem vários comandos que permitem determinar a resposta sem raiz.

ls -l F mostrará o proprietário e o grupo do arquivo em questão. Se o usuário não for o proprietário, você poderá verificar groups user para ver se o usuário pertence ao grupo do arquivo. Se o userB for o proprietário ou pertencer ao grupo do arquivo, as permissões de acesso para u e g (respectivamente) informarão quais permissões elas possuem; caso contrário, as permissões de acesso para o informarão quais permissões o usuário possui.

    
por 28.05.2014 / 18:54
2

Se eu entendi corretamente, você precisa verificar a permissão do usuário em uma pasta específica.

Então, basicamente, primeiro execute o comando groups no usuário.

groups userB

O comando acima listará todos os grupos aos quais o userB pertence. Depois disso,

Use o comando stat para encontrar as permissões octal no arquivo / pasta como abaixo.

stat -c "%a %n" /some-folder

O comando acima retornará a permissão octal naquela pasta em particular / arquivo .

Por exemplo, se o comando acima retornar 775 , isso significa que user e group têm acesso rwx completo no arquivo / pasta others tem r-x access no arquivo / pasta .

Determine também os grupos de userA usando o comando groups userA e se ambos userA e userB pertencerem ao mesmo grupo, isso significa userB tem permissões write no arquivo.

    
por 28.05.2014 / 18:55