소유자가 파일을 만들고 읽을 수는 있지만 수정하거나 삭제할 수는 없습니다. 수있는 방법이 있다면 괜찮을 것입니다. 분명히하기

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

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

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

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

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



답변

당신은 다음 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비트가 없으므로 항목의 이름을 바꾸거나 삭제할 수 있습니다.


답변

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


답변