/etc/passwd
/etc/passwd (от англ. password — пароль) — файл, содержащий в текстовом формате список пользовательских учётных записей (аккаунтов).
Является первым и основным источником информации о правах пользователя операционной системы. Существует в большинстве версий и вариантов UNIX-систем. Обязан присутствовать в POSIX-совместимой операционной системе.
Принципы
[править | править код]login : password : UID : GID : GECOS : home : shell
Каждая строка файла описывает одного пользователя и содержит семь полей, разделённых двоеточиями:
- регистрационное имя или логин;
- хеш пароля (см. ниже);
- идентификатор пользователя;
- идентификатор группы по умолчанию;
- информационное поле GECOS (см. ниже);
- начальный (он же домашний) каталог;
- регистрационная оболочка, или shell.
Основным назначением /etc/passwd является сопоставление логина и идентификатора пользователя (UID). Изначально поле пароля содержало хеш пароля и использовалось для аутентификации. Однако, в связи с ростом вычислительных мощностей процессоров появилась серьёзная угроза применения простого перебора для взлома пароля. Поэтому все пароли были перенесены в специальные файлы, такие как /etc/shadow в GNU/Linux или /etc/master.passwd во FreeBSD. Эти файлы недоступны для чтения обычным пользователям. Такой подход называется механизмом скрытых паролей (см. ниже).
root:lZTB0KTrSKy8M:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
<…>
john:H5ned8EV1vank:101:101::/home/john:/usr/bin/csh
bill:7qeFjndagetZk:102:102::/home/bill:/bin/sh
Фрагмент файла /etc/passwd
Регистрационное имя (логин)
[править | править код]Регистрационные имена должны быть уникальными и представлять собой строки не длиннее 32 символов (любые, кроме двоеточия и символа новой строки). В некоторых старых версиях UNIX существует ограничение длины в 8 символов, оно же будет действовать при использовании административной базы данных NIS. По сути дела, имя пользователя — это его короткий и легко запоминаемый псевдоним, который используется при входе в систему и часто включается в адреса электронной почты.
Идентификатор пользователя (UID)
[править | править код]Идентификатор пользователя — это число от 0 до . В старых системах (Minix, ранние версии BSD) оно может быть не более 32 767. Пользователь с идентификатором 0 (обычно root) называется суперпользователем и имеет право на выполнение любых операций в системе. Принято соглашение о выделении «специальным» пользователям (bin, daemon), назначение которых — только запуск определённых программ, маленьких идентификаторов (меньше 100 или, в некоторых дистрибутивах Linux, меньше 500).
Безопасность
[править | править код]В системе могут существовать несколько пользователей с одним идентификатором. Это нередко используется взломщиками, когда они после проникновения в систему создают себе учётную запись с UID=0. В результате они выглядят как обычные пользователи, но на самом деле имеют права root.
Группы пользователей
[править | править код]В UNIX пользователь может принадлежать к одной или нескольким группам, которые используются для задания прав более чем одного пользователя на тот или иной файл. Максимальное количество групп, в которых может состоять один пользователь, разное в разных вариантах системы.
Список групп с их участниками задаётся в /etc/group. В файле же /etc/passwd указывается идентификатор группы по умолчанию.
Всем файлам, созданным пользователем после регистрации в системе, будет автоматически присвоен этот номер группы (исключение — если для каталога, в котором создаётся файл, установлен в правах бит SGID, то будет присвоена такая же группа, как у самого каталога).
Файл групп
[править | править код]root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
<…>
httpd:x:100:httpd
cpanel:x:101:cpanel
Фрагмент файла /etc/group
/etc/group содержит записи обо всех группах в системе. Каждая его строка содержит
- Символьное имя группы.
- Пароль группы — устаревшее поле, сейчас не используется. В нём обычно стоит «x»[1].
- Идентификатор группы, или GID.
- Список имён участников, разделённых запятыми.
Пример записи:
bin:x:1:root,bin,daemon
Здесь сообщается, что группа bin имеет GID=1, а входят в неё пользователи root, bin и daemon.
GECOS
[править | править код]Поле GECOS хранит вспомогательную информацию о пользователе (номер телефона, адрес, полное имя и так далее). Оно не имеет чётко определённого синтаксиса.
Домашний каталог
[править | править код]После входа в систему пользователь оказывается в своём домашнем каталоге. Исторически сложилось так, что домашний каталог пользователя root называется /root, а остальные имеют вид /home/имя_пользователя. Но могут применяться и другие схемы.
Если на момент входа в систему домашний каталог отсутствует, то система выдаёт сообщение об ошибке и отказывается допустить пользователя к командной строке. Такое поведение НЕ характерно для GNU/Linux; в большинстве дистрибутивов этой ОС просто выводится предупреждение, после чего пользователь попадает в каталог «/». Это можно изменить посредством установки параметра DEFAULT_HOME в файле /etc/login.defs в значение no.
При использовании графического интерфейса (KDE, GNOME) пользователь не увидит предупреждения или сообщения об ошибке, а будет выведен из системы безо всяких объяснений (так как оконный менеджер не сможет выполнить запись в нужный каталог, такой как ~/.gnome).
Регистрационная оболочка
[править | править код]В поле регистрационной оболочки задаётся shell, то есть интерпретатор командной строки. Здесь может быть указана любая программа, и пользователь может сам выбирать для себя наиболее подходящую при помощи команды chsh. Тем не менее, некоторые системы в целях безопасности требуют, чтобы суперпользователь явно разрешил использовать приложение в качестве интерпретатора командной строки. Для этого используется специальный файл /etc/shells, содержащий список «допустимых» оболочек.
Управление базой пользователей
[править | править код]- Стандартные утилиты
- vipw
- запускает текстовый редактор, указанный в переменной среды EDITOR (или редактор по умолчанию, обычно vi(1)), загружая в него копию файла /etc/passwd (в системах GNU/Linux /etc/shadow, во FreeBSD /etc/master.passwd). После закрытия редактора переносит временную копию в сам файл. Не позволяет двум пользователям выполнять редактирование одновременно.
- useradd
- создаёт новую учётную запись.
- usermod
- изменяет данные учётной записи.
- userdel
- удаляет существующую учётную запись.
- chfn
- изменяет поле GECOS.
- chsh
- устанавливает новый командный интерпретатор.
- passwd
- задаёт новый пароль пользователя.
- adduser
- используется в дистрибутиве Debian для упрощения создания учетных записей пользователей, а также автоматической проверки их соответствия политике упомянутого дистрибутива. Она реализована в виде обертки для таких утилит, как useradd, passwd и chfn и использует дополнительный файл конфигурации /etc/adduser.conf для хранения параметров, относящихся к политике дистрибутива Debian.
Использование
[править | править код]Почти все программы в современных GNU/Linux-системах обращаются к /etc/passwd через библиотеку glibc.
Такой подход имеет много плюсов. Например, в системе с несколькими тысячами пользователей (веб-хостинг, сервера провайдеров) очень накладно каждый раз просматривать файл в поисках того или иного человека, поэтому glibc кэширует результаты наиболее частых запросов, сохраняя их результаты в памяти. См. также библиотечные функции.
Аналоги
[править | править код]Возможная альтернатива хранению списка пользователей — это сервер, хранящий информацию о них в более эффективной форме (особый случай — это системы класса Win32, где эту функцию выполняет само ядро операционной системы). Более частый для UNIX вариант — сетевая база данных LDAP, которая может обслуживать сразу несколько компьютеров. Тем не менее, на одной машине подобных решений обычно избегают из-за того, что они требуют дополнительной установки специального ПО, часто содержащего и дополнительные уязвимости.
Изменив соответствующим образом файл /etc/nsswitch.conf[англ.], можно заставить библиотечные функции использовать вместо /etc/passwd другую базу данных. Например,
passwd: nis
заставляет все библиотечные функции обращаться к системе NIS.
Значением по умолчанию (когда пользователи задаются в /etc/passwd) является
passwd: files
Механизм скрытых паролей
[править | править код]root:13$/Xhw3kaR$Vif2djTL4aQshu8aKfkl0/:12545:0:99999:7:::
daemon:*:12545:0:99999:7:::
bin:*:12545:0:99999:7:::
<…>
john:13$80l1AVB5$6AdyTstdHpsSTsewiac8O1:13283:0:31:3:14:13514:
bill:13$UdKpet5.$ssoFdtbe21qd.FL1gj19/0:13286:0:31:3:14:13514:
Фрагмент файла /etc/shadow
В файле /etc/shadow хранятся хеши паролей всех пользователей в системе. Процессы суперпользователя могут читать его напрямую, а для остальных создана специальная библиотека PAM. Она позволяет непривилегированным приложениям спрашивать у неё, правильный ли пароль ввёл пользователь, и получать ответ. Библиотека PAM, как правило, действует с привилегиями вызвавшего процесса. Таким образом, хеш не попадает «в чужие руки».
Дело в том, что злоумышленник, имея набор хешей, всегда может осуществить атаку путём перебора паролей. Например, слова из словаря являются ненадёжными паролями, так как можно зашифровать словарь целиком и поискать хеши в том, что получится. Одна из наилучших программ, выполняющих такого рода атаки — John the Ripper. Также весьма популярна утилита crack.
Уровни защиты
[править | править код]В ранних UNIX пароль шифровался с помощью одного из вариантов DES, теперь используется MD5-хеширование или blowfish-хеширование (bcrypt), MD5-хеши всегда записываются после префикса «$1$».
Перед хешированием к паролю добавляются случайные символы — «salt» (соль, от англ. add salt to something — сделать что-либо более интересным; в русскоязычных источниках иногда используется термин «затравка»). Salt также приписывается к началу полученного хеша. Благодаря salt нельзя при простом просмотре файла обнаружить пользователей с одинаковыми паролями.
Обратите внимание, что в /etc/shadow, показанном выше, две учётные записи имеют одинаковый пароль, хотя этого и не видно.
Файл /etc/shadow
[править | править код]Кроме имени (первое поле каждой строки) и хеша (второе поле), здесь также хранятся
- дата последнего изменения пароля,
- через сколько дней можно будет поменять пароль,
- через сколько дней пароль устареет,
- за сколько дней до того, как пароль устареет, начать напоминать о необходимости смены пароля,
- через сколько дней после того, как пароль устареет, заблокировать учётную запись пользователя,
- дата, при достижении которой учётная запись блокируется,
- зарезервированное поле.
Даты обозначаются как число дней с 1 января 1970 года (начало эпохи UNIX).
Обязательная регулярная смена паролей — это популярная административная мера, призванная сделать учётные записи более защищёнными. При этом многие пользователи после принудительного изменения возвращают себе старый пароль.
Применение с PAM
[править | править код]Подобные действия влияют только тогда, когда пользователь аутентифицируется через PAM, хотя существуют Linux-дистрибутивы без технологии PAM, в которых подобные действия тоже влияют. При этом также в целях безопасности создаются паузы между двумя неудачными попытками входа в систему, чтобы не дать возможность перебирать пароли через приложение, уполномоченное работать с PAM.
История
[править | править код]Основные этапы развития схемы пользователей в UNIX:
- Все пароли, зашифрованные в DES, хранятся в /etc/passwd.
- Пароли перемещаются в /etc/shadow.
- Начинает применяться хеш MD5.
Одно из основных событий, заставивших разработчиков перейти к механизму скрытых паролей — это атака червя Морриса.
Червь Морриса
[править | править код]Червь Морриса читал /etc/passwd, пытаясь подобрать пароли к учётным записям. Для этого использовалось имя пользователя (и оно же с буквами в обратном порядке), а также список из 400 наиболее популярных слов. Эта атака привела к масштабному заражению всей сети ARPANET, и именно после этого разработчики придумали /etc/shadow, запретили пустые пароли, а также добавили паузы после неправильного ввода пароля.
Библиотечные функции
[править | править код]Эти средства описаны в стандарте POSIX; существуют также другие (здесь не перечисленные) функции, позволяющие просматривать содержимое файлов /etc/passwd и /etc/shadow по записям.
Информационные
[править | править код]Описаны в заголовочном файле pwd.h:
- getpwuid — получает всю информацию о пользователе по его идентификатору.
- getpwnam — то же, но по имени пользователя.
- putpwnam — добавляет запись к уже существующим в /etc/passwd.
Скрытые пароли
[править | править код]Описаны в shadow.h:
- getspnam — получает всю информацию о пароле пользователя с заданным именем, включая хеш, из файла /etc/shadow. Применять может только суперпользователь.
- putspent — добавляет запись в /etc/shadow.
См. также
[править | править код]Примечания
[править | править код]- ↑ Использование «x» или «*» в поле пароля широко используется, чтобы показать, что в эта учётная запись заблокирована. По сути, это гарантированно неправильный хеш пароля. Основное применение — в учётных записях псевдопользователей, единственное назначение которых — запуск определённых приложений или владение определёнными файлами. Пример таких пользователей — lp, rpc, uucp. Кроме того, на данный момент принято задавать пароли групп, устаревшее поле в файле /etc/group, в значение «x» (во избежание проблем со старыми программами, которые его использовали).
Литература
[править | править код]- Эви Немет, Гарт Снайдер, Трент Хейн. Руководство администратора Linux. Установка и настройка = Linux Administration Handbook. — 2-е изд. — М.: Вильямс, 2007. — С. 1072. — ISBN 0-13-148004-9.
Ссылки
[править | править код]- man 5 passwd . — руководство UNIX о строении файла /etc/passwd. Дата обращения: 17 июня 2008. Архивировано из оригинала 14 февраля 2010 года.