Мир на трёх кашалотах мается
3. Пользователи

Глава из книги Сага о FreeBSD

Алексей Федорчук

2008-11-19

назад | к началу | вперед

Доступ к атрибутам

Каким образом пользователь может ознакомиться с атрибутами своей учетной записи? Ответ, как обычно, будет таким: разными способами. Правда, для этого ему нужно не только авторизоваться в системе (чему мы как-будто бы уже научились), но и суметь дать несколько команд. Собственно, команды — тема одной из следующих глав, и потому пока я дам несколько примеров на уровне заклинаний (надеюсь, что скоро они перестанут казаться чем-то сверхъестественным).

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

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

Итак, первый резонный вопрос юзера — кто я? Для ответа на него командуем:

% echo $USER

где символ $ после команды echo и пробела и обозначает, что все следующие символы являются переменной, а USER — имя данной конкретной переменной (в некоторых командных оболочках имя переменной должно быть задано в нижнем регистре, но данный способ более универсален). Так вот, на эту команду мы незамедлительно получим ответ:

alv

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

% echo $SHELL

будет ее имя, вместе с путем к исполняемому файлу:

/bin/tcsh

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

% echo $HOME
/home/alv

где /home/alv — и есть домашний каталог пользователя alv (совпадение логина пользователя и имени его домашнего каталога — не обязательно, но, как правило, имеет место быть).

Однако наиболее полную информацию о себе пользователь может получить прямым просмотром базы пользовательских акаунтов. Она размещена в каталоге /etc, где присутствует как бы в четырех ипостасях, то есть соотнесена с четырьмя отдельными файлами — /etc/spwd.db, /etc/pwd.db, /etc/master.passwd, /etc/passwd. Первые два имеют двоичный формат (то есть недоступны для просмотра командами типа less или для изменения в текстовом редакторе), два последние — обычные текстовые файлы.

Содержимое пар файлов /etc/spwd.db — /etc/master.passwd и /etc/pwd.db — /etc/passwd идентично (за исключением формата). Файл /etc/spwd.db — это собственно полная база учетных записей со всеми их атрибутами, откуда последние и извлекаются при необходимости соответствующими программами. Файл /etc/master.passwd — просто ее представление в текстовом виде, он может быть просмотрен и модифицирован различными средствами, в том числе и просто текстовым редактором.

Содержание файла /etc/pwd.db аналогично таковому /etc/spwd.db, однако среди записанных в нем атрибутов пользователя отсутствует его пароль. Ну а /etc/passwd — его текстовое представление, также не содержащее пароля.

Может возникнуть вопрос — почему так много файлов содержат сведения об атрибутах пользователя? С одной стороны, для удобства управления учетными записями. Разумеется, на сей предмет существуют специализированные утилиты, которые вносят изменения непосредственно в бинарные файлы /etc/*db. Однако в ряде случаев проще выполнить непосредственное изменение какого-либо атрибута просто в текстовом редакторе — именно для этого и служат /etc/*passwd. Например, при утрате пароля это может быть чуть ли не единственным способом получить доступ в систему.

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

С другой стороны, наличие двух пар идентификационных файлов способствует повышению безопасности. Если просмотреть атрибуты этих файлов командой типа

$ls -l /etc/*wd*

можно увидеть примерно следующий вывод:

-rw-------  1 root  wheel   1424 Mar 30 19:35 /etc/master.passwd
-rw-r--r--  1 root  wheel   1210 Mar 30 19:35 /etc/passwd
-rw-r--r--  1 root  wheel  40960 Mar 30 19:35 /etc/pwd.db
-rw-------  1 root  wheel  40960 Mar 30 19:35 /etc/spwd.db

Из чего следует, что файлы /etc/spwd.db и /etc/master.passwd доступны даже для просмотра (не говоря уж об изменении) только root-оператору, тогда как два других файла (не содержащие паролей) могут быть просмотрены (хотя и не изменены) не только членами группы, но и кем угодно (символы r в полях group и other).

Пароли хранятся (даже в файле /etc/master.passwd) в односторонне-зашифрованном виде (то есть дешифровать пароль в обратном направлении теоретически невозможно). Однако знание вида зашифрованного пароля может помочь при его подборе (методом грубой физической силы, то есть перебором вариантов, например). И потому выставлять его на всеобщее обозрение было бы неосторожно.

Однако информация об атрибутах пользователя часто требуется программам, запущенным обычным пользователем. И потому полная база пользовательских аккаунтов дублируется своим урезанным вариантом.

Пользователи Linux могут заметить аналогию между "теневыми" паролями (shadow passwords), принятыми в большинстве дистрибутивов этой ОС, и "диссипированным" хранением паролей во FreeBSD. Обе эти системы преследуют одну и ту же цель — повышение безопасности. И, при должной аккуратности в администрировании, достигают её с одинаковым успехом.

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

% less /etc/passwd
# $FreeBSD: src/etc/master.passwd,v 1.40 2005/06/06 20:19:56 brooks Exp $
#
root:*:0:0:Charlie &:/root:/bin/csh
toor:*:0:0:Bourne-again Superuser:/root:
daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5:System &:/:/usr/sbin/nologin
bin:*:3:7:Binaries Commands and Source:/:/usr/sbin/nologin
...

и так далее. Мы видим здесь и администратора системы (root), и разнообразных системных псевдопользователей. Однако для примера рассмотрим именно запись пользователя реального:

alv:*:1001:1001:Alex Fedorchuk:/home/alv:/bin/tcsh

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

  1. имя пользователя (name или username, не вполне точно называемое также login);
  2. пароль (password); в файле /etc/passwd он заменен звездочкой, реальный же пароль (в виде неудобопонятного набора алфавитно-цифровых символов) находится в том же поле файла /etc/master.passwd;
  3. идентификатор пользователя (UID, User IDentificator) — уникальное число, по которому он и опознается при входе в систему (имя пользователя предназначено исключительно для удобства — то есть учитывает человеческий фактор);
  4. идентификатор группы (GID, Group IDentificator) — столь же уникальное число, определяющее принадлежность пользователя к основной группе; дополнительные группы, к которым пользователь может принадлежать, определяются в файле /etc/group (о чем будет сказано ниже);
  5. общая информация (General information) — поле, в котором указывается реальное его имя и, при желании, иная произвольная о нем информация (обычно адрес, служебный и домашний телефоны);
  6. домашний каталог (Home dir) — подкаталог пользователя в каталоге /home, обычно совпадающий с его username;
  7. Shell — обычно полный путь к исполнимому файлу командной оболочки, запускаемой при регистрации пользователя в системе (т.н. login shell); однако в общем случае это может быть почти любая программа (интерпретатор языка программирования, файловый менеджер, даже текстовый процессор); единственное к ней требование — быть в явном виде указанной в файле /etc/shells.

Не все из этих полей обязательны к заполнению: в общем случае таковыми являются только username, UID и GID. Для реального пользователя практически необходимы также указание на пользовательскую оболочку (login shell) — без этого он, авторизовавшись в системе, не сможет выполнить никаких действий, и на домашний каталог — иначе ему некуда будет помещать свои данные. Отсутствие пароля, в принципе, допустимо для реального пользователя (и даже администратора), хотя очень не рекомендуется из соображений безопасности. Разного рода виртуальные пользователи могут не иметь никаких атрибутов, кроме имени и цифровых идентификаторов (UID и GID).

А где же те самые дополнительные атрибуты пользователя, о которых шла речь в конце предыдущего раздела? Увы, чтобы ознакомиться с ними, этому самому пользователю потребуются привилегии администратора. Но так как, скорее всего, он сам себе root, получить их командой, например, su для него труда не составит. После чего он обретёт право просмотреть файл /etc/master.passwd и увидеть там относящуюся к нему информацию в таком примерно виде:

# less /etc/master.passwd
...
alv:[абракадабра]:1001:1001:russian:0:0:Alex Fedorchuk:/home/alv:/bin/tcsh
...

Нечленораздельный набор символов между именем пользователя и его ID будет являть собой тот самый зашифрованный пароль, о котором шла речь. А вот три поля между идентификатором группы и реальным именем — и есть дополнительные атрибуты:

  1. класс (class) — очень полезный атрибут пользователя, имеющийся только в BSD-системах; он позволяет определить (в файле /etc/login.conf) переменные среды, автоматически устанавливаемые для всех принадлежащих к данному классу пользователей при их авторизации; в приведенном примере принадлежность к классу russian приводит к установке русской локали для данного пользователя (локали других пользователей и root'а при этом могут быть совсем иными);
  2. время изменения пароля (Password change time, в приведенном примере не заполнено) — дата, после которой пользователю выдается предупреждение о необходимости, пущей безопасности ради, изменить пароль;
  3. время прекращения пользовательского аккаунта (Account expiration time) — также не определенное в примере поле, где указывается дата, после которой пользователю не позволяется авторизоваться в системе; хотя сам по себе пользовательский аккаунт (включая его данные) сохраняется.

Почему значения двух последних атрибутов укрыты от нескромных взглядов, в том числе и пользователя, к которому они относятся, в общем-то, понятно. Но почему в список сведений "для служебного пользования" попала и его "классовая принадлежность"? Не волнуйтесь, классовая теория марксизма тут ни при чём. Просто черех атрибут class можно определить множество параметров для каждого пользователя, в том числе и имеющие прямое отношение к безопасности.

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

назад | к началу | вперед