Usando o sudo para gravar arquivos na casa do usuário

2

Eu originalmente fiz o login com $HOME as /home/oleg

Eu preciso executar um comando com o sudo - isso é um comando de instalação do npm -

sudo npm install -g suman

no entanto, o script postinstall para o módulo suman, como está atualmente configurado, grava no diretório home do usuário original /home/oleg/.suman .... mas como executo o comando npm install acima com sudo, não tenho acesso a %código%.

Existe alguma esperança de dar ao usuário root acesso ao diretório /home/oleg/.suman ?

Ou o script postinstall para suman deve simplesmente ser instalado no diretório pessoal do usuário root?

Parece que, desde que escrevi suman :), posso escrever o conteúdo do diretório .suman com o 777 e dar acesso total ao usuário root dessa maneira. Eu acho que são as permissões mínimas de arquivo para definir o diretório .suman para dar acesso de leitura / gravação / execução somente ao usuário root e ao usuário logado?

    
por Alexander Mills 21.02.2017 / 00:13

2 respostas

1

TL, DR: nenhuma de suas sugestões é boa. Em vez disso, ao executar como raiz, armazene os arquivos de estado em /var (algo como /var/lib/suman ).

A raiz já tem permissão

O Root tem permissão para acessar todos os arquivos no sistema. Portanto, não altere as permissões do diretório: não faria diferença alguma para o root, mas permitiria que todos lessem e escrevessem nesse diretório. Apesar da crença popular, é extremamente raro que chmod 777 faça qualquer coisa útil.

O Root tem a permissão para acessar todos os arquivos no sistema, e normalmente isso é suficiente. Existem algumas exceções que têm a ver com certos tipos de sistema de arquivos que lidam com usuários de maneira diferente dos sistemas de arquivos “normais”. Os dois principais casos são:

  • O NFS: root em um cliente geralmente é mapeado para um usuário diferente no servidor, geralmente nobody . Isso significa que quando o root abre um arquivo, ele é feito com as permissões de nobody .
  • FUSE (que inclui o ecryptfs, que é comumente usado para criptografar diretórios home): a menos que configurado de outra forma (com a opção allow_other , que somente o root pode usar), os sistemas de arquivos FUSE estão disponíveis apenas para o usuário que os montou. / li>

Nesses casos, há arquivos que o root não pode acessar diretamente, apesar de ter uma permissão aparente. O Root ainda pode efetivamente acessar os arquivos alternando para a conta que possui os arquivos - são limitações de implementação, não restrições de segurança - mas é um pouco inconveniente.

Mas o root deve usar essa permissão cuidadosamente

Se você tiver um programa que é comumente chamado como root, mas com HOME configurado para o diretório inicial de outro usuário, tente evitar a criação de arquivos no diretório inicial do usuário que o usuário não pode acessar.

Se /home/oleg/.suman já existir e pertencer a oleg, não importa se você gravar arquivos lá, porque o proprietário de um diretório sempre pode apagar arquivos nesse diretório (o que é preciso é permissão de gravação e o proprietário sempre pode conceder-se permissão). Quando oleg executa o mesmo programa, ele substituirá os arquivos de propriedade da raiz se esses arquivos precisarem ser sobrescritos. Não crie subdiretórios, no entanto: oleg não poderá acessá-los ou removê-los, mesmo que estejam vazios.

O problema é se você executar o programa pela primeira vez como root e criar /home/oleg/.suman . Em poucas palavras, não faça isso - a questão é como evitá-lo.

As soluções

Se você executar sudo -H , a variável de ambiente HOME será definida como o diretório inicial do root e, portanto, o programa não estará acessando /home/oleg .

Mas, às vezes, faz sentido executar um programa como root (porque ele precisa de permissões de root), mas com o diretório home definido como seu (para ler seus arquivos de configuração). Isso, claro, só se aplica em casos em que não há problema em um programa executando como root ler esse arquivo de configuração - as personalizações da interface do usuário são boas, mas o arquivo de configuração não deve conter coisas como código executável (por exemplo, nenhum shell escapa durante o pré-processamento). Se for esse o caso, o programa deve ler arquivos de $HOME , mas não escrever.

Se o programa precisar armazenar alguns arquivos de estado, quando estiver sendo executado como root, ele deverá armazená-los em um diretório do sistema (em /var ), não no diretório inicial do usuário.

    
por 21.02.2017 / 01:45
1

O que você está procurando é o parâmetro -H, --set-home para sudo.

Da página de manual do sudo:

-H, --set-home Request that the security policy set the HOME environment variable to the home directory specified by the target user's password database entry. Depending on the policy, this may be the default behavior.

    
por 21.02.2017 / 00:27