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

2番目(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

最後に、3番目のスクリプト(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 オプションを使用します。

おすすめ記事