ディレクトリの作成は防ぎますが、ファイルの作成は許可します。

ディレクトリの作成は防ぎますが、ファイルの作成は許可します。

Sambaを介して共有されたディレクトリがあります。ユーザーはファイルを作成/編集/削除できますが、ディレクトリは作成/削除できないことを望みます。私はまだこれを行う方法を見つけることができませんでした。 SELinuxを使用しますか?しかし、どのように?

答え1

エレガントな方法は使用することですリチャード。しかし、まだ正式にカーネルの一部ではないので、使用するのは難しいかもしれません。

簡単な回避策は、sambaパラメータを使用して、新しく作成されたディレクトリをユーザーが役に立たない(アクセスできないように)directory mask作成してforce directory security mode、ユーザーがディレクトリを作成しない方法を学ぶことです。

興味深く移植可能なアプローチは、ファイルシステムのサブディレクトリの制限に達するほど(見えない)サブディレクトリをあまりにも多くすることです。新しいサブディレクトリが必要な場合、管理者は単に名前を変更できます。

答え2

あなたができることはFUSEファイルシステムを使うことです。たとえば、bindfs無効にするハイジャッカーとシステムコールを組み合わせます。ファイルを生成するのと同じです。LD_PRELOADmkdirrmdirwrapper.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独自にインストールされますが、ディレクトリを作成または削除することはできません。

君はまだ出来る名前を変更するしかし、ディレクトリ。

答え3

Linuxおよびext4ファイルシステムでディレクトリ(他の種類のファイルを除く)が作成されるのを防ぐための賢い方法は、次のことを継承して新しく作成されたディレクトリに依存することです。基本ACLエントリその親ディレクトリでは、(デフォルト以外のACLエントリに加えて)、そのファイルにはそのデフォルト以外のACLエントリのみが割り当てられます。そして少なくともext4では、各inodeにこれらのACLエントリを格納できるスペースが制限されています。

したがって、ディレクトリスペースを次に埋めると基本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が追加される前にいくつかのディレクトリが作成された場合)。

関連情報