Rocky가 왜 편지를 쓸 수 없는지 아는 사람 있나요 /tmp/afile
? 다른 사용자가 불안정한 권한을 부여하는 것도 chmod o+w
안되는 것 같습니다
답변1
귀하의 예상은 정확합니다. 파일에 대한 쓰기 권한이 있고 포함된 모든 디렉토리에 대한 실행 권한이 있으므로 권한 은 rocky
쓰기를 허용해야 합니다. 그러나 Linux에서는 추가적인 보안 강화 메커니즘이 발생합니다. 이 메커니즘이 활성화되면 일부 파일이 디렉토리에 기록됩니다.afile
rocky
끈끈한 비트금지.
디렉토리의 고정 비트는 t
목록에 있는 파일 모드/권한의 마지막 10자로 로 표시되며 ls -l
를 사용하여 설정할 수 있습니다 chmod +t
. 일반적으로 디렉터리에 대한 고정 비트의 영향은 파일 소유자만 파일을 삭제하거나 이름을 바꿀 수 있다는 것입니다. 기존 파일에 쓰는 데에는 영향을 주지 않습니다.
그러나 언제fs.protected_regular
sysctl이 활성화되면 고정 비트는 추가적인 결과를 가져옵니다. 사용자는 파일을 소유하지 않는 한 쓰기 위해 고정 디렉터리에 있는 파일을 열 수 없습니다.존재하지 않는 경우 파일을 생성하는 방식으로 파일을 여는 경우O_CREAT
, 프로그램은 파일을 시스템 호출에 전달하여 open
이를 나타냅니다 . 여기서 미묘한 점에 유의하십시오. 일반적인 동작은 파일이 존재하는지 여부에만 기반을 두는 반면 향상된 동작은 파일이 존재하지 않는 경우 생성되는지 여부를 기반으로 합니다. 이는 파일이 생성되었을 수 있는 방식으로 파일을 여는 데에만 영향을 미칩니다. 다른 방법을 사용하여 파일에 쓰는 것은 여전히 허용됩니다.
이는 고정 비트가 없는 디렉터리의 파일에는 영향을 미치지 않습니다. 특히 디렉터리를 생성했는데 디렉터리 /tmp/foo
에 /tmp/foo
고정 비트가 없으면 파일 권한이 /tmp/foo
제대로 작동합니다.
다음 표에는 관련 시나리오에서 쓰기 위해 파일을 열 때 시스템 호출의 동작이 요약되어 있습니다 open
(디렉토리가 존재하고 프로그램이 그 안에 있는 파일에 액세스할 수 있으며, 파일이 존재하는 경우 프로그램은 이에 대한 쓰기 권한을 갖습니다).
목차 | 문서 | 그리고O_CREAT |
아니요O_CREAT |
---|---|---|---|
rwxr-xr-x (755) |
존재함, 쓰기 가능(666) | 좋아요 | 좋아요 |
rwxr-xr-x (755) |
존재하지 않는다 | 좋아요 | ENOENT |
rwxrwxrwx (777) |
존재함, 쓰기 가능(666) | 좋아요 | 좋아요 |
rwxrwxrwx (777) |
존재하지 않는다 | 좋아요 | ENOENT |
rwxr-xr-t (1755) |
존재함, 쓰기 가능(666) | 좋아요 | 좋아요 |
rwxr-xr-t (1755) |
존재하지 않는다 | 좋아요 | ENOENT |
rwxrwxrwt 【1777】보통 |
존재함, 쓰기 가능(666) | 좋아요 | 좋아요 |
rwxrwxrwt 【1777】보통 |
존재하지 않는다 | 좋아요 | ENOENT |
rwxrwxrwt (1777) 강화된 Linux |
존재함, 쓰기 가능(666) | EACCES |
좋아요 |
rwxrwxrwt (1777) 강화된 Linux |
존재하지 않는다 | 좋아요 | ENOENT |
( ENOENT
"해당 파일이나 디렉터리가 없습니다" 오류입니다. EACCES
"권한이 거부되었습니다" 오류입니다.)
sysctl fs.protected_regular=0
sysctl fs.protected_regular=1
(비활성화), (전역적으로 쓰기 가능한 디렉터리에 대해 활성화) 또는 sysctl fs.protected_regular=2
(세계 쓰기 가능 또는 그룹 쓰기 가능 디렉터리에 대해 활성화)를 통해 이 강화를 활성화할지 여부를 제어할 수 있습니다 . 시작 시 /etc/sysctl.conf
또는 에서 설정을 지정할 수 있습니다 /etc/sysctl.d/*
. 일부 배포판에서는 기본적으로 활성화하지만 다른 배포판에서는 활성화하지 않습니다. 이 protected_regular
설정은 일반 파일에 적용됩니다. 비슷한 설정이 있습니다.명명된 파이프.
이를 직접 확인하려면(Linux에서 실행 중이고 루트 액세스 권한이 있는 경우) 루트로 다음 명령을 실행하십시오.
mkdir /tmp/experiment
mkdir -m 1777 /tmp/experiment/sticky-world
mkdir -m 777 /tmp/experiment/ordinary-world
mkdir -m 1755 /tmp/experiment/sticky-user
mkdir -m 755 /tmp/experiment/ordinary-user
for d in /tmp/experiment/*; do touch $d/file; chown nobody:nogroup $d/file; chmod 666 $d/file; done
권한을 확인하세요:
$ ls -l /tmp/experiment
total 16
drwxr-xr-x 2 root root 4096 Jul 3 21:10 ordinary-user
drwxrwxrwx 2 root root 4096 Jul 3 21:10 ordinary-world
drwxr-xr-t 2 root root 4096 Jul 3 21:10 sticky-user
drwxrwxrwt 2 root root 4096 Jul 3 21:10 sticky-world
$ ls -l /tmp/experiment/*/file
-rw-rw-rw- 1 nobody nogroup 0 Jul 3 21:10 /tmp/experiment/ordinary-user/file
-rw-rw-rw- 1 nobody nogroup 0 Jul 3 21:10 /tmp/experiment/ordinary-world/file
-rw-rw-rw- 1 nobody nogroup 0 Jul 3 21:10 /tmp/experiment/sticky-user/file
-rw-rw-rw- 1 nobody nogroup 0 Jul 3 21:10 /tmp/experiment/sticky-world/file
이제 루트가 아닌 사용자로서 플래그를 사용하여 한 번 , 플래그 없이 한 번 nobody
쓰기 위해 파일을 여는 코드를 실행해 보겠습니다 . O_CREAT
쉘이 직접 액세스를 제공하지 않기 때문에 Perl을 사용하고 있습니다 O_CREAT
(쉘 쓰기 리디렉션은 활성화된 일부 쉘을 O_CREAT
제외하고 항상 활성화 됩니다 noclobber
). 강화된 Linux의 경우:
$ perl -w -MFcntl -e 'foreach (@ARGV) { sysopen(F, $_, O_WRONLY | O_CREAT) or warn "$_: $!\n"; close F; }' /tmp/experiment/*/file
/tmp/experiment/sticky-world/file: Permission denied
$ perl -w -MFcntl -e 'foreach (@ARGV) { sysopen(F, $_, O_WRONLY) or warn "$_: $!\n"; close F; }' /tmp/experiment/*/file
Linux 강화가 없으면 프로그램에 파일 쓰기 권한이 있으므로 모든 파일 열기가 성공합니다.
감사가 활성화된 경우 쓰기를 시도하면 기록되는 감사 이벤트가 /tmp/experiment/sticky-world/file
트리거 됩니다 (또는 이러한 로그가 배포에 있는 모든 위치). (그래서 이전에는 몰랐던 Linux 메커니즘을 발견했습니다.)ANOM_CREAT
/var/log/audit/audit.log
답변2
(+t)의 끈적한 비트로 인해 /tmp
.
man 1 chmod
제한 제거 플래그 또는 고정 비트
The restricted deletion flag or sticky bit is a single bit, whose in‐ terpretation depends on the file type. For directories, it prevents unprivileged users from removing or renaming a file in the directory unless they own the file or the directory; this is called the re‐ stricted deletion flag for the directory, and is commonly found on world-writable directories like /tmp.