<< Предыдущий раздел | /\ Содержание | >> Следующий раздел

Что есть пользователь в Unix

Наличие пользователя в Unix определяется в нескольких местах:

  1. Файл /etc/passwd -- список пользователей и их основных свойств.
  2. Файл /etc/group -- список групп пользователей.
  3. Директория типа /home/user -- домашняя директория.
  4. Файл /var/spool/mail/user -- почтовый ящик.

Местоположение домашней директории определяется администратором при "создании" пользователя, а почтовые ящики все расположены в одной директории, имя которой зависит от типа ОС -- например, во FreeBSD это /var/mail/.

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

Кроме того, при использовании сетевых информационных систем NIS или NIS+ часть содержимого файлов /etc/passwd и /etc/group может быть распределена по сети.

Файл /etc/passwd


Необходимым и достаточным условием "существования" пользователя в системе является его наличие в файле /etc/passwd.

Это текстовый файл, в каждой строке которого находится информация об одном пользователе. Каждая строка состоит из 7 полей, разделенных двоеточиями:

account:encpassword:UID:GID:GECOS:homedir:shell

Поля имеют следующий смысл:

account
Имя пользователя.
encpassword
Зашифрованный пароль.
UID
Числовой идентификатор пользователя (User IDentifier).
GID
Числовой идентификатор первичной группы этого пользователя (Group IDentifier).
GECOS
Информация о пользователе -- полное имя, телефон, комната и т.д.
homedir
Домашняя директория.
shell
Интерпретатор команд -- программа, запускаемая для данного пользователя при входе в систему.

Пример:

root:5YOyOop0O2yoE:0:0:The Superuser:/root:/bin/zsh

В "свежеустановленной" системе всегда есть пользователь "root" и некоторое количество псевдопользователей, необходимых для работы системы -- "bin", "mail", "daemon" и т.д. У специальных пользователей UID всегда меньше 100.

Предупреждение
Во многих ОС информация из /etc/passwd "размазана" по нескольким файлам (в том числе в Linux -- /etc/shadow), поэтому просто редактировать /etc/passwd "руками" нельзя!

Зашифрованный пароль. При записи паролей в Unix применяется необратимое шифрование по алгоритму DES. Поэтому даже имея доступ к зашифрованному паролю, нельзя узнать сам пароль. Система же, когда надо проверить пароль, зашифровывает строку, введенную пользователем и сравнивает ее с той, что содержится в /etc/passwd.

Однако эта схема не защищает от так называемых "словарных атак" (dictionary attacks), когда берется, например словарь, и все слова из него последовательно зашифровываются и сравниваются с тем, что записано в /etc/passwd.

Поэтому в большинстве современных систем применяются так называемые "теневые файлы паролей" (shadow passwords) -- в /etc/passwd вместо пароля стоит "*" или "x", а сам шифрованный пароль содержится в файле /etc/shadow или подобном, доступ к которому есть только у пользователя "root".

Linux также поддерживает /etc/shadow (стабильная поддержка в RedHat есть с версии 5.0, в 4.2 она несколько "кривая"), но это при необходимости надо отдельно включить, один раз выполнив команду pwconv.

Если шифрованный пароль (при наличии /etc/shadow -- в нем, иначе -- в /etc/passwd) начинается с символа "*", то он не соответствует никакому реальному паролю. Поэтому такой пароль означает "вход пользователя заблокирован" -- такие пароли стоят, к примеру, у псевдопользователей "bin", "mail", "daemon" и т.д.

Числовые идентификаторы -- UID и GID. В ядре Unix для идентификации пользователя служит не имя, а 16-битное число -- так называемый UID.

Имя же может быть практически любым -- оно используется только при входе в систему, а также тогда, когда нужно именно имя пользователя (в адресах электронной почты, в finger, talk) и в программах rsh, rlogin, ssh и им подобных.

Пользователь с UID=0 -- супервизор, он имеет имя "root".

В принципе, ничто не мешает создать нескольких пользователей с разными именами, паролями и home-директориями, но с одинаковыми UID -- у всех у них будут одинаковые права. Но при создании Unix этот фокус не предусматривался, так что некоторые программы могут работать не совсем корректно.

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

UID и GID должны совпадать на всех машинах. Аналогично тому, как имена пользователей используются в протоколах RLOGIN и SSH, и должны совпадать у одного пользователя на разных машинах, числовые идентификаторы используются сетевой файловой системой NFS. И если в rlogin и т.п. можно указать другое имя пользователя, в NFS такой возможности нет.

Поэтому для того, чтобы пользователь "vasya" на машине Bobby считался "эквивалентом" пользователя "vasya" на машине Garry, и имел по NFS доступ с правильными правами, числовые идентификаторы на обеих машинах должны совпадать. (Что интересно, одинаковость имен для NFS неважна.)

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

Файл /etc/group


Файл /etc/group по формату очень похож на /etc/passwd, но в нем перечислен список групп, существующих на машине, и пользователи, к ним принадлежащие.

Для работы с ним служат команды groupadd, groupdel и groupmod.

Манипуляции с пользователями

Хотя в принципе пользователей можно создавать "руками", путем редактирования файла /etc/passwd и еще некоторых действий, этого никогда не надо делать.

В разных ОС (и даже в разных версиях одной ОС) для манипуляций с пользователями зачастую служат разные команды. Пожалуй, единственной "универсальной" командой является passwd. Поэтому рассмотрим команды, используемые в RedHat Linux 5.2.

Создание пользователя. Для создания пользователя служит команда useradd. Самый простой вариант -- useradd имя, при этом будут подобраны "первые попавшиеся" UID и GID, а в качестве home-директории и shell будут уставлены значения по умолчанию.

Лучше же всегда пользоваться такой формой команды:

useradd -m -d home-dir -u UID -g GID имя

Это позволяет создать пользователя "с нужными свойствами".

Ключ "-m" указывает useradd, что надо создать home-директорию данного пользователя (по умолчанию она может быть прописана в /etc/passwd, но не создана на диске) и сделать его ее владельцем. В нее будут скопированы файлы из директории /etc/skel/ ("скелет" home-директории).

Замечание
В случае, если домашняя директория имеет вид "/home/group/user", то директория /home/group/ должна уже существовать -- useradd делает только саму home-директорию, а все промежуточные директории (в данном случае /home и /home/group) должны уже существовать.

Удаление пользователя. Для удаления служит команда userdel. Ей надо указать имя пользователя и ключ "-r" (для удаления home-директории). Пример:

userdel -r mickey

Изменение "свойств" пользователя. Первое, что надо сделать после создания пользователя -- назначить ему пароль. Для этого служит команда passwd.

Будучи запущена без параметров, она позволяет сменить пароль запустившего ее пользователя (предварительно спросив текущий пароль):

bobby:~% passwd
Changing password for mickey
(current) UNIX password: 
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully
bobby:~% _

Root же может сменить пароль любого пользователя, что и надо сделать сразу после его создания:

bobby:~# passwd mickey
New UNIX password: 
Retype new UNIX password: 
passwd: all authentication tokens updated successfully
bobby:~# _

Предупреждение
Используя команду passwd из-под root, надо не забывать указать имя пользователя -- иначе будет изменен пароль пользователя "root". Это довольно распространенная ошибка.

Изменить shell пользователя можно командой chsh, которая спросит полное имя shell (с директорией). В Linux и BSD-системах пользователь может сам менять свой shell, а в ОС клона SystemV -- только супервизор. Примеры:

bobby:~% chsh
Changing shell for mickey.
Password: 
New shell [/bin/zsh]: /bin/bash
Shell changed.
bobby:~% _

bobby:~# chsh -s /bin/zsh mickey
Changing shell for mickey.
Shell changed.
bobby:~# _

Пользователь не может поставить в качестве своего shell произвольную программу -- только одну из тех, что перечислены в файле /etc/shells.

Где еще брать информацию о работе с пользователями

Следует посмотреть man-страницы passwd(5), group(5), useradd(8), userdel(8), usermod(8), groupadd(8), groupdel(8), groupmod(8), passwd(1), chsh(1), shells(5), chfn(1).

Кроме того, много полезной информации содержится в главах 3, 5 и 6 книги "UNIX: руководство системного администратора".


<< Предыдущий раздел | /\ Содержание | >> Следующий раздел