Para fins de controle de acesso, o conteúdo de um diretório são os nomes de arquivo contidos nele. Para adicionar, excluir ou renomear arquivos, é necessário o acesso de gravação ao diretório. (E para listar os nomes dos arquivos, é necessário acesso de leitura.) Além disso, há o bit adesivo ( +t
) para os diretórios, que limita ainda mais a remoção do arquivo ao proprietário do arquivo e ao proprietário do diretório. IOW, ele impede a remoção de arquivos pertencentes a outros, mesmo que você tenha acesso de gravação ao diretório e possa modificar seu conteúdo.
Quanto às permissões, apenas o proprietário pode alterá-las, e o proprietário de um arquivo só pode ser alterado por root. Acho que a edição de atributos estendidos está vinculada ao acesso de gravação, então você não pode proibir isso separadamente.
Quanto aos seus requisitos, se eu entendi corretamente, você deseja permitir a criação de arquivos dentro de ${ROOT}/build
e ${ROOT}/config
, mas não em outros diretórios em ${ROOT}
. Isso seria feito simplesmente por:
chmod a+rX -R ${ROOT}
chmod o-w -R ${ROOT}
chmod o+w -R ${ROOT}/build ${ROOT}/config
# chmod +t -R ${ROOT}/build ${ROOT}/config
Não há realmente necessidade de usar o bit imutável aqui, é específico do sistema de arquivos e limita todos os usuários igualmente, incluindo o proprietário e o root.
No entanto, se as compilações ocorrerem dentro de ${ROOT}/build
, ainda há o problema de vários usuários não conseguirem trabalhar sem atropelar os arquivos uns dos outros. Para trabalhar contra isso, você poderia modificar o sistema de compilação para suportar a criação de compilações em diretórios de saída arbitrários ou apenas permitir que cada usuário faça sua própria cópia da árvore de origem e a compile em seus diretórios iniciais.