mv 및 tar는 ACL을 존중하지 않습니다.

mv 및 tar는 ACL을 존중하지 않습니다.

ext4나는 모든 "작업자" 그룹 구성원이 기존 파일과 새로 생성된 파일을 읽고 쓸 수 있는 내 파일 시스템(Debian Jessie)에 영역을 설정하려고 합니다 .

파일 시스템은 acl 옵션을 사용하여 마운트됩니다.

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

디렉터리에 ACL을 설정하기 위해 몇 가지 bash 스크립트를 만들고 다양한 시나리오에 대해 테스트했습니다.

첫 번째 항목( createtestdir.sh)은 일부 파일과 디렉터리가 포함된 테스트 디렉터리를 만듭니다.

#!/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

두 번째( setacl.sh)는 지정된 디렉터리의 권한과 ACL을 설정하며, 이로 인해 문제가 발생할 수 있습니다.

#!/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

마지막으로 세 번째 스크립트( acltest.sh)는 파일 및 디렉터리 생성, 이동, 복사, 압축 풀기 및 보관 등 ACL의 동작을 테스트합니다.

#!/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

올바른 순서로 스크립트를 실행하면 다음과 같은 출력이 제공됩니다.

$ ./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

개별적으로 압축을 풀고 Acl 테스트 디렉터리에 복사한 디렉터리와 파일의 권한을 인쇄하여 Acl 테스트 디렉터리의 해당 파일과 비교할 수 있었습니다.

ls를 통해 볼 수 있듯이 권한과 ACL이 예상과 다릅니다(물론 내 것입니다 :)

$ 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

파일이 내부에서 옵니다.괜찮아요. 올바른 권한과 ACL을 사용하여 디렉터리 내부에 생성됩니다.

외부의 파일아니요. ACL 없이 이전 권한을 사용하여 상위 디렉터리에서 이동되었습니다.mv 명령은 ACL과 함께 사용할 수 없는 것 같습니다.

test.tar.bz2 아주 이상한. 상위 디렉터리에서 복사되었으며 이전 권한이 있었고 잘못된 ACL을 구현했습니다(직원 그룹에서 파일을 쓸 수 없음).

$ 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--

ACL에도 cp가 적용되지 않는 것 같습니다.

타르 테스트또한 디렉터리에는 그룹 쓰기 권한이 없지만 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

다른 사용자(작업자)를 사용하여 test_tar에 파일을 생성하려고 하면 권한 거부 오류가 발생합니다.

내 setacl.sh 스크립트에 어떤 문제가 있나요? 어쩌면 내가 모르는 버그/문제/동작이 있을 수도 있나요?

많은 쉘 명령어를 입력하지 않고도 다양한 환경에서 확인할 수 있도록 재현 가능한 테스트 스위트를 제공하고 싶습니다.

답변1

이 답변은 타르 문제만 해결합니다.

기본적으로 tar 유틸리티는 확장된 속성을 유지하지 않습니다. SELinux 컨텍스트는 확장된 속성에 저장되므로 파일을 보관할 때 컨텍스트가 손실될 수 있습니다. 컨텍스트 보존 아카이브를 생성하고 아카이브에서 파일을 복원하려면 tar --selinux 옵션을 사용하십시오.

관련 정보