О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

28.07.2008

FreeBSD : стандартные группы

2004 г

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

Для начала - что такое стандартные группы во FreeBSD? Это - те, которые не связаны с каким-либо реальным пользователем. Ведь в этой системе, как известно, каждый вновь создаваемый пользователь автоматически причисляется к своей собственной группе - одноименной его пользовательскому имени (разумеется, такое положение можно легко изменить, но по умолчанию происходит именно так). Ознакомиться со списком стандартных групп очень просто - просмотрев файл /etc/group в любом пейджере или редакторе, например, так:

$ less /etc/group

Вывод ее будет примерно следующим (на примере версии 5.2.1, от версии к версии он может меняться):

wheel:*:0:root
daemon:*:1:
kmem:*:2:
sys:*:3:
tty:*:4:
operator:*:5:root
mail:*:6:
bin:*:7:
news:*:8:
man:*:9:
games:*:13:
staff:*:20:
sshd:*:22:
smmsp:*:25:
mailnull:*:26:
guest:*:31:
bind:*:53:
uucp:*:66:
dialer:*:68:
network:*:69:
www:*:80:
nogroup:*:65533:
nobody:*:65534:

Можно видеть, что /etc/group - очень простая база данных о четырех полях, в качестве разделителей которых выступает символ двоеточия - :. Первое поле - имя группы, второе, неиспользуемое во FreeBSD (и, насколько я знаю, во всех остальных POSIX-системах также) - групповой пароль, третье - уникальный идентификатор (GUID), четвертое - список членов каждой группы.

Последнее поле в большинстве записей пусто. Это не значит, что соответствующие группы не включают в себя никаких членов. Нет, минимум одного пользователя, пусть даже и виртуального, включает каждая группа - имя его идентично имени группы. В чем легко убедиться просмотром файла /etc/passwd. Исключение - группа wheel, пользователя с таким именем в базе учетных записей мы не обнаружим. Но зато в ней явным образом изначально прописан один член - тот самый легендарный суперпользователь, именуемый root'ом, права которого столь часто требуются обычному юзеру для выполнения всякого рода административных действий.

Из этого можно догадаться о назначении группы wheel: во FreeBSD возможность получения прав администратора командой su по умолчанию имеют только те из обычных юзеров, которые являются ее членами. На самом деле это не какая-то исключительная особенность именно Free - то же самое можно видеть и в некоторых дистрибутивах Linux (например, в Gentoo). А вообще говоря, особый статус членов группы wheel зависит не от ОС или дистрибутива, а устанавливается в файле /etc/login.access. Где и может быть отменен при желании.

Впрочем, необходимости в этом я не вижу. Гораздо проще включить пользователя, для которого могут потребоваться административные полномочия, в группу wheel, оставив за ее пределами всех остальных. Что дает некоторую дополнительную гарантию от фатальных ошибок. Так, в моей домашней системе, единственным физическим пользователем которой являюсь я сам, всегда существует две учетные записи реальных пользователей. Одна - для себя, любимого, под которой я выполняю всякую работу (например, сочиняю эти заметки). Вторая подразумевает опять же меня, но предназначена для всякого рода нездоровых экспериментов. Так вот - к группе wheel приписан только первый аккаунт, так что в роли второго пользователя я даже случайно не могу нанести серьезного вреда:-).

Приписать пользователя к какой-либо дополнительной группе можно при создании его учетной записи, например, командой типа adduser, в диалоге которой предусмотрен соответствующий вопрос. Но это можно сделать и позднее, и тогда самым удобным инструментом будет команда pw:

$ pw usermod username -G wheel

Основная группа пользователя при этом затронута не будет.

К группе wheel приписано большинство исполнимых файлов базовой системы, расположенных в каталогах /{bin,sbin} и /usr/{bin,sbin}. В нее же, за редким исключением, попадают и исполнимые файлы программ, устанавливаемых из портов или пакетов, которые записываются в каталог /usr/local/bin. Все файлы группы wheel имеют маску доступа -r-xr-xr-x, то есть теоретически их исполнение разрешено любому пользователю (что, конечно, не значит, будто обычный пользователь, не получив прав root'а, может выполнить дисковую разметку, будь он хоть трижды членом группы wheel: для таких действий нужны еще и права доступа к соответствующим устройствам).

Некоторые файлы из каталогов /{bin,sbin} и /usr/{bin,sbin} (напомню, что владельцем всех их является пользователь root) имеют, однако, иную групповую принадлежность. Причем характерно, что для них устанавливается маска доступа -r-xr-x---, запрещающая исполнение не-членами группы. А часто они помечены и т.н. битом суидности (-r-sr-x---) с теми же ограничениями на запуск. Возникает вопрос, для чего предназначены прочие стандартные группы, и как атрибуты принадлежащих им файлов могут отразиться на пользовательских действиях?

Для определения назначения стандартных групп посмотрим, а какие же именно из испоняемых файлов к ним приписаны. Начнем группы operator, которая, как и группа wheel, изначально имеет одного приписанного к ней члена - все того же вездесущего root'а. Для чего выполним простой поиск в соответствующих каталогах:

$ find /{bin,sbin,usr/{bin,sbin}} -group operator

Результат получится весьма скромным: к искомой группе принадлежит всего два файла,

/sbin/mksnap_ffs
/sbin/shutdown

оба с атрибутами доступа -r-sr-x---. Из которых следует, принадлежность к группе operator дает возможность без административных прав выключить, перезагрузить или реинциализировать систему (командой /sbin/shutdown), а также сделать слепок (snapshot) текущего состояния какой-либо из наличных файловых систем (командой mksnap_ffs). Нужно ли оно нам - на этот вопрос каждый должен ответить для себя. Мне принадлежность к группе operator представляется ненужной.

Иное дело - группы dialer и network: интуитивно понятно, что первая имеет какое-то отношение к установке модемного соединения, а вторая - к работе с сетью. Проверяем тем же методом:

$ find /{bin,sbin,usr/{bin,sbin}} -group dialer

дает нам на выводе

/usr/sbin/pppd

а

find /{bin,sbin,usr/{bin,sbin}} -group network

обнаруживает

/usr/sbin/sliplogin
/usr/sbin/ppp

А поскольку права доступа у них установлены как -r-sr-x---, становится ясным, что без членства в соответствующей группе для пользователя невозможно модемное соединение ни посредством пользовательской программы ppp, ни с помощью демона pppd. Не удастся соединиться и с помощью всякого рода front-end'ных звонилок, типа kppp из комплекта KDE.

Так что лучше нашего любимого пользователя причислить к той или иной, в зависимости от используемой программы, группе (а то и к обеим сразу). Однако если сделать это, как ранее, командой вида

$ pw usermod username -G network

то тем самым будет уничтожена принадлежность пользователя к группе wheel, так что устанавливаем список всех желательных групп в один заход:

$ pw usermod username -G wheel,dialer,network

Аналогичным образом разбираемся и с остальными группами из списка /etc/group. С помощью все той же команды find выясняется, что группе daemon принадлежит несколько файлов, имеющих отношение к печати:

/usr/bin/lpq
/usr/bin/lpr
/usr/bin/lprm
/usr/sbin/lpc

Однако все они имеют атрибуты доступа вида -r-sr-sr-x, то есть никаких действий по переопределению групп как-будто бы не требуется.

Относительно прочих групп из списка /etc/group затрудняюсь сказать что-нибудь определенное. Некоторые из них характеризуют принадлежность файлов устройств. Например, к группе tty относятся активизированные терминалы, как виртуальные консоли (устройства вида /dev/ttyv*, на которых авторизован какой-либо пользователь, так и псевдотерминалы (устройства вида /dev/ttyp*, соответствующие открытым терминальным окнам в Иксах (неактивизированные терминалы принадлежат к группе wheel).

К некоторым группам (например, staff) в моей системе не принадлежат никакие файлы - не только в каталогах для испоняемых бинарников или устройств, но и вообще. Так что о их назначении я могу только гадать.

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