GID, 현재, 기본, 보조, 유효 및 실제 그룹 ID?


22

다음 링크는 이러한 개념을 다른 상황에서 설명합니다. 나는 그들의 정의를 읽었지만, 그것들이 어떻게 관련되어 있는지, 또는 그중 일부가 동일한 지 여전히 알 수 없습니다.

다음은 혼란의 원인 중 하나입니다.

에 따르면 man id, 입력하면 효과 적이고 실제 그룹 ID id라고하는 것을 가져와야합니다.

id uid=501(joe) gid=501(joe) groups=501(joe), 100(users)

그러나 Wikipedia기본 ID 와 보조 ID id를 구별 하기위한 출력을 나타냅니다 . 또한, 위키 백과는 구별 보충 하고 효과적인실제 그룹 ID. 이러한 개념은 서로 어떻게 관련이 있습니까?

또한 기본 그룹 ID = 그룹 ID = 현재 그룹 ID 인 것이 사실 입니까?


질문이 불분명합니다. 제공하는 링크가 많은 정보를 제공합니다. 당신은 그것을 얻지 못합니까?
psusi

답변:


24

여기에 두 가지 차이점이 있습니다.

  1. 사이에 실제유효 그룹 ID
  2. 사이 보조 사용자 그룹

첫 번째 차이점은 프로세스가 실행되는 방법을 나타냅니다 . 일반적으로 명령 / 프로그램을 실행할 때 사용자의 권한으로 실행됩니다. 실제 그룹 ID 는 사용자의 기본 그룹과 동일합니다. 다른 특수 그룹의 구성원으로 일부 작업을 수행하기 위해 프로세스에 의해 변경 될 수 있습니다. 이를 위해 프로그램 setgid유효 그룹 ID 를 변경 하는 기능을 사용합니다 .

두 번째 차이점은 사용자를 나타냅니다 . 각 사용자에게는 기본 그룹이 있습니다. 사용자 당 하나만 있으며 명령 출력에서 gid 라고합니다 id. 그 외에도 각 사용자는 여러 보충 그룹에 속할 수 있으며 id출력 끝에 표시됩니다 .

[편집하다] :

id여기 맨 페이지 가 다소 오해의 소지가 있음에 동의합니다 . 정보 문서에서 제공하는 설명이 제거되어 있기 때문일 수 있습니다. 보다 명확하게 보려면 설명서 info coreutils "id invocation"끝에 제안 된대로 실행하십시오 id.


감사합니다 @rozcietrzewiacz. 매우 도움이되었습니다. 그런 다음 현재 그룹 ID = 기본 그룹 이라고 가정 할 수 있습니까 ?
Amelio Vazquez-Reina

1
일반적으로 아닙니다. 현재 "실제"그룹은 newgrp명령을 사용하여 변경할 수 있습니다 -첫 번째 링크에서 설명서의 두 번째 단락을 참조하십시오!
rozcietrzewiacz

18

커널 뷰

개념적으로 프로세스가 속해있는 3 가지 그룹 세트가 있습니다. 각 세트는 다음 세트의 서브 세트입니다.

  1. 프로세스의 기본 그룹 인 단일 그룹으로이 프로세스에서 작성된 파일이 속합니다.
  2. 그룹에 파일을 열 수있는 권한이 필요할 때 확인되는 그룹 집합입니다.
  3. 추가 권한 프로세스로 실행중인 프로세스가 사용할 수있는 그룹 세트.

역사적 이유로 이러한 세트는 각각 다음과 같습니다.

  1. 유효 그룹 ID (EGID);
  2. 유효 그룹 ID 및 보충 그룹 ID ;
  3. 위의 모든 플러스의 실제 그룹 ID저장된 설정 그룹-ID .

일반적으로 프로그램에는 단일 사용자 ID가 있습니다. 실행 파일에 setuid 모드 비트가 설정 되어 있으면 프로그램에는 두 개의 사용자 ID가 있습니다. 유효 사용자 ID는 파일 권한, 사용자 별 제한, 프로세스가 루트로 실행 중인지 여부 등을 결정하는 데 사용됩니다. 프로세스는 항상 추가 권한이 필요하지 않거나 루트가 아닌 두 사용자간에 전환해야하는 경우 유효 사용자 ID와 실제 사용자 ID 사이를 전환 할 수 있습니다.

그룹에 대해 동일한 메커니즘이 존재합니다. 그룹의 경우 시스템을 설계 할 때 존재하지 않은 추가 기능이 있습니다. 프로세스는 여러 그룹의 구성원 일 수 있습니다. 이들은 보충 그룹 ID입니다.

사용자 데이터베이스보기

사용자가 인증되면 사용자의 쉘 ​​(또는 사용자가 요청한 프로그램)을 시작하기 직전에 로그인 프로세스가 해당 사용자로 전환됩니다. 원하는 사용자로 전환하기 직전에 (그리고 루트 권한을 잃기 전에) 로그인 프로세스가 원하는 그룹으로 전환됩니다.

초기 유닉스 버전에서는 프로세스가 단일 그룹에만있을 수 있습니다. 이 그룹은 사용자 데이터베이스 (일반적으로 /etc/passwd)에 저장된 사용자의 기본 그룹 ID 입니다. 이 그룹은 로그인 프로세스에 의해 시작된 쉘 또는 기타 프로그램의 실제 유효 그룹 ID가됩니다.

요즘에는 프로세스가 여러 그룹에 속할 수 있으므로 사용자도 여러 그룹에 속할 수 있습니다. 그룹 데이터베이스 (일반적으로 /etc/group)에는 각 그룹의 사용자 목록이 포함됩니다. 이 그룹은 로그인 프로세스에 의해 시작된 프로그램의 보충 그룹 ID가됩니다.


감사. 답장을 이해하는 데 몇 가지 질문이 있습니다. unix.stackexchange.com/questions/466742/…
Tim

1

여기에 다른 많은 훌륭한 답변이 있지만, 여전히 혼란 스럽다면 다른 접근법이 있습니다. 나는 마스터가 아닌이 물건의 학생 일 뿐이 므로이 답변은 진행중인 작업이며 적어도 아직은 확실한 답변으로 간주되지 않습니다. 이 답변 v0.2를 고려하십시오.

그룹은 동시에 간단하고 복잡합니다.

아래에 사용 된 ID 키 :

KEY  Full name --------  Description---------------------------------------------

 u   User                 uID = User  ID (a unique # associated with each user)
 g   Group                gID = Group ID (a unique # associated with each group)
                            While each /etc/passwd entry has one uID and one gID,
                            additional gIDs can be associated with a users via
                            /etc/group.


 L   Login          IDs - uID and gID produced from the Login process.  
                            ('L' is not exactly standard Linux terminology, but
                            useful for explanations below.)

 F   File           IDs - uID and gID retrieved from a file's ownership.
                            ('F' is not exactly standard Linux terminology, but
                            useful for explanations below.)


 R   Real           IDs - Who actually                      runs a process 
 E   Effective      IDs - Who spoofed via setuid or setgid, runs a process
 O   Original Eff.  IDs - Place to save the original Effective ID when changing 
                          it (e.g. temporarily downgrading it) so can later 
                          restore it.  Also called "Saved ID"; (but 'S' was not 
                          used for here to help avoid confusion with the 'S' in  
                          'SetUserID' & SetGroupID.)
 +   Supplimentary gIDs - Optional, additional groups (none or more) running 
                          this process which can be used to test for permissions.

사용자 및 그룹 ID 이름 :

Category          USER  GROUP  Notes  
----------------- ----  -----  -------------------------------------------  
 From login:      LuID  LgID   From /etc/passwd lookup

 From files:      FuID  FgID   Each file has these. Set by creator process.


 For each running process:

            Real  RuID  RgID   Actual   user starting the program
       Effective  EuID  EgID   Assigned user starting the program*
           Saved  OuID  OgID   Saves original effective ID.
   Supplementary        +gID1  (optional, additional groups)
                        +gID2     
                         ...  

프로세스가 ID를 얻는 방법 :

1) 로그인은 사용자 이름을 인증 LuID하고 LgID에서를 반환합니다 /etc/passwd.

2) 첫 번째 프로세스 는 유효 = 실제 = 로그인을 설정합니다.

EuID=RuID=LuID 
EgID=RgID=LgID

3) 갈래 어린이 상속 RuID, EuID, RgID,와 EgID, (아마도 저장 및 좌약), 그러나,

  • 새 프로그램의 파일에 s u id 비트가 설정되어 있으면 파일에서 유효로 설정하십시오.

    EuID = FuID

  • 실행할 새 프로그램의 파일에 s g id 비트가 설정되어 있으면 파일에서 유효로 설정하십시오.

    EgID = FgID

참고 : 기본 파일 시스템의 suidnosuid 마운트 옵션도 적용됩니다.

4A) 의 경우의 U 자 ID는 사용 된 세트 EuID그리고, EuID일시적으로 변경할 수있다 (예를 들면)의 뿌리에서 다운 그레이드를하지만, 처음 원래의 값으로 저장되어있어 OuID필요한 경우에 복원 할 수 있도록.

4B) 만약 S g의 ID를 사용 하였다 세트 EgID후, EgID일시적으로 변경 될 수있다 (예를 들면)의 뿌리에서 다운 그레이드를하지만, 처음 원래의 값으로 저장되어있어 OgID필요한 경우에 복원 할 수 있도록.


파일을 만들 때 :

File's new id's are set from effective id's: FuID=EuID and FgID=EgID
(Permissions are set from umask.)

읽기 위해 열려면 :

If FuID = EuID  and  user-read bit is set, or  
If FgID = EgID  and group-read bit is set, or  
If FgID = +gID1 and group-read bit is set, or  
If FgID = +gID2 and group-read bit is set, ...  
then allow reading.

쓰기 위해 열려면 :

(Same as above but write bit set to allow writing.)

실행을 위해 열려면 :

(Same as above but execute bit set to allow execution.)

메시지를 보내야 할 때 :

Use RuID and RgID.  (Not EuID or EgID). *(Not sure where I read this.)*

참조 : man 자격 증명

추가 : / etc / group 파일을 예쁘게 인쇄하는 유틸리티는 다음과 같습니다.

cat /etc/group | sort -t: -k3n | awk  -F ':' \
  'BEGIN{printf "\n%-20s %-3s %-8s %s", \
           "Group name","pw", "Group ID ", "User list"}\
   BEGIN{printf "\n%-20s %-3s %-8s %s\n", \
           "----------","--", "---------", "---------"} \
        { printf "%-20s %-3s %8d %s\n", $1, $2, $3, $4 }'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.