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


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.