Torna o conteúdo do diretório modificável, incluindo a criação de novos arquivos, mas impede que o próprio diretório seja excluído

1

Recebi a tarefa de criar um novo servidor para a hospedagem do nosso projeto na web. Sou desenvolvedor, então meu nível de administração de sistemas é bastante baixo.

Eu criei uma solução um tanto simples que cada projeto terá seu próprio usuário UNIX e que o webroot estará sob o usuário $HOME .

A estrutura é tão simples como:

  • %código%
    • /home/<user>/web - arquivos de log.
    • /home/<user>/web/log - raiz do documento da web.
    • /home/<user>/web/www - apenas uma prática que surgiu com várias estruturas de aplicativos da web para separar a raiz do documento da raiz pública.

Agora, desejo definir permissões de forma que:

  • /home/<user>/web/www/public - não pode ser excluído nem novos arquivos / diretórios adicionados. /home/<user>/web ajuda aqui.
    • chown root:root - é somente leitura para o usuário, que também posso gerenciar com um simples /home/<user>/web/log .
    • chown root:root - isso não deve ser possível excluir / editar, mas conteúdos livremente modificáveis (exceto /home/<user>/web/www ). Crie, exclua, edite arquivos e diretórios.
    • public - não deve ser possível excluir / editar, mas conteúdos livremente modificáveis.

Para outros recursos relacionados à segurança e ao isolamento, optei por usar as .

Até agora eu tentei /home/<user>/web/www/public - ele me permitiu adicionar novos conteúdos, editar o conteúdo, mas não consegui excluí-los.

Ao escrever a pergunta, a seção de perguntas semelhantes mostrou Impede que um subdiretório seja excluído / imponha uma estrutura de diretórios , o que funciona e estou tentando usá-lo agora.

Mas existem outras maneiras mais transparentes de configurar esses diretórios como tal?

    
por joltmode 26.10.2017 / 21:37

1 resposta

1

A exclusão de um diretório requer permissão de gravação em seu pai. As permissões e propriedade do diretório são irrelevantes. Portanto, se você quiser impedir a exclusão de /home/theuser/web , é necessário e suficiente¹ para garantir que o usuário não tenha permissão de gravação em /home/theuser .

Observe que quando você escreve "a chown root:root ajuda aqui", isso é no diretório pai para impedir sua exclusão, e no próprio diretório para impedir a adição ou removendo arquivos (mas não modificando arquivos existentes).

Note também que para tornar /home/theuser/web/log somente leitura de uma maneira útil, não é suficiente garantir que o usuário não tenha permissão de gravação (e não possua o diretório). Se o usuário tiver permissão para gravar em /home/theuser/web (ou /home/theuser ou /home ou / ), eles poderão renomear /home/theuser/web/log (ou /home/theuser/web , etc.) e criar um novo diretório log , que eles possuiriam.

Para /home/theuser/web/www e /home/theuser/web/www/public , você pode tornar www e www/public de propriedade de root, mas conceda ao usuário permissões de gravação e defina o bit adesivo em www . Quando um diretório tem o bit sticky, há um requisito adicional para remover arquivos dentro dele (incluindo subdiretórios imediatos - os diretórios são um tipo de arquivo): um usuário pode remover apenas os arquivos que possui. Dessa forma, public só será removível pelo seu proprietário (root), mas qualquer outra coisa pode ser livremente manipulada pelo usuário.

chown root:root web/www web/www/public
chmod u=rwx,go= web/www web/www/public
chmod +t web/www
setfacl -m u:theuser:rwx web/www web/www/public

Note que pode ser qualquer propriedade que não seja do usuário, não precisa ser raiz.

¹ Sob suposições razoáveis, ou seja, todos os direitos de passagem necessários, nenhuma regra relevante do SELinux, etc.

    
por 26.10.2017 / 22:52