~에서https://unix.stackexchange.com/a/18290/674
커널 보기
개념적으로 프로세스는 세 그룹에 속합니다. 각 그룹은 다음 그룹의 하위 집합입니다.
- 프로세스에서 생성된 파일이 속할 프로세스의 기본 그룹 역할을 하는 단일 그룹입니다.
- 확인된 그룹의 컬렉션그룹이 파일을 열기 위해 권한이 필요한 경우.
- 그룹 모음추가 권한으로 실행되는 프로세스가 악용될 수 있습니다.
역사적인 이유로 이러한 세트는 다음과 같습니다.
- 이것유효 그룹 ID (좋다);
- 유효 그룹 ID 플러스보조 그룹 ID;
- 위의 모든 플러스실제 그룹 ID 그리고저장된 컬렉션 그룹 ID.
질문:
포인트 3에서 "프로세스가 활용할 수 있는 추가 권한으로 실행되는 프로세스"는 어떻습니까?
이 상황은 포인트 2의 "그룹에 파일 열기 권한이 필요한 경우" 상황과 다른가요?
일반적으로 "보조 그룹 ID"와 2번 항목에 기본 그룹 ID가 각각 포함되어 있습니까?
"일반적으로"라는 말은 내가 알아차린 출력에
id
다음과 같은 기본 및 보조 그룹이 포함되어 있음을 의미합니다groups=
. https://unix.stackexchange.com/a/18203/674"각 사용자는 여러 보조 그룹에 속할 수 있습니다. 이 그룹은id
출력 끝에 나열됩니다. 따라서 기본 그룹도 보조 그룹인지 알고 싶습니다.
감사해요.
답변1
특히 Linux에서 요즘 "프로세스가 활용할 수 있는 추가 권한으로 실행되는 프로세스"는 다음과 같은 프로세스입니다.
CAP_SETGID
"사용자 네임스페이스에 기능이 있습니다.".이 세 가지 항목에 대한 소개에는 "각 세트는 다음 세트의 하위 집합"이라고 명시되어 있습니다. 따라서 포인트 3에 설명된 세트는 포인트 2에 설명된 세트와 개념적으로 다릅니다.
id
인쇄효과적인기본 그룹이 아닌 그룹을 사용하여 유효 그룹을 변경할 수 있습니다newgrp
. 기본 그룹은 기본 실제/유효 그룹입니다. 리눅스에서는,getgroups
'맨페이지"반환된 목록에 호출 프로세스의 유효한 그룹 ID가 포함되어 있는지 여부가 지정되지 않았습니다"라고 언급되어 있으므로 보조 그룹에 반드시 기본 그룹이 포함되는 것은 아닙니다.
여전히 Linux를 구체적으로 고려하고 있다면 읽어볼 가치가 있습니다.credentials
맨페이지.
답변2
다양한 개념이 있으므로 실제 사례를 통해 배우는 것이 더 쉽습니다.
사용자 공간 NFS 서버와 같은 프로그램은 네트워크를 통해 연결된 특정 사용자를 나타냅니다. 예를 들어 특정 사용자를 대신하여 파일을 열면 유효 사용자 및 그룹 ID가 일시적으로 변경됩니다. "세이브 세트" 또는 "실제" UID 및 GID에 여전히 권한 있는 UID 및 GID가 있기 때문에 다시 전환할 수 있습니다.
나는 최근에 배웠다다음은 fusermount
이를 수행하는 프로그램의 또 다른 예입니다. 파일 시스템을 마운트하려면 set-uid root여야 하지만 구성 파일을 읽을 때, 마운트 지점으로 전달된 디렉터리에 도달할 때 등 원래 사용자로 권한 확인을 수행할 것으로 예상됩니다. 최소한 UID를 이렇게 변경해야 합니다. 이 프로그램도 set-gid인 경우 GID도 변경해야 합니다. fusermount
set-gid로 설치할 필요는 없지만 코드는 어쨌든 유효 GID를 변경합니다. 더 이상 코드가 필요하지 않습니다. 적어도 문제가 발생하지 않기를 바랍니다. :-).
이 예 man
를 참조 하면 페이지에 다음과 같이 나와 있습니다.setfsgid()
setfsuid() 및 setfsgid()에 대한 명시적 호출은 일반적으로 실제 유효 사용자 및 그룹 ID에 대한 해당 변경 없이 파일 액세스에 사용되는 사용자 및 그룹 ID를 변경해야 하는 Linux NFS 서버와 같은 프로그램에서만 사용됩니다.
[...]
프로세스가 원치 않는 신호를 수신하지 않고 파일 권한 확인 목적으로 사용자 ID를 변경할 수 있도록 파일 시스템 사용자 ID 속성이 추가되었습니다. Linux 2.0부터 신호 권한 처리가 달라져(kill(2) 참조) 프로세스 변경이 원치 않는 프로세스의 신호에 취약하지 않고 유효한 사용자 ID를 변경할 수 있습니다. 따라서 setfsuid()는 이제 불필요하며 새 응용 프로그램에서는 피해야 합니다(setfsgid(2)도 마찬가지입니다).
즉, 이러한 프로그램의 현재 버전은 setresuid() 및 setresgid()를 사용하여 유효 UID 및 GID를 일시적으로 변경합니다.