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