다른 사용자의 비어 있지 않은 하위 디렉터리가 내 디렉터리에서 삭제되지 않도록 안전합니까?

다른 사용자의 비어 있지 않은 하위 디렉터리가 내 디렉터리에서 삭제되지 않도록 안전합니까?

다음 상황에서는ls -alh

total 0
drwxrwx--- 1 user http  20 Nov 30 08:08 .
drwxrws--- 1 user http 310 Nov 30 08:07 ..
drwx------ 1 http http  10 Nov 30 08:08 empty-subdir
drwx------ 1 http http  12 Nov 30 08:08 non-empty-subdir

여기에 두 개의 하위 디렉터리(내가 소유하지 않음)가 있으며 다음과 같이 나열합니다.

sudo ls empty-subdir -alh
total 0
drwx------ 1 http http 10 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..

sudo ls non-empty-subdir -alh
total 0
drwx------ 1 http http 12 Nov 30 08:08 .
drwxrwx--- 1 user http 20 Nov 30 08:08 ..
drwx------ 1 http http  0 Nov 30 08:08 subdir

두 하위 디렉터리의 차이점은 비어 있지 않은 디렉터리에 non-empty-subdir폴더가 포함되어 있다는 것입니다.

내 질문은 하위 디렉터리를 제거하려고 하면 의도적으로 rm -rf결과가 나오는지 여부입니다.

$ rm empty-subdir -rf
$ rm non-empty-subdir -rf
rm: cannot remove 'non-empty-subdir': Permission denied
$ ls -alh
total 0
drwxrwx---+ 1 user http  10 Nov 30 08:14 .
drwxrws---+ 1 user http 310 Nov 30 08:07 ..
drwx------+ 1 http http  12 Nov 30 08:08 non-empty-subdir

디렉토리에 대한 쓰기 권한이 있는 사용자는 파일 항목이나 다른 사용자의 빈 하위 디렉토리를 제거할 수 있지만비어 있지 않은하위 디렉토리.

이 질문에 대한 이상적인 대답은 다음과 같은 정보를 제공합니다.

  • 설명된 동작이 다른 컴퓨터에서 재현 가능하다는 확인(단순히 망가진 상자의 문제가 아님)
  • 해당 동작을 설명하는 근거(예: 사용 사례가 있습니까?)
  • 시스템(BSD, Linux...) 간에 차이점이 있는 경우 개요

업데이트: Ipor Sircer의 의견과 관련하여 ACL 기능 없이 시나리오를 다시 테스트했는데 동일합니다. 따라서 +동작이 ACL과 관련될 수 있다는 생각을 일으키지 않도록 목록에서 es를 제거하도록 질문을 수정했습니다.

답변1

rmdir()디렉토리 가 비어 있는 경우에만 시스템 호출을 사용하여 디렉토리를 제거할 수 있습니다 .

rm -r dir디렉토리 트리의 잎부터 시작하여 루트( )까지 이동하면서 디렉토리와 그 안의 모든 파일을 제거합니다 dir.

파일을 제거하려면( rmdir()디렉터리 및 unlink()기타 유형의 파일 또는 *at()변형의 경우) 파일 자체의 권한이 아니라 파일을 제거하는 디렉터리의 권한이 중요합니다( t권한의 비트에 주의하세요. 의 경우 /tmp더 복잡해집니다.)

무엇보다도 실제로는파일, 디렉토리에서 링크를 해제합니다(제거하는 마지막 링크인 경우 결과적으로 파일이 삭제됩니다). 즉, 디렉토리를 수정하므로 다음이 필요합니다.수정해당 디렉토리에 대한 (쓰기) 권한.

제거할 수 없는 이유 는 수정 권한이 없기 때문에 먼저 non-empty-dir연결을 해제할 수 없기 때문입니다 . 홈 디렉토리에 대한 쓰기/수정 권한이 있으므로 홈 디렉토리에서 링크를 해제할 수 있는 권한이 있지만 , 비어 있지 않은 디렉토리만 제거할 수는 없습니다.subdirnon-empty-dirnon-empty-dir

귀하의 경우 @PeterCordes가 주석에 언급한 대로 (디렉토리가 비어 있지 않음) 오류 코드 rmdir()와 함께 시스템 호출이 실패하지만ENOTEMPTY읽다디렉토리에 대한 권한은 비우기 위해 링크를 해제해야 하는 rm파일 및 디렉토리( 포함)를 찾을 수도 없습니다 (쓰기 권한이 없기 때문에 알면 링크를 해제할 수는 없습니다).subdir

다음과 같은 상황에 빠질 수도 있습니다.rm ~할 수 있었다쓰기 전용 디렉터리의 경우처럼 디렉터리에 어떤 파일이 있는지 찾을 수 있는 경우에만 디렉터리를 제거하세요.

$ mkdir dir
$ touch dir/file
$ chmod a=,u=wx dir
$ ls -ld dir
d-wx------ 2 me me 4096 Nov 30 19:43 dir/
$ rm -rf dir
rm: cannot remove 'dir': Permission denied

그래도 해당 파일에는 파일이 하나만 포함되어 있다는 것을 알고 있으므로 제거할 수 있습니다 file.

$ rm dir/file
$ rmdir dir
$

또한 최신 Unices에서는 이름을 바꿀 수 있지만 non-empty-dirLinux나 FreeBSD(Solaris는 아님)와 같은 경우에는~ 아니다해당 디렉토리에 대한 쓰기 권한도 가지고 있더라도 다른 디렉토리로 이동하십시오.관련 코드에 대한 설명) 그렇게 하려면 수정이 필요합니다 non-empty-dir( ..그 안의 항목은 다른 디렉터리를 가리킵니다).

귀하를 제거하는 것은 그 안에 있는 및 항목 empty-dir도 제거하는 것과 관련이 있으므로 수정하면 된다고 주장할 수도 있지만 , 여전히 시스템에서는 그렇게 할 수 있습니다....

답변2

ACL을 통한 잠재적인 변경을 무시하고 내 시스템에 대한 이 동작을 확인할 수 있습니다(ACL 없음).

관찰된 동작은 다음 두 가지 원칙의 논리적 결과입니다.

1) 디렉토리에 대한 권한은 디렉토리를 변경할 수 있는 사람, 즉 디렉토리의 항목을 삭제할 수 있는 사람을 결정합니다. 해당 디렉토리에 있는 항목의 권한은 이에 대한 역할을 하지 않습니다.

2) 파일을 제거하려면 잠재적으로 관련 정보(예: inode, 블록 할당 목록 등)를 제거하고 정리해야 합니다. 그렇기 때문에 포함된 모든 파일을 정리하지 않고는 비어 있지 않은 하위 디렉터리를 제거할 수 없습니다. 액세스할 수 없게 되지만 관련 정보는 정리되지 않습니다.

따라서 을(를) 제거할 수 있습니다. empty-subdir해당 디렉터리에 쓸 수 있는 권한이 있기 때문입니다. 을(를) 제거할 수 없습니다. non-empty-subdir먼저 이 하위 디렉터리에 포함된 파일을 정리할 권한이 없기 때문입니다.

실제로 이에 대한 근거나 사용 사례가 없습니다. 커널에 하위 디렉터리의 재귀적 정리를 구축할 수도 있었지만 원래 Unix는 모든 것을 단순하게 유지했으며 사용자 공간 유틸리티를 사용하여 수행할 수 있다면 재귀적 정리는 너무 복잡했을 것입니다.

다양한 버전에 대한 포괄적인 개요를 제공할 수는 없지만 이는 원래 Unix의 동작이었고 모든 Unix 버전에서 동일할 것으로 기대하며 Unix 버전이 있다면 놀랄 것입니다. 그것은 다르게 행동했습니다.

답변3

나는 당신이 설명하는 것을 재현하려고 노력하고 strace rm -rf ./nonempty. 그 내용은 다음과 같습니다.

unlinkat(4, "subdir", AT_REMOVEDIR)     = -1 EACCES (Permission denied)

그리고 매뉴얼에 따르면 unlinkat(Linux에서는 와 동일하며 unlink(2)강조점은 제가 추가했습니다):

EACCES 경로 이름을 포함하는 디렉토리에 대한 쓰기 액세스는 프로세스의 유효 UID에 대해 허용되지 않습니다. 경로 이름의 디렉터리 중 하나가 검색 권한을 허용하지 않았습니다.. (path_solution(7)도 ​​참조하십시오.)

상위 디렉터리인 은( 는) x(검색) 권한을 nonempty부여하지 않으므로 제거할 수 없다는 설명 user에 따르면 이는 의미가 있습니다 .EACCESsubdir

관련 정보