Defina bit pegajoso por padrão para novos diretórios via ACL?

5

Eu quero configurar um diretório onde todos os novos arquivos e diretórios tenham uma certa máscara de acesso e também os diretórios tenham o sticky bit definido (o t one, que restringe a exclusão de arquivos dentro desses diretórios).

Para a primeira parte, meu entendimento é que preciso definir a ACL padrão para o diretório pai. No entanto, os novos diretórios não herdam o t bit do pai. Portanto, os não proprietários podem excluir arquivos nos subdiretórios. Posso consertar isso?

    
por Lev Levitsky 11.06.2015 / 16:29

3 respostas

6

Esta é uma configuração que permite que membros de um grupo, acltest , criem e modificar arquivos de grupo enquanto não permitir a exclusão e renomeação de arquivos exceto pelo seu dono e "outros", nada. Usando o nome de usuário, lev e supondo umask de 022:

groupadd acltest
usermod -a -G acltest lev

Efetue logout da conta raiz e da conta lev . Faça o login e torne-se root ou use sudo :

mkdir /tmp/acltest
chown root:acltest /tmp/acltest
chmod 0770 /tmp/acltest
chmod g+s /tmp/acltest
chmod +t /tmp/acltest

setfacl -d -m g:acltest:rwx /tmp/acltest
setfacl -m g:acltest:rwx /tmp/acltest

O ACL não pode definir o bit adesivo e o bit adesivo não é copiado para os subdiretórios. Mas, você pode usar inotify ou software similar para detectar mudanças no sistema de arquivos, como novos diretórios, e então reagir de acordo.

Por exemplo, no Debian:

apt-get install inotify-tools

Em seguida, crie um script para inotify , como /usr/local/sbin/set_sticky.sh .

#!/usr/bin/env bash
inotifywait -m -r -e create /tmp/acltest |
while read path event file; do
    case "$event" in
        *ISDIR*)
            chmod +t $path$file
            ;;
    esac
done

Conceda permissão de execução para root : chmod 0700 /usr/local/sbin/set_sticky.sh . Em seguida, execute-o no momento da inicialização a partir de, digamos, /etc/rc.local ou qualquer arquivo RC apropriado:

/usr/local/sbin/set_sticky.sh &

Naturalmente, neste exemplo, /tmp/acltest deve desaparecer na reinicialização. Caso contrário, isso deve funcionar como um encanto.

    
por 11.06.2015 / 17:48
2

Definindo o bit sticky recursivamente com base no pai

Diretórios sem o bit sticky podem ser encontrados com a declaração abaixo, na qual o hífen - na frente do valor 1000 deve ser considerado como um prefixo que corresponderá a este e aos maiores valores de permissão .

$ find . -type d \! -perm -1000

Portanto, aqui está uma maneira de definir o bit fixo e setgid dos diretórios cujo diretório pai tem o conjunto de bits fixo.

Isso exigiria uma declaração find aninhada, se não fosse que as declarações find não pudessem ser aninhadas .

É por isso que um canal com uma condicional recursiva será empregado nos diretórios encontrados sem um bit sticky . O -k test retorna verdadeiro se o bit pegajoso --- neste caso, do diretório pai --- está definido.

$ find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done

Veja aqui para mais find de diversão e uma explicação sobre setgid .

    
por 21.10.2017 / 13:04
0

Você pode criar uma função mkdir e anexá-la ao final do arquivo vi ~/.bashrc da seguinte forma:

mkdir(){
    /bin/mkdir "$@"
    find . -type d \! -perm -1000 |while read d; do if [[ -k "$d/.." ]]; then chmod +t,g+s "$d"; fi; done
}
A opção

-k verifica se o bit adesivo foi definido, não o GUID, que está definido aqui também com g+s , verifique man test para essas opções

Além disso, você pode fazer isso:

unalias mkdir;
source ~/.bashrc

Isso deve definir o bit fixo para o novo subdiretório, mas somente se o pai tiver o bit de fixação definido.

Este método parece estar funcionando, mas não é certo para todos os usuários!

    
por 26.09.2018 / 12:18