Администрирование групп и пользователей во FreeBSD


Что такое группа?
Группа - это группа (из юзеров). :-)
В Unix все юзеры объединяются в группы. Причем, каждый юзер входит по крайней мере в одну группу, но может быть "членом" нескольких различных групп.
Как и индивидуальные юзеры, каждая группа имеет свое имя (group name) и числовой номер (groupID). Естественно, они однозначно соответствуют друг другу. Также, как и для индивидуальных юзеров, groupID используется внутри системы, а имя (group name) при вводе и выводе сообщений для пользователей (хотя, в большинстве команд, можно указывать вместо имени и groupID).

В основном, группы (юзеров) используются при определении прав доступа к различным файлам и директориям. Не вдаваясь в подробности, можно сказать, что для каждого файла (директории) в Unix'е существует его владелец (это один из юзеров) и группа "особо допущенных" к этому файлу (директории). При этом владелец файла может задать права доступа к нему (чтение, запись и т.п.) разные для себя, группы "допущенных" и для всех остальных (не входящих в эту группу).

Естественно, сам состав групп (список индивидуальных юзеров, входящих в группу) хранится в соответствующей базе данных (пусть, даже и очень примитивной), а к файлам "привязывается" только номер группы (groupID).

Где хранится информация о группах?
Здесь есть маленькая тонкость. На самом деле надо рассмотреть два вопроса:

Где хранится имя и номер группы?
Как определяется список "членов" группы?
Где хранится имя и номер группы?
В файле /etc/group. Это просто текстовый файл, в котором каждая строчка описывает одну группу. Отдельные поля разделяются двоеточием. Назначение полей:

имя группы (group name)
пароль группы (group passwd)
номер группы (group ID)
список (через запятую) юзеров, входящих в группу (group members).
Поле "пароль группы" пока никакими программами не используется (по крайней мере в FreeBSD) и там обычно ставится знак "*".

Таким образом, файл /etc/group определяет - какие группы существуют в данной системе и устанавливает соответствие между именем и номером группы.

А, что касается "членства" юзеров в группе, этот вопрос немного сложнее.

Как определяется список "членов" группы?
Каждый юзер должен входить, по крайней мере, в одну группу. Эта группа (точнее ее groupID) прописывается в учетной карточке юзера (user account), в поле groupID (см. Какие данные хранятся в учетной карточке).

А, чтобы тот же юзер стал "членом" еще какой-нибудь группы, его можно записать (его login name) непосредственно в файл /etc/group, в поле "group members" (см. выше), соответствующей группы.
Таким образом, "членами" какой-либо группы являются

юзеры, которые перечисленные в файле /etc/group в "списке юзеров" этой группы
и юзеры, в учетной карточке которых, стоит groupID этой группы.

Сколько может быть групп, юзеров в группе, групп у юзера?
Ответ на этот вопрос может быть разным для различных "ветвей" и версий Unix'а.

Поэтому, то, что здесь написано (далее) справедливо только для FreeBSD текущих версий (2.*.*).

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

Членов группы, которые перечисляются в самом файле /etc/group, должно быть не больше 200, но при этом вся строчка, описывающая группу, не должна быть длиннее 1024 символа.

Однако, это ограничение не распространяется на тех юзеров, "членство" которых задается полем "group" в их личных учетных карточках.

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


Как создать или удалить группу?
Это достаточно просто сделать "вручную". Файл /etc/group, хранящий информацию о группах имеет простой формат и его можно менять любым текстовым редактором.

Просто добавьте строчку, создав ее "по образу и подобию" тех, которые там уже есть. Только подберите groupID такой, который не используется другими группами.

Для удаления группы, просто удалите соответствующую строчку.

Проблемы могут возникнуть только, если у вас слишком много разных групп и вам будет трудно ориентироваться в тексте. Тогда вам, возможно, помогут специальные программы.

Программы addgroup и rmgroup.
Программа pw.
Важное замечание о безопасности.
Программы addgroup и rmgroup.
Назначение этих программ понятно из названия.

addgroup добавляет группу в список групп. Достоинство этого способа (в отличии от добавления группы "вручную") заключается только в том, что эта программа может сама подобрать для вновь создаваемой группы groupID, который пока не используется другими группами. Ну и, естественно, не сделает никаких ошибок в /etc/group. Хотя формат /etc/group настолько простой, что там трудно ошибиться :-)

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

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

Естественно, более подробно об этих программах можно почитать в соответствующих man'уалах
man addgroup
man rmgroup

Программа pw.
Программа pw - универсальная утилита для администрирования (создания, удаления, изменения, просмотра) и юзеров и групп.

Для "ведения" групп ее нужно вызывать с параметрами
pw group add группа- добавить группу
pw group del группа - удалить группу
pw group mod группа - "модифицировать" группу
(параметр группа может быть как именем группы, так и номером - groupID).

Последняя команда может использоваться для дополнения списка членов группы
pw group mod группа -m юзер1,юзер2,...
или полной замены этого списка (то есть, "старые" члены группы удаляются, а новые вписываются).
pw group mod группа -M юзер1,юзер2,...

Подробнее об этой команде (утилите) можно почитать в соответствующем man'уале (man pw). Ну, а чтобы не лазить в man каждый раз, когда захотите воспользоваться этой командой, можно вызвать ее с параметром help, например
pw group mod help она выдаст вам список допустимых для данной операции ключей, с кратким пояснением.

О "полезности" этой программы могу сказать то же самое, что и о предыдущих. В обычных случаях все изменения в /etc/groups можно сделать и "вручную". Пользоваться этой программой имеет смысл только, если у вас очень много групп или вы уже привыкли ее использовать для администрирования юзеров.

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

Важное замечание о безопасности.
Файл /etc/group "по умолчанию" может читаться всеми юзерами, а изменять его может только root (администратор системы). Не надо менять эти условия.
Поскольку группы (юзеров) определяют дополнительные права доступа к файлам и директориям других юзеров (подробнее об этом смотри в ****), у некторых из них (в смысле - юзеров) могут возникнуть желания (и реальная необходимость) образовывать новые группы, в которые входили бы только "близкие друзья" какого-либо юзера, но не входили все остальные. Естественно, при обычных условиях, "рядовой" юзер не сможет создать новую группу для себя и своих друзей (хотя ничего опасного для безопасности системы в этом нет). Для этого ему придется обращаться к root'у.

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

Как поменять принадлежность юзера к группе (группам)?
Это зависит от того, о какой группе идет речь.

Если вы хотите поменять ему основную группу (первичную), то надо исправить соответствующее поле (group ID) в его "учетной карточке" (user account). Как это сделать подробно описано в Как поменять данные в учетной карточке.

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

Если же вы хотите добавить юзера еще в какую-нибудь группу или, наоборот, исключить его из "членов группы" (не первичной для этого юзера), то исправления надо делать в файле /etc/group в поле "group members" соответствующей группы.

Как и в случае создания группы это можно сделать либо "вручную",просто отредактировав файл /etc/group вашим любимым редактором, либо воспользоваться специальными утилитами, теми же, что и для создания групп.

addgroup
Комманда addgroup может использоваться не только для создания новой группы, но и для добавления юзера в существующую группу. Например, команда
addgroup games vasia
добавит юзера vasia в группу games.

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

pw groupmod
Также, вам может помочь "универсальная утилита" pw. Только, в отличии от предыдущей команды, для указания юзера (или сразу нескольких юзеров) надо использовать специальный ключ

pw groupmod games -m vasia
(добавить юзера vasia в группу games).

Надо заметить, что описанные команды хорошо добавляют юзеров в группы, но не приспособлены для удаления определенного юзера из определенной группы. Правда, у команды pw groupmod есть ключ -M, который, в отличии от ключа -m означает - не "дописать" указанных юзеров в список членов группы, а полностью заменить список членов на тех юзеров, которых вы и укажете (через запятую) после ключа -M. Однако, понятно, что удалять одного конкретного юзера из длинного "списка членов" таким способом - не очень удачное решение.

Короче, для удаления юзера из списка членов какой-либо группы, надо пользоваться обычным текстовым редактором

Обновлено: 12.03.2015