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.