ACL 또는 chmod를 사용하여 다른 사용자에게 쓰기 권한을 부여할 수 없습니다.

ACL 또는 chmod를 사용하여 다른 사용자에게 쓰기 권한을 부여할 수 없습니다.

Rocky가 왜 편지를 쓸 수 없는지 아는 사람 있나요 /tmp/afile? 다른 사용자가 불안정한 권한을 부여하는 것도 chmod o+w안되는 것 같습니다

답변1

귀하의 예상은 정확합니다. 파일에 대한 쓰기 권한이 있고 포함된 모든 디렉토리에 대한 실행 권한이 있으므로 권한 은 rocky쓰기를 허용해야 합니다. 그러나 Linux에서는 추가적인 보안 강화 메커니즘이 발생합니다. 이 메커니즘이 활성화되면 일부 파일이 디렉토리에 기록됩니다.afilerocky끈끈한 비트금지.

디렉토리의 고정 비트는 t목록에 있는 파일 모드/권한의 마지막 10자로 로 표시되며 ls -l를 사용하여 설정할 수 있습니다 chmod +t. 일반적으로 디렉터리에 대한 고정 비트의 영향은 파일 소유자만 파일을 삭제하거나 이름을 바꿀 수 있다는 것입니다. 기존 파일에 쓰는 데에는 영향을 주지 않습니다.

그러나 언제fs.protected_regularsysctl이 활성화되면 고정 비트는 추가적인 결과를 가져옵니다. 사용자는 파일을 소유하지 않는 한 쓰기 위해 고정 디렉터리에 있는 파일을 열 수 없습니다.존재하지 않는 경우 파일을 생성하는 방식으로 파일을 여는 경우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=0sysctl 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.  

관련 정보