Глава из книги Сага о FreeBSD
Алексей Федорчук
2008-11-19
Понятие группы пользователей дополняет понятие пользователя. Каждый из них в обязательном порядке входит как минимум в одну, основную, группу — именно ее идентификатор является непременным атрибутом пользовательского аккаунта. Однако он может быть членом одной или нескольких других, дополнительных групп.
Данные о группах хранятся в файле /etc/group, имеющем простой текстовый формат и открытом для чтения всем (а для изменения — только администратору):
% ls -l /etc/group -rw-r--r-- 1 root wheel 430 Mar 30 21:46 /etc/group
Если рассмотреть его, можно видеть, что, как и в случае c пользователями, большинство групп отнюдь не определение реальных объединений пользователей:
% less /etc/group # $FreeBSD: src/etc/group,v 1.19.2.1 2001/11/24 17:22:24 gshapiro Exp $ # wheel:*:0:root,alv daemon:*:1: kmem:*:2: sys:*:3: tty:*:4: operator:*:5:root,alv ...
Однако для рассмотрения структуры записей групп обратимся опять к реальному пользователю:
alv:*:1001:
Структурно файл /etc/group, подобно файлу /etc/passwd, представляет собой очень простую базу данных, образованную серией записей, разделенных символом : (двоеточие, без пробела) на поля. Первое поле — имя группы, однозначно связанное с ее идентификатором GID (Group IDentificator), занимающем третье поле (аналогично имени пользователя и его UID). Между ними, во втором поле — пароль группы, который обычно не используется, почему поле это занято неким разрешённым символом — конкретно, *.
Четвертое поле записи о группе — список входящих в нее пользователей, для которых она не является основной. Как уже говорилось, каждый из них входит по крайней мере в одну группу — именно ту, GID которой стоит у него в соответствующем поле учетной записи и имя которой по умолчанию совпадает с именем пользователя. В этом случае четвертое поле записи о группе будет пустым, как в последнем приведенном примера. Если же в данную группу входят еще какие-либо пользователи, они должны быть перечислены здесь явным образом. Например, членом группы некоего экспериментального пользователя exp является ранее фигурировавший пользователь alv:
alex:*:1002:alv
Причем допускается использование как их имен (username), так и идентификаторов (UID). По секрету признаюсь, что alv и exp — это одно и то же лицо, подобно фининспектору и Финкельштейну.
Если дополнительных членов группы более одного, их имена даются в строку, разделяясь запятой (без пробела).
Группы предназначены для дополнительного разграничения доступа к файлам — как в плане его расширения, так и ограничения. Первое используется чаше. Типичный пример — доступ к пользовательским файлам. По умолчанию некий user1 часто не только не имеет доступа к файлам user2, но даже не может просмотреть его домашний каталог (/home/user2) или зайти в него. Аналогично и с доступом user2 к данным user1. Так что обмен данными между ними оказывается невозможным.
Отступление: замечу в скобках, что умолчальная политика доступа пользователей к домашним каталогам друг друга во FreeBSD на моей памяти менялась неоднократно. И ныне (в ветке 7) пользователи по умолчанию имеют право их просмотра и чтения. Но где гарантия, что в следующих версиях ситуация опять не изменится?
Однако при необходимости такого обмена (а она возникает, например, при работе над единым проектом) выход есть. Для этого пользователю user1 достаточно сделать пользователя user2 членом своей группы (по умолчанию — user1) и присвоить своим файлам требуемые права доступа для ее членов (например, чтения и исполнения). Правда, для обратной связи user2 должен сделать user1 членом своей группы. Кроме того, по умолчанию в этом случае оба пользователя получают доступ (по крайней мере, для чтения и исполнения) ко всем файлам друг друга.
Поэтому может использоваться и другой способ, требующий вмешательства администратора. Он создает отдельную группу, не ассоциированную ни с одним из упомянутых пользователей, и делает их обоих ее членами. Те же должны каждый самостоятельно установить принадлежность к этой группе тех файлов и каталогов, которые требуются им для совместной работы, сохранив для прочих принадлежность к группе исходной.
Ограничение доступа на уровне группы обычно используется администратором и применяется в отношении не реальных, а виртуальных пользователей, таких, как HTTP-, FTP- и почтовые клиенты, которые тоже должны иметь свои учетные записи. Типичный пример — создание т. н. "теневых" каталогов, доступ к которым закрывается некоей группе пользователей для чтения и исполнения, хотя доступ на чтение и (или) исполнение содержащихся в нем файлов сохраняется. В результате просмотреть файл или запустить программу в таком каталоге можно только при условии знания точного имени требуемого файла.