GID, текущие, основные, дополнительные, эффективные и реальные идентификаторы группы?


22

Следующие ссылки обсуждают эти понятия в разных контекстах. Я прочитал их определения, но я все еще не могу сказать, как они связаны, или некоторые из них точно такие же.

Вот один из примеров источника моей путаницы:

Согласно man id, если я печатаю id, я должен получить то , что они называют эффективные и реальные идентификаторы групп.

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

Тем не менее, Википедия относится к выводу, idчтобы различать первичные и дополнительные идентификаторы. Более того, Википедия проводит различие между первичными и дополнительными и эффективными против реальных групповых идентификаторов. Как эти понятия связаны друг с другом?

Кроме того, правда ли, что основной идентификатор группы = идентификатор группы = идентификатор текущей группы?


Вопрос неясен: ссылки, которые вы предоставляете, дают много информации. Что насчет этого, ты не понимаешь?
Псуси

Ответы:


24

Вы смешиваете два разных различия здесь:

  1. Между реальными и эффективными идентификаторами групп
  2. Между первичными и дополнительными группами пользователей

Первое различие относится к тому, как выполняются процессы . Обычно, когда вы запускаете команду / программу, она запускается с привилегиями вашего пользователя. Он имеет реальный идентификатор группы такие же , как основная группа вашего пользователя. Это может быть изменено процессом для выполнения некоторых задач в качестве члена другой специальной группы. Для этого программы используют setgidфункцию, которая изменяет их эффективный идентификатор группы.

Второе различие относится к пользователям . У каждого пользователя есть его / ее основная группа . Существует только один на пользователя и называется gid в выходных данных idкоманды. Кроме того, каждый пользователь может принадлежать к ряду дополнительных групп - они перечислены в конце idвыходных данных.

[Редактировать] :

Я согласен с тем, что справочная страница idздесь несколько вводит в заблуждение. Вероятно, потому, что это урезанная версия описания, предоставленного информационным документом. Чтобы увидеть это более четко, запустите info coreutils "id invocation"(как предложено в конце idруководства).


Спасибо @rozcietrzewiacz. Это было очень полезно. Могу ли я тогда предположить, что текущий идентификатор группы = основная группа?
Амелио Васкес-Рейна

1
В общем нет. Текущую «реальную» группу можно изменить с помощью newgrpкоманды - см. Второй абзац руководства в первой ссылке!
rozcietrzewiacz

18

Ядро зрения

Концептуально существует три набора групп, членом которых является процесс. Каждый набор является подмножеством следующего.

  1. Единственная группа, которая является группой процесса по умолчанию, к которой будут принадлежать файлы, созданные этим процессом.
  2. Набор групп, которые проверяются, когда группе требуется разрешение на открытие файла.
  3. Набор групп, на которые может опираться процесс с дополнительными привилегиями.

По историческим причинам эти наборы соответственно:

  1. эффективный идентификатор группы (EGID);
  2. эффективный идентификатор группы плюс дополнительные идентификаторы группы ;
  3. все вышеперечисленное плюс реальный идентификатор группы и сохраненный набор-идентификатор группы .

Обычно программа имеет один идентификатор пользователя. Если исполняемый файл имеет установленный бит режима setuid , то у программы есть два идентификатора пользователя: его эффективный идентификатор пользователя - это тот, который имеет значение для прав доступа к файлу, ограничений для каждого пользователя, определения того, выполняется ли процесс от имени пользователя root и т. Д. Процесс может переключаться между действующим и реальным идентификаторами пользователей, если ему не нужны все время дополнительные привилегии или если ему нужно переключаться между двумя пользователями без полномочий root.

Такой же механизм существует для группы. Для групп существует дополнительная функция, которой не было при проектировании системы: процесс может быть членом любого числа групп; это дополнительные идентификаторы групп.

Представление базы данных пользователей

Как только пользователь проходит аутентификацию, процесс входа в систему переключается на этого пользователя непосредственно перед запуском оболочки пользователя (или любой другой программы, запрошенной пользователем). Непосредственно перед переключением на нужного пользователя (и потерей привилегий root) процесс входа в систему переключается на нужные группы.

В ранних версиях Unix процесс мог быть только в одной группе. Эта группа является идентификатором основной группы пользователя, хранящимся в пользовательской базе данных (обычно /etc/passwd). Эта группа становится действительным и эффективным идентификатором группы оболочки или другой программы, запускаемой процессом входа в систему.

В настоящее время процесс может быть в нескольких группах, поэтому пользователи также могут быть в нескольких группах. База данных группы (обычно /etc/group) содержит список пользователей для каждой группы. Эти группы становятся дополнительными идентификаторами групп для программы, запускаемой процессом входа в систему.


Спасибо. У меня есть несколько вопросов, понимающих ваш ответ. unix.stackexchange.com/questions/466742/…
Тим

1

Здесь много других отличных ответов, но если вы все еще в замешательстве, как я, вот другой подход. Обратите внимание, что я только изучаю этот материал, а не учусь , поэтому этот ответ находится в стадии разработки и не должен рассматриваться как надежный ответ, по крайней мере, пока. Рассмотрим этот ответ v0.2.

Группы просты и сложны одновременно.

Ключ к идентификаторам, используемым ниже:

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.

Имена пользователей и групп:

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     
                         ...  

Как процессы получают идентификаторы:

1) Логин аутентифицирует имя пользователя и возвращает LuIDи LgIDот /etc/passwd.

2) Первый процесс устанавливает эффективный = реальный = логин, т.е.

EuID=RuID=LuID 
EgID=RgID=LgID

3) раздвоенные дети наследуют RuID, EuID, RgIDи EgID, (& , возможно , спас и зирр), однако,

  • Если S U битовый идентификатор (ы) устанавливается на файл новой программы для выполнения, а затем установить эффективный из файла:

    EUID = FuID

  • Если s г бит (ы) идентификатор устанавливается на файл новой программы для выполнения, а затем установить эффективный из файла:

    EGID = FgID

Примечание: также применяются параметры монтирования suid и nosuid в базовой файловой системе .

4a) Если для установки использовался s u idEuID , то он EuIDможет быть временно изменен (например, понижен с уровня root), но сначала сохраняется его первоначальное значение, OuIDпоэтому при желании его можно восстановить позже.

4b) Если для установки использовался s g idEgID , то он EgIDможет быть временно изменен (например, понижен с уровня root), но сначала сохраняется его первоначальное значение, 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.)*

Рекомендации: учетные данные человека

Дополнительно: вот утилита для печати вашего файла / 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 }'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.