파일이 루트에 의해 생성된 일반 텍스트 파일인 경우 다음 명령을 사용하십시오:
echo 'foo' > ./file.txt
당신의 ls -l
것은:
-rw-r--r-- root root ./file.txt
하지만 일반 사용자로서 이 설정을 변경할 수 있습니다.윔와 함께 저장 :w!
하거나sed명령, 이런 일이 발생하면사용자 및 그룹파일 소유자가 다음과 같이 변경됩니다.
-rw-r--r-- user user ./file.txt
다른 사람의 읽기 권한이 제거되면 chmod o-r ./file.txt
더 이상 변경할 수 없지만 복원되면 chmod o+r ./file.txt
다시 변경할 수 있다는 것을 알았습니다.
여기서 무슨 일이 일어나고 있는 걸까요? "기타" 읽기 권한을 통해 루트가 소유한 파일을 변경하고 사용자 및 그룹 소유권을 변경할 수 있는 이유는 무엇입니까?
왜 이런 일이 발생합니까?
추신: 저는 데비안 SID를 사용하고 있습니다.
답변1
이는 다음 두 가지 때문에 발생합니다.
vim
(적어도 이 경우에는) 그리고sed
라이브 편집을 하면 실제로는 원본 파일이 삭제되고 같은 이름의 새 파일이 생성됩니다.파일 삭제 기능은 파일 자체의 권한이 아니라 파일이 포함된 디렉터리의 권한에 따라 달라집니다.
따라서 여기서 일어나는 일은 디렉터리에 대한 쓰기 권한이 있다는 것입니다. 이는 파일 삭제 및 생성을 포함하여 디렉터리의 내용을 변경할 수 있음을 의미합니다. 그래서 를 실행 sed -i
하거나 저장 하면 :w!
원본 파일을 삭제하고 새 파일을 생성하게 됩니다. 이것이 소유권이 변경되는 이유이기도 합니다. 실제로는 다른 파일입니다.
파일의 내용을 확인할 수 있습니다.인덱스 노드편집 전과 후:
$ ls -ld foo/
drwxr-xr-x 2 terdon terdon 266240 Nov 16 13:43 foo/
$ cd foo
$ sudo sh -c 'echo foo > file'
$ ls -l
total 4
-rw-r--r-- 1 root root 4 Nov 16 13:43 file
이 명령 후에 일반 사용자는 file
쓰기 권한이 있는 디렉터리에 대한 루트 소유권을 갖습니다. foo/
이제 ls -i
다음을 사용하여 inode를 확인한 다음 변경 sed
하고 다시 확인해 보겠습니다.
$ ls -li file
26610890 -rw-r--r-- 1 root root 4 Nov 16 13:43 file
$ sed -i 's/foo/bar/' file
$ ls -li file
26610859 -rw-r--r-- 1 terdon terdon 4 Nov 16 15:40 file
vim
다음을 실행하여 동일한 작업을 수행하는 것을 볼 수도 있습니다.
strace vim file 2> strace.out
그런 다음 파일을 편집하고 다른 :w!
이름 으로 저장하면 다음 strace.out
이 표시됩니다.
unlink("file") = 0
open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "bar\n", 11) = 11
따라서 파일이 먼저 삭제되고( unlink("file")
), 같은 이름의 새 파일이 생성되고( open("file", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) 수정 사항이 해당 파일에 기록됩니다( write(4, "bar\n", 11)
).
위에서 볼 수 있듯이 inode가 변경되었습니다. 동일한 이름을 가진 새 파일입니다. 따라서 쓰기 권한이 없는 파일을 실제로 변경하는 것이 아니라목차해당 디렉터리에서 파일을 삭제한 다음 해당 디렉터리에 이전 파일과 동일한 이름으로 새 파일을 생성하면 쓰기 액세스 권한을 갖게 됩니다.
나는 비슷한 질문에 대답했습니다.https://askubuntu.com/a/815849/85695.
답변2
vim
파일은 수정할 수 없지만 파일이 연결된 디렉터리에 대한 쓰기 권한이 있고 디렉터리를 소유하거나 t
해당 권한에 비트를 설정하지 않은 경우 파일을 삭제하고 소유한 새 복사본으로 바꿀 수 있습니다. 당신에 의해.
이를 방지하려면 다음을 root
수행하십시오.
- 파일에
immutable
(chattr +i
) 또는 ( ) 플래그를 설정합니다append-only
. (그러면 삭제할 수도 없습니다.)chattr +a
root
- 상위 디렉터리에 대한 쓰기 권한 만 있는지 확인하세요
root
(사용자root
와 비트만 소유함 ; , ).w
chown root:
chmod u=rwx,go=rx
- 소유한 디렉토리는
root
다른 사람이 쓸 수 있지만 권한에t
(삭제 제한²) 비트( )가 있습니다(따라서 사용자는 자신이 소유한 파일만 삭제하거나 이름을 바꿀 수 있습니다).chmod o+t
/a/b/file
¹ if라는 이름의 파일에 대해 then user
에 대한 쓰기 액세스 권한이 있으면 이름을 바꾸고 그 안에 자신만의 이름을 다시 만들 /a
수도 있습니다 ./a/b
/a/b.old
/a/b
/a/b/file
² 들어본 적이 있을 것입니다.끈끈한 비트이 비트에 대한 용어이지만 일반 실행 파일(아주 오래된 시스템에서만)에 적용될 때 실행 파일의 텍스트를 메모리에 유지하도록 시스템에 지시(지시하는 데 사용됨)됩니다. 이 비트는 디렉터리에 적용될 때 다른, 관련 없는 의미를 갖습니다.