소유자가 파일을 만들고 읽을 수는 있지만 수정하거나 삭제할 수는 없습니다.


17

특정 디렉토리에서 파일을 만들고 읽을 수있는 권한을 사용자에게 부여하고 싶지만 파일을 수정하거나 삭제할 수는 없습니다. 사용자가 괜찮은 파일을 추가 할 수 있다면 오히려 그렇지 않습니다. 이것은 우분투 리눅스에 있습니다.

표준 Unix 파일 권한으로는 불가능하다고 생각하지만 ACL을 사용하여 가능할 수 있습니까? 사용자는 항상 SFTP를 사용하여 연결하므로 SFTP 내에서 (OS 권한이 아닌)이를 제어 할 수있는 방법이 있다면 괜찮을 것입니다.

분명히하기 위해 다음을 원합니다.

  • echo hello> test #가 성공합니다. 테스트가 존재하지 않고 생성이 허용되기 때문입니다.
  • 반향 허용 여부에 따라 echo hello >> test # 성공 또는 실패
  • echo hello2> test #는 테스트가 이미 존재하고 수정이 허용되지 않기 때문에 실패합니다.
  • 읽기가 허용되므로 cat test # 성공
  • 삭제가 허용되지 않으므로 rm 테스트 #이 실패합니다.

내가 왜 이것을하고 싶은지 궁금하다면, Duplicati 백업 시스템을 랜섬웨어에 내성을 갖도록 만들어야합니다.


1
파일은 항상 비어 있습니다. 당신이 할 때 echo > test, 쉘은 open("test", O_WRONLY|O_CREAT|O_TRUNC)파일을 생성 한 다음 echo내용을 쓰는 호출하여 파일을 수정합니다. 이제 첫 번째 open (WR) 만 성공할 수 있습니다.
— Stéphane Chazelas

@ StéphaneChazelas-추가가 허용됨을 명확히하기 위해 편집 됨
— paj28

답변:


16

당신은 다음 bindfs과 같이 사용할 수 있습니다 :

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

이 디렉토리는 스테판 그룹이 소유 한 스테판 그룹 (스테판이 유일한 구성원)입니다. 또한 t사용자가 소유하지 않은 항목의 이름을 바꾸거나 제거하지 못하게합니다.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

우리는 bindfs dir파일과 디렉토리에 대한 고정 된 소유권과 권한을 가지고 있습니다. 모든 파일은 소유 한 것으로 나타납니다 root(실제 디렉토리에는 스테판이 소유하고 있음).

drwxrwxr-x root stephane다른 유형의 파일은 디렉토리를 얻는 반면, 디렉토리는 권한을 얻습니다 -rw-r--r-- root stephane.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

이제 디렉토리를 쓸 수 있으므로 파일 작성이 작동합니다.

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

그러나 파일에 대한 권한이 없으므로 해당 파일에 대해 두 번째 쓰기 를 수행 open()할 수 없습니다.

$ echo test > dir/file
zsh: permission denied: dir/file

(초기 요구 사항의 일부가 아닌) 추가는 허용되지 않습니다.

제한 사항 : 비트로 dir인해 항목을 제거하거나 이름을 바꿀 수 없지만 t거기에서 생성하는 새 디렉토리에는 해당 t비트가 없으므로 항목의 이름을 바꾸거나 삭제할 수 있습니다.


훌륭합니다! 이러한 우아한 솔루션을 개발하기 위해 시간을 내 주셔서 감사합니다. 나는 bindfs에 대해 들어 본 적이 있지만, 실제로 이것을 사용한 것은 이번이 처음이다.
— paj28

4

이 chattr +a옵션은 추가 만 허용합니다. 파일은 이런 식으로 변경 될 수 있지만 파일에 줄을 추가하여 추가해야합니다. 기존 파일은 삭제할 수 없지만 새 파일을 만드십시오. 이것은 당신의 필요에 맞을 수 있습니다 :

sudo chattr -R +a /dir/to/apply/to

...에서 man chattr

`a '속성이 설정된 파일은 쓰기 위해 추가 모드에서만 열 수 있습니다. 수퍼 유저 또는 CAP_LINUX_IMMUTABLE 기능을 가진 프로세스 만이 속성을 설정하거나 지울 수 있습니다.

(디렉토리에도 적용됨)

따라서 목록은 다음과 같습니다.

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

좋아, 유망한 소리. 삭제를 올바르게 방지하고 파일에 속성이 있으면 덮어 쓰기를 방지합니다. 그러나 새 파일이 작성 될 때 속성을 자동으로 가져 오지 않습니다. 이런 일이 자동으로 일어날 수있는 방법이 있습니까?
— paj28

디렉토리에 속성이있는 경우 속성이 명시 적으로 설정되어 있지 않아도 파일은 그에 따라 작동합니다. 문제는 새로운 하위 디렉토리의 파일입니다. 예를 들어 dir1은 chattr +a파일을 만들 수 있으며 제거 할 수 없으며 추가 할 수 있습니다. dir1 / dir2를 만들면 dir2에서 원하는대로 할 수 있습니다
— Fiximan

1
안타깝게도 : dpaste.com/042XQ7X
— paj28

Aahh, 죄송합니다. 이전에 잘못된 테스트를했습니다
— Fiximan

@ paj28 귀하의 링크가 끊어졌습니다 :-(
— mjaggard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.