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) в моей системе не принадлежат никакие файлы - не только в каталогах для испоняемых бинарников или устройств, но и вообще. Так что о их назначении я могу только гадать.
В общем, исчерпывающего описания стандартных групп у меня не получилось. Так что буду признателен за уточнения и дополнения.