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 オプションを使用します。