В первой части выходных данных указано, что идентификатор пользователя равен 501. В скобках приведено соответствующее этому идентификатору имя пользователя. Как следует из результатов работы команды, пользователь mitchell
входит в две группы: с номером 501 ( mitchell
) и с номером 503 ( csl
). Читатели, возможно, удивлены тем, что группа 501 появляется дважды: в поле gid
и в поле groups
. Объяснение этому факту будет дано позже.
10.1.1. Суперпользователь
Одна учетная запись имеет для системы особое значение. [31] Тот факт, что в системе есть всего один специальный пользователь, послужил причиной появления названия UNIX. Более ранняя операционная система, в которой было несколько специальных пользователей, называлась MULTICS.
Пользователь, чей идентификатор равен 0, обычно носит имя root
(его еще иногда называют суперпользователем). Этот пользователь обладает исключительными правами: он может читать и удалять любой файл, добавлять новых пользователей, отключать сетевые интерфейсы и т.п. Множество специальных операций разрешено выполнять лишь процессам, работающим с привилегиями суперпользователя.
К сожалению, этих специальных операций так много, что очень большое число программ должно принадлежать пользователю root
. Если какая-то из этих программ ведет себя неправильно, система может погрузиться в хаос. Не существует способа воспрепятствовать работе такой программы: она может делать все что угодно . Поэтому программы, принадлежащие пользователю root
, следует писать очень внимательно.
10.2. Идентификаторы пользователей и групп, закрепленные за процессами
До сих пор речь шла о командах, выполняемых конкретными пользователями. Это не совсем точно, поскольку компьютер в действительности никогда не знает, кто из пользователей за ним работает. Если пользователь Ева узнает имя и пароль пользователя Элис, она сможет войти в систему под ее именем, и компьютер позволит Еве выполнять те действия, которые разрешены для Элис. Системе известен лишь идентификатор пользователя, а не то, какой именно пользователь вводит команды. Таким образом, ответственность за безопасность системы распределяется между разработчиками приложений, пользователями и системными администраторами.
С каждым процессом связаны идентификаторы пользователя и группы. Когда пользователь вызывает программу, запускается процесс, идентификаторы которого совпадают с идентификаторами этого пользователя. Когда мы говорим, что пользователь выполняет операцию, то на самом деле имеется в виду, что операцию выполняет процесс с идентификатором соответствующего пользователя. Когда процесс делает системный вызов, ядро проверяет идентификаторы процесса и определяет, имеет ли процесс право доступа к запрашиваемым ресурсам.
Теперь становится понятным смысл поля gid
в выводе команды id
. В нем показан идентификатор группы текущего процесса. Пользователь 501 может входить в несколько групп, но текущему процессу соответствует только один идентификатор группы. В рассматривавшемся примере это 501.
В программах значения идентификаторов пользователей и групп имеют типы uid_t
и gid_t
. Оба типа определены в файле . Несмотря на то что эти идентификаторы являются, по сути, всего лишь целыми числами, избегайте делать какие-либо предположения о том, сколько битов они занимают, и выполнять над ними арифметические операции
Узнать идентификаторы пользователя и группы текущего процесса позволяют функции geteuid()
и getegid()
, объявленные в файле . Они не принимают никаких аргументов и всегда работают, так что проверять ошибки не обязательно. В листинге 10.1 показана программа, которая частично дублирует работу команды id
.
Листинг 10.1. ( simpleid.c ) Отображение идентификаторов пользователя и группы
#include
#include
#include
int main() {
uid_t uid = geteuid();
gid_t gid = getegid();
printf("uid=%d gid=%d\n", (int) uid, (int)gid);
return 0;
}
Если программу запустит тот же пользователь, который ранее запустил команду id
, результат будет таким:
% ./simpleid
uid=501 gid=501
10.3. Права доступа к файлам
Хороший способ разобраться в назначении идентификаторов пользователей и групп — изучить права доступа к файловой системе. В частности, нужно узнать, как система устанавливает права доступа к файлам и как ядро определяет, кому разрешено обращаться к запрашиваемым файлам.
Читать дальше