Sambaを介して共有されているディレクトリがあります。ユーザーがファイルを作成/変更/削除できるようにしたいが、ディレクトリを作成/消去できないようにしたい。私はそれをする方法を見つけていません。たぶんSELinuxで?しかし、どのように?
エレガントな方法は richacls を使用することです。しかし、それはまだカーネルの公式な部分ではないため、使用するのが難しい場合があります。
簡単な回避策は、sambaパラメータdirectory mask
およびforce directory security mode
を使用して、新しく作成されたディレクトリをユーザーが使用できない(アクセスできない)ようにして、ユーザーがディレクトリを作成しないようにすることです。
面白い(そして移植可能な!)方法は、ファイルシステムのサブディレクトリの制限に達するほど多くの(見えない)サブディレクトリを作成することです。新しいサブディレクトリが必要な場合、管理者はそれらの1つを単に名前変更します。
できることは、bindfs
のようなFuseファイルシステムをmkdir
およびrmdir
システムコールを無効にするLD_PRELOAD
ハイジャッカーと組み合わせて使用することです。 wrapper.c
ファイルを次のように作成します。
#include <errno.h>
int mkdir() { errno = EPERM; return -1; }
int rmdir() { errno = EPERM; return -1; }
コンパイル:
gcc -fPIC -shared -o wrapper.so wrapper.c
そして実行します:
LD_PRELOAD=$PWD/wrapper.so bindfs the-dir the-dir
これはthe-dir
をそれ自体の上にマウントしますが、ディレクトリを作成または削除する機能はありません。
ただし、ディレクトリの名前を名前変更することはできます。
Linuxおよびext4ファイルシステムでは、ディレクトリ(および他のタイプのファイルではない)が作成されないようにするためのハックな方法は、新しく作成されたディレクトリがデフォルトのACLエントリ(対応するデフォルト以外のACLエントリに加えて)親ディレクトリから、ファイルには対応するデフォルト以外のACLエントリのみが割り当てられますおよび少なくともext4では、これらのACLエントリを格納するためのiノードあたりの限られたスペース。
したがって、ディレクトリのスペースをデフォルトのACLエントリでいっぱいにした場合でも、そこにファイルを作成できます。ただし、システムはデフォルトと非デフォルトの両方のACLエントリを作成できないため、ディレクトリは作成できません。
$ i=50000; while setfacl -m "d:u:${i}:-" .; do i=$((i + 1)); done
setfacl: .: No space left on device
(そのループの終了条件は、setfaclが失敗したときです(ACLエントリをこれ以上追加できないため、ここではENOSPCで))。
$ getfacl . | grep -c default:
507
507個のデフォルトACLエントリが追加されました(ユーザー50000〜50506に対して、そこに作成されたファイルおよびディレクトリへのアクセスを事実上拒否します)。
$ touch file
$ mkdir dir
mkdir: cannot create directory ‘dir’: No space left on device
$ ls -l
total 4
-rw-r--r--+ 1 chazelas chazelas 0 Nov 27 13:35 file
root
でさえ、そこにディレクトリを作成することはできません。
$ Sudo mkdir x
mkdir: cannot create directory ‘x’: No space left on device
ただし、ユーザーがそこにあるディレクトリを削除したり名前を変更したりすることを妨げることはありません(デフォルトのACLを追加する前にディレクトリが作成されている場合)。