chown(1) POSIX 사양 설명

chown(1) POSIX 사양 설명

chown이 유틸리티에 대한 POSIX 사양언급한이유부분chown user:group구문(이전 ) 에 관하여 chown user.group(강조):

소유자와 그룹을 지정하는 4.3 BSD 방법은 다음과 같은 이유로 이번 POSIX.1-2008 볼륨에 포함되었습니다.

  • 어떤 경우에는 chgrp 및 chown(사용자 ID만 변경) 유틸리티를 사용하여 원하는 종료 조건을 달성할 수 없습니다.(현재 소유자가 원하는 그룹의 구성원이 아니고 원하는 소유자가 현재 그룹의 구성원이 아닌 경우 소유자와 그룹이 모두 변경되지 않으면 chown() 함수가 실패할 수 있습니다.)

user:group구문이 매우 편리하다고 생각합니다 . 위의 말은 할 수 있는 일이 있고 chown user:group할 수 없는 일이 있다는 뜻입니다.chgrp group; chown user

이제 이 구절은 나에게 의미가 없습니다. 4.3BSD에서는 루트만이 파일 소유자를 변경할 수 있으므로 루트의 작업은 어떤 상황에서도 제한되지 않습니다.

SysV와 일부 다른 시스템에서는 파일 소유자가 파일의 사용자와 그룹을 무엇이든 변경할 수 있도록 허용(또는 허용하는 데 사용)하지만 이러한 시스템에서도 위의 텍스트는 나에게 이해가 되지 않습니다. 좋습니다. 어떤 사람이 을 수행하면 그 사람은 더 이상 파일의 소유자가 아니기 때문에 chown someone-else the-file그 이후에는 작업을 수행할 수 없습니다 . 그러나 첫 번째 작업 (파일 소유자 유지) chgrp something-else the-file을 수행하는 것을 막을 수는 없습니다. 후속 작업은 위의 텍스트가 말하는 것과 정확히 일치하지 않습니다.chgrpchown

나는 무엇인지 이해하지 못한다필요한 소유자는 현재 그룹의 구성원이 아닙니다.문제와 관련이 있습니다.

그렇다면 이를 달성하기 위해서는 어떤 조건이 필요할까요?소유자와 그룹이 모두 변경되지 않으면 chown() 함수가 실패할 수 있습니다., 그리고 어떤 시스템에서?

답변1

이것Microsoft Interix Unix 하위 시스템 (현재는 은퇴)NT 커널은 다른 커널과 약간 다르게 사용자 및 그룹 권한을 처리하기 때문입니다.

사용자 및 그룹 정보는 다음 위치에 저장됩니다.안전한 데이터베이스 액세스. 사용자와 그룹은 모두 동일한 데이터베이스에 저장되지만 그룹과 사용자 이름은 고유해야 합니다. 어떤 그룹도 사용자 이름을 소유할 수 없으며 그 반대도 마찬가지입니다.(이 데이터베이스는 UNIX의 /etc/passwd및 파일을 대체합니다.)/etc/groups사용자 및 그룹은 적절한 Windows 방법을 사용하여 생성됩니다.(사용자 관리자, Active Directory 사용자 및 컴퓨터, 또는 로컬 사용자 및 그룹)또는 Win32 net user명령을 사용하십시오.(사용자 생성 및 삭제를 위한 샘플 쉘 스크립트는 디렉토리에 포함되어 있습니다 /usr/examples/admin.)사용자는 여러 그룹에 속할 수 있습니다.

여기에 있다일부매뉴얼에서 좀 더 구체적으로 발췌한 내용은 다음과 같습니다.

Windows에서는 사용자나 그룹이 개체를 소유할 수 있습니다. 이는 사용자만이 객체를 소유하는 UNIX와 다릅니다.

Windows는 보안 식별자를 사용하여 모든 사용자와 그룹을 내부적으로 식별합니다.(보안 식별 코드). 해싱 알고리즘은 고유한 SID 값을 생성합니다. 두 사용자 또는 그룹은 동일한 SID를 갖지 않습니다.

개체에 대한 액세스 권한이 있는 사용자 및 그룹은 해당 SID로 식별됩니다. Windows가 보호할 수 있는 모든 개체에는 ACE(액세스 제어 항목)라는 개별 항목으로 구성된 임의 액세스 제어 목록(DACL)이 있습니다. ACE에는 사용자 또는 그룹 SID와 단일 사용자 또는 그룹이 개체에 대해 갖는 액세스 권한에 대한 설명이라는 두 가지 중요한 정보가 포함됩니다.

CHGRP

...파일의 그룹 ID 변경 ...chgrp(1)을 호출하는 사용자는 지정된 그룹에 속해야 하고 파일의 소유자이거나 적절한 권한이 있어야 합니다.

마을

... 소유자 및 그룹 피연산자는 모두 선택 사항이지만 하나만 지정해야 합니다. 그룹 피연산자를 지정하는 경우 앞에 콜론(:)이 와야 합니다.

소유자는 숫자로 된 사용자 ID 또는 사용자 이름으로 지정할 수 있습니다. 사용자 이름이 숫자 사용자 ID이기도 하면 피연산자가 사용자 이름으로 사용됩니다. 그룹은 숫자로 된 그룹 ID 또는 그룹 이름일 수 있습니다. 그룹 이름이 숫자 그룹 ID이기도 하면 피연산자가 그룹 이름으로 사용됩니다.

보안상의 이유로 파일 소유권은 적절한 권한이 있는 프로세스에 의해서만 변경될 수 있습니다.

내가 읽은 바와 같이 이는 귀하의 사용자 계정이 Windows 그룹에 속하고 해당 그룹이 소유한 파일에 대한 권한을 수정할 수 있는 충분한 권한이 있는 경우 사실상 chgrp사용자 계정의 파일 액세스 제어 범위를 벗어남을 의미합니다. 이는 chown명시적 매개변수를 사용할 user:group때보다 제어력이 떨어지는 것과 같습니다 . 이 경우에는 신고할 수 없습니다.user: 그리고 :group그렇지 않으면 결코 같은 결과를 얻을 수 없습니다.

이것은 링크입니다Interix가 Windows ACL과 상호 작용하는 방법에 대해 자세히 알아보고 이 지식이 다른 Unix 변형의 Samba 파일 시스템에 적용되는 방식에 중점을 둡니다.

이것은 링크입니다지금까지쓸모없는Solaris 설명서에는 조정 가능한 매개변수가 설명되어 있습니다 rstchown.

시스템 호출의 POSIX 의미가 chown(2)유효한지 여부를 나타냅니다.

분명히 매개 변수가 값으로 설정되면 0...

...POSIX 의미 체계를 끄면 다양한 보안 취약점이 발생할 수 있습니다. 이것도 가능성이 열려요사용자가 파일 소유권을 다른 사용자로 변경하고 파일을 검색할 수 없습니다.반환하는 데 사용자나 시스템 관리자의 개입이 필요하지 않습니다.

이러한 옵션은 Solaris를 활성화하지 않습니다.POSIX 적합성. 옵션이기 때문에 충분히 만들 수 있습니다.일관된:

모든 POSIX.1-2008 호환 구현은 아래 설명된 모든 기능을 지원하지만삭제 또는 수정이 가능한 시스템 관련 또는 파일 시스템 관련 구성 절차 이러한 기능 중 일부 또는 전부. 엄격한 준수가 필요한 경우 이러한 구성을 수행하면 안 됩니다.

다음 기호 상수는 -1이 아닌 값으로 정의되어야 합니다. 상수가 0 값으로 정의된 경우 응용 프로그램은 , 또는 함수나 유틸리티를 사용하여 sysconf()해당 pathconf()시점 fpathconf()또는 getconf문제의 특정 경로 이름에 대해 시스템에 어떤 기능이 있는지 확인해야 합니다.

_POSIX_CHOWN_RESTRICTED

사용은 chown()적절한 권한이 있는 프로세스로 제한되며, 파일의 그룹 ID는 프로세스의 유효 그룹 ID 또는 보조 그룹 ID 중 하나로만 변경할 수 있습니다.

시스템 chown()기능 - 양 당사자가 녹음한 시스템 호출입니다.chown그리고chgrp쉘 유틸리티 - 예지정하지 못했습니다.많은 이유들로 인해. 그 중에는:

EACCES 경로 접두사의 구성 요소에 대한 검색 권한이 거부되었습니다.

ELOOP 경로 매개변수를 구문 분석하는 동안 발견된 기호 링크에 순환이 존재합니다.

EPERM 유효 사용자 ID가 파일 소유자와 일치하지 않거나 호출 프로세스에 적절한 권한이 없으며_POSIX_CHOWN_RESTRICTED그러한 특권의 필요성을 보여주십시오.

그러나 루트가 아닌 사용자에게 권한 수정 권한을 부여하는 행위는 Solaris에서만 발생한 적이 없습니다. 가지다매우 훌륭하다- 다소 오래된 경우 - Unix 파일 권한 적용 범위이 포럼 게시물저자는 그 책에서 다음과 같이 말합니다.

원래 유닉스에서는 파일 소유자가 파일을 버리는 것을 허용했습니다. 파일 소유자는 소유자를 다른 사람으로 변경할 수 있습니다. 루트가 아닌 사용자는 이 작업을 실행 취소할 수 없습니다... BSD[후에]chown루트가 아닌 사용자에게서 제거됨...[이유의 일부]...이는 사용자가 파일 시스템에서 가질 수 있는 디스크 공간의 양을 제한할 수 있는 디스크 할당량을 구현합니다. 장난꾸러기 사용자는 할당량을 몰래 넘기기 위해 큰 파일을 삭제할 수 있습니다.

chown오늘날에는 루트가 아닌 사람이 파일에 액세스 할 수 있는지 여부를 말하기가 어렵습니다 . 많은 Unix 버전에서는 다음을 허용합니다.둘 다행동...

또 다른 좋은 것 - 그리고 최근 것 -메일링 리스트 게시물이것을 인용하고 계속하십시오:

대부분의 운영 체제의 기본 설정은 chown루트 사용자로 제한됩니다. 안전상의 이유로 그대로 유지하기로 합의했습니다. 루트가 아닌 사용자가 파일 소유자를 변경하고 실행 비트가 켜져 있는 경우 SUID및 비트를 지워야 합니다. SGID이것은 일어날 수도 있고 일어나지 않을 수도 있습니다 root.

나는 마지막 단락이 좋은 지적이라고 생각합니다.

기사에는 CAP_CHOWNLinux에서 시설을 제어하는 ​​방법 도 언급되어 있습니다.POSIX_CHOWN_RESTRICTED(이것은 동작 에만 영향을 미칩니다 ). CAP_FOWNER약간 다르게 행동하는 능력 도 있습니다 .

그리고2003년에 지적하셨죠:

적어도 HPUX에서는 파일 소유자를 변경할 수 있습니다.( root예를 들어)권한이 있는 사용자가 아니더라도...

...구성 매개변수에 따라 다릅니다 setprivgroup.

어떤 경우든 루트가 아닌 사용자가 파일 권한을 조작할 수 있다는 것이 가능합니다.이유귀하의 질문을 인용하자면, 사용자는 chown해당 사용자가 소유한 파일을 갖고 있어 다른 사용자가 해당 파일을 소유하게 될 수 있습니다. 파일의 그룹 소유권이 chown사용자 그룹과 일치하지 않으면 사용자는 더 이상 파일을 수정할 수 없습니다.

이 경우chown 그 다음에 chgrp사용자가 더 이상 파일의 권한을 변경할 수 있는 권한을 가지지 않기 때문에 실패합니다 chown user:group.그룹그것은 사용자 자신 중 하나입니다. 성공할 것입니다.

가지다아마도다른 많은 틈새 상황에서도 비슷한 결과가 나올 수 있습니다. 여기에는 디렉토리가 포함될 수 있습니다.어려운그리고/또는설정비트, 파일 시스템 및/또는 구현별 액세스 제어 목록.이 스레드재밌어요. 수많은 순열은 내 자신의 미약한 이해를 훨씬 뛰어넘습니다. 이것이 바로 이 답변이 Wikipedia에서 작성된 이유입니다. 이 글을 읽고 계시다면 개선이 필요하다고 믿으실 것이며, 방법도 알고 계시리라 믿습니다.제발 이렇게 해주세요.

-R또한 다음과 같이 재귀 애플리케이션의 실패를 초래할 수 있는 파일 권한, 트리 탐색 및 심볼릭 링크의 다양한 효과에 대한 광범위한 문서도 있습니다 chown.

~에서POSIX XRAT장 제목제삼그리고네 번째 도메인:

일반적으로 파일 계층 순회 옵션을 지정하는 사용자는 단일 물리적 계층에서 작업하기를 원하므로 계층 외부의 파일을 참조할 수 있는 기호 링크는 무시됩니다. 예를 들어 chownowner 파일은 -R 옵션이 지정된 동일한 명령과 다른 작업입니다. 이 예에서는 명령의 동작이 여기에 설명되어 있으며 chown owner file명령의 동작은 다음과 같습니다.chown -R소유자 파일은 세 번째 및 네 번째 필드에 설명되어 있습니다.

...기본 논리적 걷기에는 보안 문제가 있습니다. 역사적으로 명령은chown -R사용자 파일은 슈퍼유저에게 안전합니다.설정값그리고설정파일의 소유권이 변경되면 비트가 손실됩니다. 순회가 논리적인 경우 사용자가 트리의 파일에 대한 기호 링크를 삽입했을 수 있으므로 소유권을 변경하는 것이 더 이상 안전하지 않습니다. 다시 말하지만, 심볼릭 링크를 통해 간접적으로 탐색하지 않도록 계층 탐색을 수행하는 명령에 옵션을 추가해야 하며 재귀 탐색을 수행하는 기록 스크립트는 즉시 보안 문제가 됩니다. 이는 주로 시스템 관리자의 문제이지만 다양한 사용자 범주에 대해 서로 다른 기본값을 설정하지 않는 것이 가장 좋습니다.

...

4.3 BSD에서는 chgrp트리 순회 중에 기호 링크의 대상이 아닌 그룹이 변경됩니다. 4.4 BSD의 심볼릭 링크에는 소유자, 그룹, 모드 또는 기타 표준 UNIX 시스템 파일 속성이 없습니다.

POSIX에서chgrp올바른 페이지에는 불완전할 수 있는 -R재귀 작업 또는 적어도 무언가를 가리키는 내용이 있습니다.사용된이 되다:

System V와 BSD 버전은 서로 다른 종료 상태 코드를 사용합니다. 일부 구현에서는 종료 상태를 발생한 오류 수의 개수로 사용합니다. 이 접근 방식은 유효한 종료 상태 값의 범위를 오버플로할 수 있으므로 작동하지 않습니다. 표준 개발자는 종료 값으로 0과 >0만 지정하여 이를 마스크하기로 결정했습니다.

답변2

가정 1: 성공적인 규칙은 chown대상 사용자 및 그룹 부분, 즉 해당 형식을 독립적으로 확인합니다 user_condition(target_uid, other_environment_parameters) && group_condition(target_gid, other_environment_parameters).

가정 2: chown(file, -1, -1)성공.

가정 3: 성공을 결정하는 규칙은 chown파일이 현재 어느 그룹에 속해 있는지와는 아무런 관련이 없습니다.

결론: chown(file, uid, gid)작동한다면 작동할 것입니다 chown(file, -1, gid) && chown(file, uid, -1).

나는 이러한 가정을 위반하는 Unix 변종을 본 적이 없으며 상당히 안전한 것으로 보입니다.

이 인용문은 위원회의 누군가가 몇 시간의 토론 끝에 지쳤을 때 한 것 ps또는 비서가 잘못 기록한 것으로 보이며 검토 과정에서 아무도 이를 알아차리지 못했습니다. 결국, POSIX 이론적 근거에도 언급된 성능 이유와 원자성(아, 소유권과 권한을 변경하기 위한 호출이 단 한 번만 있는 경우)을 포함하여 사용자와 그룹에 대한 자동 변경을 허용하는 다른 좋은 이유가 있습니다.


가정 3이 틀릴 수 있는 상황은 프로세스가 파일 소유자를 변경할 수 있는 능력을 얻는 시스템에서 발생하지만, 이는 파일에 대한 쓰기 액세스 권한이 있는 경우에만 가능합니다. 다소 현실적이긴 하지만, 이것이 해당되는 시스템이 있는지는 모르겠습니다. 그런 다음 해당 파일은 chgrp루트나 파일을 소유한 사용자로 실행되지 않는 프로세스의 그룹에 노출될 수 있습니다 chown.


재귀 호출의 경우 몇 가지 극단적인 경우가 있습니다. 단일 패스가 성공하는 동안 전체 패스 chgrp에 이어 전체 패스가 실패할 수 있습니다. chown이는 소유자가 통과할 수 있는 권한이 없는 디렉터리를 포함하고 이러한 모든 상황을 방지하려는 응용 프로그램이 어쨌든 권한을 조작해야 하기 때문에 매우 설득력 있는 주장은 아닙니다. 그럼에도 불구하고 이는 기술적으로 이러한 이론적 근거의 조건을 충족합니다. 실행 중인 프로세스에는 유효한 user alice, 유효한 그룹 staff및 파일 소유자를 임의로 변경할 수 있는 기능이 있는 것으로 가정됩니다(단지 삭제하는 것이 아니라 일부 Unix 변형에는 이러한 기능이 있지만 루트가 아닌 프로세스에는 거의 부여되지 않음).

$ ls -ld dir dir/file
d---rwx---  2 charlie  staff        1024 Apr  1  1970 dir
drw-rw----  2 charlie  staff          42 Apr  1  1970 file
$ chgrp -R students dir
$ chown -R bob dir
chown: dir: permission denied

관련 정보