- PVSM.RU - https://www.pvsm.ru -
В материале, посвящённом причинам существования команды newgrp
, мы узнали о том, что группам в Unix можно назначать пароли, о том, что эта команда позволяет пользователю менять свою (основную) группу. Мы выяснили, что эта команда появилась в Unix V6, что гораздо раньше, чем я ожидал. Меня тогда заинтересовал вопрос о том, как именно работала команда newgrp
в Unix V7. Исходный код V7 (а так же — справку и другие материалы) можно найти на tuhs.org [1]. Поэтому ничто не мешает нам почитать код реализации этой команды, находящийся в файле newgrp.c [2].
[3]
(Можно посмотреть и исходный код, имеющий отношение к V6, но он гораздо сложнее, поэтому я буду рассматривать код V7. Помимо того, что V7 обычно считают системой, с которой началась современная Unix, всё, что было сделано до V7, выглядит иначе, и, как минимум, кажется немного странным.)
Я полагал, что newgrp
работает с группами, защищёнными паролями, примерно так: кто угодно может выполнить команду наподобие newgrp GROUP
, и если ему известен пароль, он будет помещён в группу без необходимости указания его в качестве (потенциального) члена группы в /etc/group
. Возможно, именно так работает современная версия newgrp
, доступная в вашем дистрибутиве. Но в V7 эта команда работала иначе. Начнём с извлечения из справки (newgrp.1 [4]):
Пароль требуется в том случае, если у группы есть пароль, а у пользователя — нет.
Когда большинство пользователей входит в систему, они являются членами группы other. Команда newgrp известна командной оболочке, которая выполняет её напрямую, без форка.
Во-первых, если только вы не являетесь членом специальной группы other
, вы должны быть записаны в /etc/group
независимо от того, назначен ли группе пароль или нет. Затем, как сказано в справке, пароль группы требуется лишь в том случае, если у вашей учётной записи пароля нет. Если же у учётной записи есть пароль, то пароль группы игнорируется. Другими словами, можно не использовать пароль группы для того чтобы иметь возможность предоставить кому угодно, знающему такой пароль, потенциальную возможность доступа к группе. Пароль группы используется только для защиты группы от входа в неё пользователей с аккаунтами без паролей (если такие пользователи в системе присутствуют и если они внесены в дополнительную группу).
При работе с группами, которым назначен пароль, обычная Linux-версия newgrp
ведёт себя с такими группами, членом которых вы являетесь, так же, как и V7-версия команды. Но она ещё и позволяет входить в любые группы, для которых задан пароль, в том случае, если этот пароль вам известен (так сказано в справке [5], я это не проверял). Во FreeBSD, к которой у меня есть доступ, пользоваться паролями групп не рекомендуется [6], в справке говорится, что newgrp
обычно устанавливается без бита setuid
. Ещё там сказано, что пароль запрашивается только тогда, когда пользователь не входит в число членов группы.
(Я полагаю, что это значит, что в стандартной установке FreeBSD пользователь не может использовать newgrp
для перехода в группу, в которую он был добавлен через /etc/group
.)
Возможно, вас заинтересовало последнее предложение из процитированной мной справки по V7-версии newgrp
. Причина наличия этой особенности заключается в том, чтобы исключить существование дополнительных процессов командной оболочки, которые, вероятно, пользователю не нужны (это привело бы к использованию дополнительных системных ресурсов на маломощных машинах, на которых работала V7). С концептуальной точки зрения, если выполняют команду newgrp
, то обычно стремятся к тому, чтобы переключить текущую сессию командной оболочки на новую группу. Если оболочка просто выполнит newgrp
как обычную команду, то будет осуществлено переключение групп для её собственного процесса, а затем будет выполнена программа /bin/sh
, дающая пользователю новую оболочку в новой группе. Это было бы похоже на то, как если бы пользователь выполнил бы команду sh
в login-оболочке. Если при таком подходе выполнить несколько команд newgrp
, то всё закончится тем, что у пользователя будет целая куча оболочек.
А командная оболочка V7 распознаёт команду newgrp
(а так же — команду login
) и не создаёт форк для её выполнения. Вместо этого она запускает newgrp
, пользуясь системным вызовом exec
, и заменяет login-оболочку на newgrp
(которая затем идеально заменяет её другой оболочкой, и V7-версия newgrp
, на самом деле, всегда стремится к тому, чтобы открывать таким образом новую командную оболочку).
(Тут всё самое интересное кроется в комбинации msg.c [7] и xec.c [8]; взгляните на обработку SYSLOGIN
).
Исследуете ли вы старые дистрибутивы Unix для того чтобы лучше понять современные системы?
Автор: ru_vds
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/unix-2/361568
Ссылки в тексте:
[1] tuhs.org: https://www.tuhs.org/
[2] newgrp.c: https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/newgrp.c
[3] Image: https://habr.com/ru/company/ruvds/blog/541508/
[4] newgrp.1: https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/man/man1/newgrp.1
[5] справке: https://man7.org/linux/man-pages/man1/newgrp.1.html
[6] не рекомендуется: https://www.freebsd.org/cgi/man.cgi?query=newgrp&apropos=0&sektion=1&manpath=FreeBSD+12.1-RELEASE&arch=default&format=html
[7] msg.c: https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/msg.c
[8] xec.c: https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/xec.c
[9] Источник: https://habr.com/ru/post/541508/?utm_source=habrahabr&utm_medium=rss&utm_campaign=541508
Нажмите здесь для печати.