
여기서 sudo에 권한이 없는 이유를 이해하려고 합니다.
touch fred.txt
/tmp$ ls -la fred.txt
-rw-rw-r-- 1 me me 0 Dec 12 15:40 fred.txt
/tmp$ sudo -i
~# cd /tmp
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
/tmp# chmod 666 fred.txt
/tmp# ls -la fred.txt
-rw-rw-rw- 1 me me 0 Dec 12 15:40 fred.txt
/tmp# echo hi >> fred.txt
-bash: fred.txt: Permission denied
id
uid=0(root) gid=0(root) groups=0(root)
내가 이해하는 바에 따르면 권한 666은 파일에 대한 읽기/쓰기에 대한 소유자, 그룹 및 기타 권한을 부여해야 합니다. id 명령으로 알 수 있듯이 루트 역할을 하는 sudo는 'other' 권한으로 파일에 액세스할 수 있습니다.
내가 여기서 무엇을 오해하고 있습니까?
답변1
뭔가 관련이 있어요이 커밋리눅스 커널에서. 종종 /tmp
"세계적으로 쓰기 가능"하고(여기서 "세계"는 "기타"를 의미함) "고정적"입니다.
$ stat /tmp/
...
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
...
chmod(2)
:
...
S_ISVTX (01000) sticky bit (restricted deletion flag, as described in unlink(2))
...
S_IWOTH (00002) write by others
...
커밋 메시지에서 언급했듯이 영향을 받는 파일에 쓰는 것을 막는 것이 아니라 해당 파일을 에 O_CREAT
대한 플래그인 로 여는 것을 막는 것입니다.open()
이는 일반적으로 대상이 아직 존재하지 않는 경우 파일 생성을 트리거하도록 설정됩니다. 따라서 플래그가 설정되지 않은 상태에서도 영향을 받는 파일에 계속 쓸 수 있습니다( 로 수행 가능 dd
).
# ls -l /tmp/meh
-rwxrwxrwx 1 tom tom 0 Dec 12 17:33 /tmp/meh
# id
uid=0(root) gid=0(root) groups=0(root)
# echo test | dd of=/tmp/meh oflag=append conv=notrunc
dd: failed to open '/tmp/meh': Permission denied
# echo test | dd of=/tmp/meh oflag=append conv=notrunc,nocreat
0+1 records in
0+1 records out
5 bytes copied, 9.4981e-05 s, 52.6 kB/s
#
플래그가 설정되었는지 여부는 순전히 중요하지만 파일을 만들어야 하는지 여부는 중요하지 않습니다. 문제의 경우 파일이 항상 존재하기 때문입니다.
또한 커밋 메시지에서 언급했듯이 파일을 열 수 없습니다 O_CREAT
.단지열려고 시도한 사용자가 소유한 것이 아니기 때문에( root
), 소유자( )가 디렉터리( )의 tom
소유자( )와 다르기 때문입니다 . 원래 대로 소유했다면 , 그랬을 것입니다.root
/tmp
/tmp/
tom
/tmp/meh
root
할 수 있는로 열려면 O_CREAT
.
또한 참조하십시오이 커밋이를 채택한 배포판에서 "보호"를 활성화하는 systemd에서:
# sysctl fs.protected_regular
fs.protected_regular = 1
관련 sysctls설정할 수도 있습니다 2
(또는 0
)..