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

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

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

표준 Unix 파일 권한으로는 이것이 가능하지 않을 것 같지만 ACL을 사용하는 것은 가능할까요? 사용자는 항상 SFTP를 사용하여 연결하므로 (OS 권한 대신) SFTP에서 이를 제어할 수 있는 방법이 있다면 괜찮을 것입니다.

확실히 하기 위해 다음을 원합니다.

  • echo hello > test # 성공, 테스트가 존재하지 않으므로 생성이 허용됩니다.
  • echo hello >> 테스트 #는 추가 허용 여부에 따라 성공하거나 실패할 수 있습니다.
  • echo hello2 > test #테스트가 이미 존재하고 수정이 허용되지 않아 실패했습니다.
  • cat 테스트 # 읽기가 허용되었기 때문에 성공했습니다.
  • 삭제가 허용되지 않아 rm 테스트 # 실패

제가 왜 이러는지 궁금하시다면, Duplicati 백업 시스템을 랜섬웨어에 저항할 수 있게 만들기 위해서입니다.

답변1

다음과 같이 사용할 수 있습니다 bindfs.

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

이 디렉토리는 Stephane이 소유하며 Stephane 그룹(Stephane이 유일한 구성원)에 속합니다. 또한 t이렇게 하면 사용자가 자신에게 속하지 않은 항목의 이름을 바꾸거나 삭제할 수 없습니다.

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

우리는 bindfs dir파일과 디렉터리에 대한 소유권과 권한을 고정했습니다. 모든 파일은 소유자로 표시됩니다 root(실제 디렉토리에 있더라도 여전히 Stephane에 속합니다).

디렉터리에는 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해당 항목의 이름을 바꾸거나 삭제할 수 있습니다.

답변2

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

관련 정보