ACL não cumprido por mv e tar

3

Estou tentando configurar uma área no meu sistema de arquivos ext4 (no Debian Jessie), onde todos os membros do grupo "staff" podem ler e gravar arquivos existentes e recém-criados.

O sistema de arquivos é montado com a opção acl:

$ more /etc/fstab | grep acl
UUID=f47c5337-a6e1-4554-b8c0-e05c761ec835 / ext4 noatime,errors=remount-ro,acl 0 1

Eu criei alguns scripts bash para definir ACLs de forma direta e testá-lo em vários cenários.

O primeiro ( createtestdir.sh ) cria um diretório de teste com alguns arquivos e dir dentro:

#!/bin/bash

if [ $# != 1  ]; then
    echo "usage: $0 /path/to/new/directory"
    exit
fi

if [ ! -d "$1" ] && [ ! -f "$1" ] && [ ! -L "$1" ]
then    
    mkdir $1
    mkdir $1/dir
    touch $1/file
    touch $1/dir/file
    echo "Directory $1 created"
else
    echo "$1 already exist"
fi

O segundo ( setacl.sh ) definir permissões e ACLs no diretório especificado, talvez surjam problemas aqui:

#!/bin/bash

if [ $# != 1  ]; then
    echo "usage: $0 /path/to/directory"
    exit
fi

if [ -d "$1" ]; then
    chgrp -R staff $1
    chmod g+rwxs $1
    setfacl -dm group:staff:rwx $1
    /usr/bin/find $1 -type d -exec chmod g+rwxs {} +
    /usr/bin/find $1 -type d -exec setfacl -dm group:staff:rwx {} +
    /usr/bin/find $1 -type f -exec chmod g+rw {} +
    /usr/bin/find $1 -type f -exec setfacl -m group:staff:rw {} +

    echo "Permission changed"
else
    echo "Directory $1 does not exist"
fi

Finalmente, o terceiro script ( acltest.sh ) testa o comportamento da ACL criando arquivos e diretórios, movendo, copiando e descompactando e arquivando:

#!/bin/bash

if [ $# != 1  ]; then
    echo "usage: $0 /path/to/directory"
    exit
fi

if [ -d "$1" ]
then    
    #testing acl
    mkdir $1/test_dir
    touch $1/test_dir/file
    touch $1/test_file
    # testing mv
    touch $1/file_from_internal
    touch file_from_external
    ls -l file_from_external
    mv file_from_external $1
    # testing tar && cp
    mkdir test_tar
    touch test_tar/file
    tar cjf test.tar.bz2 test_tar
    cp test.tar.bz2 $1
    ls -ld test_tar
    ls -l test.tar.bz2
    rm -rf test_tar
    rm test.tar.bz2
    cd $1
    tar xjf test.tar.bz2
    echo "Test on $1 completed"
else
    echo "$1 already exist"
fi

Executando os scripts, os scripts na ordem correta fornecem a seguinte saída:

$ ./createtestdir.sh Acl
Directory Acl created
$ ./setacl.sh Acl/
Permission changed
$ ./acltest.sh Acl/
-rw-r--r-- 1 gabo gabo 0 feb 24 11:58 file_from_external
drwxr-xr-x 2 gabo gabo 4096 feb 24 11:24 test_tar
-rw-r--r-- 1 gabo gabo 146 feb 24 11:24 test.tar.bz2
Test on Acl/ completed

Imprimi as permissões do diretório e do arquivo que são descompactados e copiados dentro do diretório de teste do Acl, para que possam ser comparados com os respectivos arquivos dentro do diretório de teste do Acl.

Como você pode ver com ls, pemissions e ACLs não são os esperados (por mim, é claro :)

$ ls -l Acl/
totale 16
drwxrwsr-x+ 2 gabo staff 4096 feb 24 11:24 dir
-rw-rw-r--+ 1 gabo staff    0 feb 24 11:24 file
-rw-r--r--  1 gabo gabo     0 feb 24 11:24 file_from_external
-rw-rw-r--+ 1 gabo staff    0 feb 24 11:24 file_from_internal
drwxrwsr-x+ 2 gabo staff 4096 feb 24 11:24 test_dir
-rw-rw-r--+ 1 gabo staff    0 feb 24 11:24 test_file
drwxr-sr-x+ 2 gabo staff 4096 feb 24 11:24 test_tar
-rw-r--r--+ 1 gabo staff  146 feb 24 11:24 test.tar.bz2

file_from_internal está ok. Foi criado dentro do diretório e tem permissões corretas e ACL.

file_from_external não está ok. Ele foi movido do diretório pai, ele carrega as permissões antigas e não tem a ACL. Parece que o comando mv não funciona com o ACL .

test.tar.bz2 é estranho. Ele foi copiado do diretório pai, ele carrega as permissões antigas e implementa a ACL incorreta (o arquivo não pode ser gravado pelo grupo da equipe):

$ getfacl Acl/test.tar.bz2 
# file: Acl/test.tar.bz2
# owner: gabo
# group: staff
user::rw-
group::rwx          #effective:r--
group:staff:rwx         #effective:r--
mask::r--
other::r--

Parece que o cp também não funciona com o ACL

O diretório

test_tar também não tem permissão de gravação em grupo, mas herda o comportamento padrão da ACL: /

$ getfacl Acl/test_tar
# file: Acl/test_tar
# owner: gabo
# group: staff
# flags: -s-
user::rwx
group::rwx          #effective:r-x
group:staff:rwx         #effective:r-x
mask::r-x
other::r-x
default:user::rwx
default:group::rwx
default:group:staff:rwx
default:mask::rwx
default:other::r-x

Se eu tentar criar um arquivo dentro de test_tar usando um usuário diferente (membro da equipe), recebo um erro de permissão negada.

O que há de errado no meu script setacl.sh? Talvez haja algum bug / pegadinha / comportamento que eu não conheço?

Desculpe pela longa pergunta, mas eu gostaria de fornecer um conjunto de testes replicável para verificar em diferentes ambientes sem precisar digitar muitos comandos de shell.

    
por g4b0 24.02.2017 / 12:23

1 resposta

0

Esta resposta apenas resolve o seu problema de tar.

O utilitário tar não retém os atributos estendidos por padrão. Como os contextos do SELinux são armazenados em atributos estendidos, os contextos podem ser perdidos ao arquivar arquivos. Use a opção tar --selinux para criar arquivos que retenham contextos e restaurem arquivos dos arquivos.

    
por 25.02.2017 / 03:48