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

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

다음과 같은 경우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가 주석에서 지적했듯이 (Directory notempty) 오류 코드 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는 아님)와 같은 일부 시스템에서는아니요다음과 같이 해당 디렉토리에 대한 쓰기 액세스 권한이 있더라도 다른 디렉토리로 이동하십시오(제 생각에 Linux에서는 제안한 대로).관련 코드에 대한 설명) 그렇게 하려면 수정이 필요합니다 non-empty-dir( ..그 안의 항목은 다른 디렉토리를 가리킵니다).

귀하를 삭제하면 및 그 안의 항목 empty-dir도 삭제되므로 수정해야 한다고 말할 수도 있지만 시스템에서는 여전히 그렇게 할 수 있습니다....

답변2

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

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

1) 디렉토리의 권한에 따라 디렉토리를 변경할 수 있는 사람, 즉 디렉토리의 항목을 삭제할 수 있는 사람이 결정됩니다. 이 디렉토리의 항목에 대한 권한은 여기에 영향을 미치지 않습니다.

2) 파일을 삭제하려면 관련 정보(예: 인덱스 노드, 블록 할당 목록 등) 삭제 및 정리가 필요할 수 있습니다. 이것이 포함된 모든 파일을 정리하지 않고 비어 있지 않은 하위 디렉터리를 삭제할 수 없는 이유입니다. 그렇지 않으면 포함된 파일에 액세스할 수 없게 되지만 관련 정보는 정리되지 않기 때문입니다.

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부여하지 않으므로 삭제할 수 없다는 설명에 따르면 이는 의미가 있습니다.userEACCESsubdir

관련 정보