디렉토리에서 setuid가 무시되는 이유는 무엇입니까?


19

Linux 시스템에서는 성공적으로 수행 할 수 chmod u+s $some_directory있지만 새 서브 디렉토리 및 파일의 소유권을 포함 디렉토리의 소유자 (및 서브 디렉토리 설정 u+s)로 강제하는 대신 시스템은 setuid 비트를 무시합니다. 서브 디렉토리 및 파일은 작성 프로세스의 UID를 계속 상속하며 서브 디렉토리는 기본적으로 설정되지 않습니다.

디렉토리에서 setuid가 무시되는 이유는 무엇이며 시스템에서이를 인식하도록하려면 어떻게해야합니까?


"nosuid"마운트 옵션이 이것에 영향을 줄 수 있는지 궁금합니다.
Heptite

문제가되는 파일 시스템은 / is / 마운트 된 nosuid다른 하나의 램 디스크 (ramdisk /dev/shm) 가 있지만 마운트는되지 않으며 비트를 정확히 같은 방식으로 nosuid취급하는 것 같습니다 setuid. 6_9
Shining


2
이를 구현할 때 Linux 소스 코드를 쉽게 사용할 수 있으므로이 기능을 자유롭게 구현하십시오. 이미 FreeBSD에 존재하기 때문에 코드를 쉽게 복사 할 수 있습니다. 물론, 그 비트는 다른 사람의 Linux 시스템에서는 여전히 의미가 없습니다.
mikebabcock

답변:


16

setuid와 setgid 비트는 완전히 다른 목적으로 개발되었다는 점을 상기하십시오. 다른 용도는 추가 기능 일뿐입니다.

이 비트는 실행 불가능한 일반 파일에서는 기능하지 않습니다. (보안 문제로 인해 일부 배포판의 쉘 스크립트도 있습니다.) 원래 디렉토리에는 기능이 없었습니다. 분명히 누군가는 디렉토리에서 사용하지 않는 setgid를 가져 와서 그룹 소유권의 일관성을 유지하기 위해 사용하는 것이 멋지겠다고 결정했습니다. 결국, 그룹 소유권을 가지고 놀고 있다면, 둘 이상의 사람이 파일을 사용하고 있기 때문이며, 주어진 디렉토리의 모든 파일이 누가 그것을 만들었든지 상관없이 같은 디렉토리에 속하는 것이 합리적 일 것입니다. 누군가 newgrp를 실행하는 것을 잊어 버린 번거 로움이 제거됩니다.

그렇다면 setuid와 파일 uid에 대해 동일한 기능을 구현하지 않는 이유는 무엇입니까? 음, uid는 gid보다 훨씬 더 기본입니다. 이것을 구현하면 파일은 종종 파일을 만든 사용자에게 속하지 않습니다! 아마도 사용자는 여전히 파일을 수정할 수 있지만 (umask가 제정신이라고 가정) 권한 비트를 변경할 수는 없습니다. 그 유틸리티를보기가 어렵습니다.


일관성을 위해서만 구현하고 싶습니다 ... X3 어쨌든 cronjob과 같은 해결 방법이 부족하여 정기적으로 소유권을 변경하고 파일 소유권을 변경하는 방법이 있습니까?
Blacklight Shining

4
어리석은 일관성에 대한 에머슨을 인용하고 싶습니다. 이 기능이 바람직한 기능이라는 것을 확신시키기 전에 해당 기능이 적합한 사용 사례를 보여 주어야합니다.
Isaac Rabinovitch

1
FreeBSD chmod (2)는 실제로 이것에 대해 약간의 논의를 가지고 있지만, 지정되지 않은 "보안 취약점"으로 인해 일반적으로 사용해서는 안된다는 언급 만합니다. 대부분의 다른 유닉스 가이 기능을 채택하지 않았다고 생각 합니다. 유스 케이스가 있지만 그다지 유용 하지 않기 때문 입니다.
jjlin

1
"그 유틸리티를 볼 수 없었습니다"-> 홈 디렉토리에 설정되었으므로 루트로 실행중인 프로 비전 스크립트는 우연히 무언가를 숨기는 것을 잊을 수 없습니까?
ufotds

1
홈 디렉토리에서 수퍼 유저 스크립트를 실행하는 것은 정말 나쁜 생각입니다.
Isaac Rabinovitch

7

이 질문에 대한 답은 "파일 공짜"보안 문제에 달려 있다고 생각합니다. 이로 인해 대부분의 최신 유닉스 계열 OS는 "파일 공짜"를 허용하지 않습니다. "파일 공짜"는 수퍼 유저가 아닌 사용자가 파일의 소유권을 해당 사용자가 아닌 다른 사람으로 변경 한 경우입니다. 이 기능은 장난에 대한 많은 기회를 제공합니다.

파일 공짜가 허용되지 않으므로 다른 기능으로 동일한 기능을 수행하는 디렉토리의 setuid는 허용되지 않거나 설정되어 있으면 무시됩니다.

동작을 변경하려면 OS 라이브러리 및 유틸리티를 수정해야합니다.


2

그것을 구현하기위한 매우 좋은 사용 사례는 다음과 같습니다.

3 개의 보안 사이트가있는 다중 사이트 서버가 있다고 가정합니다. 서로 다른 사이트 관리자 각각에 대해 하나씩 3 개의 그룹이 작성되었습니다. 모든 사이트의 모든 파일은 아파치 사용자가 소유해야하므로 아파치에서 파일을 읽고 쓸 수 있습니다 (drupal / wordpress 등).

setuid이지만 디렉토리에 대한 setgid 비트처럼 작동하면 권한은 다음과 같습니다.

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

이 방법으로 각 관리자 그룹은 자신의 컨텐츠 만보고 액세스 할 수 있지만 웹 서버 사용자 아파치는 모든 컨텐츠를 제공 할 수 있으며 사용자는 업로드 된 파일의 소유권을 변경하는 것에 대해 걱정할 필요가 없습니다.

또 다른 사용 사례는 Anonymous ftp / http 또는 sftp / ssh 업로드입니다. 업로드 디렉토리의 그룹 및 GID는 루트이며 소유자 및 UID도 마찬가지입니다. 다른 권한은입니다 -wx. 이것은 모든 사람이 업로드 디렉토리에 대한 쓰기 권한을 허용하지만 일단 업로드되면 아무것도 읽을 수 없으며 루트는 새로 작성된 모든 파일을 소유합니다.

따라서 디렉토리의 UID 기능을 GID 비트와 일치시킬 수 있도록하는 두 가지 완벽하고 유효한 사용 사례가 있습니다.

스티븐 머큐리오


1
이것은 묻는 질문을 다루지 않는 것 같습니다.
Kevin Panko

2
@KevinPanko 아니, 내 질문에 대답하지 않습니다. 사이트의 주제에 맞지 않을 수도 있습니다 (“사용 사례는 <nonexistent feature X>무엇입니까?”). 그러나 그것은 내 질문 과 관련 이 있으며, 나는 asker로서 유용하다고 생각합니다.
Blacklight Shining

0

다른 사람들이 언급했듯이 표준 OS-X 파일 시스템에서 디렉토리의 setUID는 무시됩니다.이 문제를 해결하는 쉬운 방법은없는 것 같습니다. mount -o.... 또는 무엇을하지). 종종 매뉴얼 페이지는 문자 그대로 다음과 같은 OS-X 동작을 따르지 않습니다.

4000 (set-user-ID-on-execution bit) [...] set-user-id 비트 세트가있는 디렉토리는 디렉토리 소유자가 아닌 디렉토리 소유자가 해당 디렉토리에서 작성된 모든 파일 및 하위 디렉토리를 소유하게합니다. 만드는 과정의 uid [...]

또한 원래 소유권을 포기하지 않고도 동일한 효과를 얻을 수있는 가능성이 나열되어 있습니다. 리눅스는 비슷한 효과를 위해 '[g /] setfacls'를 사용합니다 (처음에는 권한이 보이지 않기 때문에 언젠가 성 가실 수 있습니다).

'유사한 효과를 얻는 방법'에 관해서는, 전체 매뉴얼 페이지를 읽고 바이올린을 사용하십시오.

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

당신은 통해 확인할 수 있습니다

ls -le

모두 괜찮아 보인다면. 추가 옵션에는 특정 위치에 규칙 삽입, 특정 규칙 제거 또는 교체가 포함됩니다. 여기서 주목할만한 두 가지 옵션은 " file_inheritdirectory_inherit"이며 규칙을 새 디렉토리 / 파일에 첨부 할 수 있습니다.

setUID를 좋아하지는 않지만 setGID는 단순히 'main'그룹을 설정해도 작동하지 않거나 클라이언트에 그룹 쓰기를 허용하지 않는 파일 마스크가있는 파일 서버에서 매우 편리합니다. 그것은 다음에 의해 해결 될 것입니다 :

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup

Stack Exchange에 오신 것을 환영합니다! 이것은 좋은 대답이지만 Linux 배포판이 아닌 OS X (다른 ACL 시스템을 사용함)가 아닌 OS X와 ​​관련되어 있기 때문에 여기서는 그다지 관련성이 없습니다. OS X가 setuid 디렉토리를 존중 하게 만드는 방법에 대한 질문에 확실히 적합 할 것입니다 . 어쩌면 당신은 하나를 게시해야 합니까?
Blacklight Shining

그건 그렇고, OS X 매뉴얼 페이지에서 남은 비트는 chown실제로 매우 중요합니다! "[…] 기본 파일 시스템이이 기능을 지원하는 경우 : chmod (2) 및 mount (8)에 대한 suiddir 옵션을 참조하십시오 ." HFS가를 구현 suiddir하면 실제로 일반적인 OS X 시스템에서이 작업을 수행 할 수 있습니다.
Blacklight Shining

(그리고 OS X ACL은 Linux ACL처럼“실제로는 보이지 않습니다”)
Blacklight Shining

0

글쎄요, 그것은 표준을 존중해야합니다. 나는 sftp-only를 가진 꽤 많은 시나리오에서 acl과 sshd가 수행하는 acl-mask-set 및 그 마스크에 해야하는 재설정으로 많은 문제를 해결할 것이라고 생각할 수 있습니다.

기본적으로 보안은 매우 유용하지만 옵션을 선택하지 않으면 winghtmare를 작성하는 것입니다.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

어느 쪽이든, 리눅스가 지금가는 것처럼, acl을 사용하여 그 문제를 해결하십시오.


-1

http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories 에 따르면 setuid 비트는 UNIX 및 Linux 시스템의 디렉토리에서 무시됩니다. 그러나 FreeBSD에서 기대 한대로 작동하도록 만들 수 있습니다.


도움이 안 됨 — setuid디렉토리가 무시 된 이유 와 Linux에서 디렉토리를 인식 할 수 있는지 물었 습니다.
Blacklight Shining

유닉스에서는 무시 되었기 때문에 리눅스에서는 무시되는 것이 분명해 보인다. 리눅스가 실제 * nix에 맞는 올바른 행동을 만들어 낸다. 문제의 기사를 자유롭게 읽으십시오. 2004 년의 greenend.org.uk/rjk/tech/perms.html 과 같은 답변 , serverfault.com/questions/371541/…
mikebabcock

그렇다면 왜 유닉스에서 무시됩니까?
Isaac Rabinovitch

블랙 라이트 이후 @IsaacRabinovitch는 리눅스에 관한 문제를 분명히했지만, 뺨에는 관련이 없지만 여러 유닉스가 서로 다른 일을하고 아무것도하지 않는 단순한 정의되지 않은 행동이 더 안전한 가정이라고 생각한다.
mikebabcock 2018 년

/ is / 태그가 붙은 질문은 linux그렇다고해서 다른 시스템에서 그렇게하는 이유를 설명하는 대답에“모호한 방식으로 다른 시스템이 그렇게했기 때문에”모호한 것을 선호한다는 의미는 아닙니다. ( linux태그를 간단히 제거해야합니까?)
Blacklight Shining
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.