디렉터리 생성을 방지하지만 파일 생성은 허용합니다.

디렉터리 생성을 방지하지만 파일 생성은 허용합니다.

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이 추가되기 전에 일부 디렉터리가 생성된 경우).

관련 정보