Работа администратора с user account во FreeBSD


Что такое "учетная карточка" (user account)?

Unix - система многопользовательская.
Значит, для нормальной работы нужно...
Во-первых, разграничить права различных юзеров - какие файлы они могут читать/писать/изменять, какие программы запускать и т.п. Во-вторых, дать возможность каждому юзеру создавать свою "среду обитания" (environment) - иметь свои настройки для любимых программ, свои папки-директории, настройки терминала и т.п.
Для этого в системе должна быть какая-то база данных (пусть даже очень примитивная), в которой хранятся основные сведения о каждом юзере, допущеном к работе на данной машине.
(Естественно, все вышесказанное относится к любой многопользовательской системе, но в данном случае речь об Unix'е).

Итак. В Unix такая запись в соответствующей БД, содержащая сведения об юзере называется user account. Для того, чтобы допустить нового пользователя в систему, необходимо создать для него этот account.

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

Какие данные хранятся в учетной карточке?

Прежде чем перечислить - какие поля есть в учетной карточке, хотелось бы обратить внимание вот на что.

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

Если в какой-нибудь команде требуется в качестве аргумента указать юзера, обычно используется это "login name". И, наоборот, если какая-либо программа в своем выводе как-нибудь упоминает конкретных юзеров, она обычно называете их этим именем, а не просто печатает номер юзера.

То есть, между user ID и name должно быть всегда однозначное соответствие. Просто user ID используется во внутренних данных системы, а name при общеннии человек-компьютер.

Итак. В учетной карточке юзера хранится

Name
Password
user ID
group ID
General information
Home dir
Shell
кроме того есть еще поля, которые часто не используются (кстати, в карточке они располагаются между group ID и General Information)
Class
Password change time
Account expiration time
Назначение этих полей.

Name
Это уникальное имя юзера. Его спрашивают при входе в компьютер. Оно используется в командах администрирования.

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

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

user ID
Уникальный номер юзера. Он однозначно соответствует имени (Name) и используется внутри системы. (Строго говоря, может быть и несколько записей с одним user ID, но разными Name. Но для обычных пользователей это не нужно.)

group ID
Номер группы, к которой принадлежит юзер. Подробнее о группах смотри Администрирование групп юзеров.

General information
Это просто некоторые "анкетные данные" того реального человека, который скрывается под Name. Это поле можно и не заполнять. Обычно там пишут просто реальное имя/фамилию юзера (например John Doe).

Однако, полностью это поле может состоять из

Full Name - Имя Фамилия,
Location - адрес (имеется в виду рабочее место),
Office Phone - рабочий телефон,
Home Phone - домашний телефон
Home dir
Домашний каталог юзера. Именно в этом каталоге помещаются настроечные файлы для различных программ с настройками под конкретного юзера. Здесь же юзеру дается полная свобода создавать/удалять свои файлы.

Shell
Программа, которая запускается для юзера, когда он входит в систему. Обычно это "исполнитель комманд" (типа command.com в DOS'е), который принимает комманды с терминала и, в свою очередь, запускает программы, необходимые юзеру.

В современных Unix'ах обычно есть несколько таких "исполнителей" (sh, csh, tcsh, bash ...) из которых можно выбрать наиболее подходящий.

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

Подробнее об этом сказано в разделе "Для чего используется учетная карточка".

Class
Это поле служит для поиска дополнительной информации для данного юзера в специальной базе данных "login-классов". Дело в том, что учетная карточка содержит минимальный набор данных для регистрации юзера и создания ему "среда обитания". Но со временем появилась необходимость расширить эту информацию. Например, было бы полезно устанавливать ограничения на используемые юзером ресурсы машины - количество задач, которые юзер может запускать одновременно, или количество файлов, кторые его задачи могут одновременно держать открытыми. С другой стороны, кроме Home dir и Shell было бы удобно сразу при входе в систему автоматически устанавливать юзеру некоторые "переменные окружения" (например - "язык сообщений").

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

Поэтому, в FreeBSD решили юзеров группировать в login-классы (не путайте их с традиционными группами юзеров), а все дополнительные данные для такой группы (или другими словами - для каждого юзера из этой группы) поместили в отдельную базу данных - login.conf, которая имеет очень гибкий формат и позволяет легко добавлять новые поля. Конечно, при необходимости можно для каждого юзера создать отдельный login-класс в этой базе, но в большинстве случаев этого не требуется.

Итак. Это поле просто указывает - к какому login-классу относится данный юзер, и соответсвенно - где искать дополнительные данные для этого юзера.

Поробнее о базе данных login-классов смотрите в "База данных login.conf".

Password change time
Здесь администратор может указать дату, когда юзеру следует поменять пароль. Дело в том, что, если требуется повышенная секретность, одной из мер предосторожности является то, что пароли должны периодически меняться (раз в неделю, месяц и т.п.). Для того, чтобы заставить юзера следовать этому правилу, администратор задает дату, после наступления которой компьютер будет предлагать юзеру при входе систему поменять свой пароль.

Account expiration time
А здесь администратор задает дату, после которой доступ юзеру в систему будет запрещен. То есть, account юзера сохраняется (и все его файлы тоже), но войти в систему он не сможет (пока не договорится с администратором :-).

Подробнее обо всем этом можно прочитать в соответствующем man'уале.
man 5 passwd.

Для чего используется учетная карточка?
А вот это - очень не простой вопрос.

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

Обычные юзеры
Псевдо-юзеры
Почтовые юзеры
"Гостевой вход"
Автоматический запуск коммуникационных программ
Обычные юзеры
Когда обычный юзер заходит в систему (с физического терминала или по сети), он должен сказать свое имя (Login Name) и пароль (Password). Соответствующая программа сверяет эти данные с теми, что записаны в учетной карточке и, если они сопадают, "пускает" юзера в систему. То есть запускается программа, которая указана как Shell в учетной карточке. Юзер с помощью этой программы может запускать другие. При этом ему можно создавать/удалять/писать/читать файлы, которые находятся в его Home dir (которая тоже указана в учетной карточке).

Псевдо-юзеры.
Часто бывает полезно ограничить некоторым программам (которые запускаются автоматически - ftp-сервер, www-сервер и т.п.) доступ к файлам и директориям.

Например, вы создаете на своей машине WWW-сервер. Естественно, его назначение - выдавать в сеть какие-то документы (файлы *.html), специально предназначенные для публичного обозрения. В то же время, не хотелось бы, чтобы он (из-за возможных ошибок или злонамеренных "закладок" в программе) мог выдавать наружу другие файлы находящиеся в системе.

В Unix предусмотренно, что права на чтение каждого файла можно связать с определенным пользователем. Юзер может читать файлы, для которых он является "хозяином" или "владельцем" (на самом деле разграничение прав несколько более сложное, но в данном объяснении это не важно). Все остальные файлы можно сделать для него недоступными.

Таким образом, для решения задачи нужно
- зарегистрировать фиктивного пользователя - например www;
- все файлы, к которым должна иметь доступ программа WWW-сервера, объявить "собственностью" юзера www (естественно, что ваши секретные файлы должны быть недоступны этому самому www);
- обяснить системе, что когда запускается программа WWW-сервера, все должно выглядеть так, как будто его запустил реальный юзер www.
Все остальное сделается автоматически средствами Unix.

Разумеется, при таком подходе никакого реального человека, который скрывается под именем www может не быть.

Следовательно, в учетной карточке такого фиктивного юзера не нужен реальный пароль (вместо пароля ставится какая-нибудь абракадабра, так, чтобы никто не мог даже подобрать его. Точнее, ставится знак "*", поскольку в настоящих шифрованных паролях такой знак никогда не встречается), никакой General information, не нужна также Home dir (хотя, иногда имеет смысл объявить его домашней директорией ту, где лежат его данные) и Shell.

Особым случаем псевдо-юзера является юзер ftp. Дело в том, что у ftp-сервера могут быть две задачи. Первая - дать возможность реальным пользователям этой машины перекачивать свои файлы из этого компьютера (или, наоборот, "вкачивать") по сети. Вторая - предоставить некую "свалку" файлов всем желающим (то, что обычно называют "анонимный ftp"). В первом случае каждый реальный юзер говорит серверу свое имя и пароль и получает доступ к файлам такой же, как если бы он вошел в систему. Во втором случае, если вы не зарегистрированы в качестве юзера на этой машине, вы можете сказать, что вы - юзер anonimous или юзер ftp. В этом случае, программа ftp-сервер проверяет - зарегистрирован ли в БД учетных карточек псевдо-юзер ftp (именно ftp, а не anonimous) и, если такой юзер зарегистрирован, то пускает вас в домашнюю директорию (Home dir) этого юзера, там и должна лежать "свалка" файлов для всех желающих.

Таким образом, в учетной карточке псевдо-юзера ftp существенным являются в основном поля Name и Home dir. Остальные, обычно, значения не имеют.

Таких псевдо-юзеров в любой системе существует несколько. Вы можете сами убедиться, заглянув в /etc/passwd.

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

Если в качестве "почтового сервера" используется Unix-машина, то самым простым способом обеспечить прием почты и поддержание "почтового ящика" для конкретного человека - это зарегистрировать его как обычного юзера этой машины. (Точнее, это единственный стандартный способ.) Кроме того, для того, чтобы никто посторонний не мог получить доступ к "почтовому ящику", при соединении с "почтовым сервером" используется процедура аналогичная входу в систему обычного юзера - то есть POP-клиент должен предьявить серверу имя и секретный пароль юзера. Причем, обычно, программа POP-сервер ищет эти имя и пароль в той же базе учетных карточек.

Особенность этой ситуации состоит в том, что человек, который пользуется этой Unix-машиной как "почтовым сервером", может больше никакого отношения к ней не иметь. То есть ему нет необходимости заходить на эту машину как ее пользователю, запускать программы, хранить файлы. Более того, возможно, администратору и не хотелось бы, чтобы такой юзер имел доступ к чему-либо, кроме своего "почтового ящика".

Следовательно, в учетной карточке такого юзера нет домашней директории, или ставится какя-нибудь "левая" директория, одна на всех таких юзеров.

А, самое главное, не должно быть реальной программы Shell. Вместо нее лучше всего подставить какую-нибудь программу, которая просто напечатает сообщение типа: "Sorry, вам сюда нельзя" и завершит работу. В качестве такой программы можно использовать /bin/date (она напечатает текущую дату и завершится) или программу /sbin/nologin (она печатает сообщение, что "эта учетная запись сейчас недоступна", и на этом заканчивает свою работу).

Кстати, если поле Shell в учетной карточке просто оставить пустым, то система все равно впустит юзера и даст ему "исполнителя комманд" /bin/sh.

"Гостевой вход".
Поскольку, вместо Shell (программы, которая автоматически запускается для вошедшего юзера) можно использовать любую программу, можно сделать небольшую информационную систему для публичного просмотра. Для этого регистрируется пользователь, например, guest (гость). В качестве Shell у этого юзера должна быть программа, которая позволяет просмотреть документы, предназначенные для публики (какя-нибудь BBS, www-browser или другая, специально для этого написанная программа). Естественно, надо принять меры предосторожности, чтобы эта программа не могла прочитать другие файлы из вашего компьютера и не могла записать ничего лишнего на диск.

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

Автоматический запуск коммуникационных программ.
Если к компьютеру подкючен модем, он может оказывать различные услуги через телефонные линии (BBS, прием/передачу e-mail, IP-доступ и т.п.). Если один и тот же телефонный вход используется для различных услуг, то возникает проблема - как обеспечить запуск различных коммуникационных программ для разных клиентов.

Одно из решений заключается в следующем. Для каждой возможной услуги регистрируется пользователь, у которого в качестве Shell указывается соответствующая коммуникационная программа.

Например, можно зарегистрировать пользователей:
UUCPuser - для которого запускается программа uucico (из пакета uucp),
PPPuser - для которого запускается драйвер, для связи по протоколу PPP,
SLIPuser - для которого запускается драйвер, для связи по протоколу SLIP.

Теперь, если клиент, позвонивший на модем, введет в качестве Login name PPPuser (например), то для него на этом конце модемной линии включится драйвер PPP и он получит IP доступ по этому протоколу.

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

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

Где хранятся учетные карточки?
В FreeBSD существует четыре файла, которые имеют отношение к БД учетных карточек. Все они находятся в директории /etc.

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

/etc/spwd.db - основная БД, именно отсюда соответствующие программы берут нужные им данные. Данные хранятся в двоичном виде, то есть простым редактором там ничего не сделаешь.

/etc/master.passwd - та же БД, но в текстовом виде. Этот файл можно читать и изменять обычным текстовым редактором. Но, если вы будете его менять, потом нужно будет запустить соответствующую утилиту, которая сделает изменения и в остальных трех файлах.

/etc/pwd.db - то же, что и spwd.db, но без паролей (в поле password просто стоит знак *)

/etc/passwd - то же, что и master.passwd, но без паролей.

Для чего нужны два последних файла? Дело в том, что, хотя пароли хранятся в зашифрованном виде, показавать их всем, все равно, не рекомендуется. Злоумышленник, зная как выглядит зашифрованный пароль, может, если и не расшифровать его, то подобрать подходящий.

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

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


Как добавить юзера?
Ответ на этот вопрос не такой простой, как может показаться. Все зависит от того - какого юзера вы хотите зарегистрировать. (О том, какие типы юзеров могут встретиться смотри - "Для чего используется учетная карточка" ).

Заметьте, что, для того, чтобы пустить в свою систему реального юзера, надо не только добавить новую учетную карточку для него. Еще надо создать ему домашнюю директорию и, желательно, положить туда некоторые стартовые файлы (типа config.sys и autoexec.bat в DOS'е). При этом надо правильно установить права нового юзера на эти файлы.

Для того, чтобы не делать эту работу вручную, существует специальная утилита (см. ниже). Но, если вам нужно зарегистрировать псевдо-юзера или "почтового юзера", она не очень подходит. В этом случае лучше воспользоваться более примитивными средствами.

Итак. Программы для регистрации (и не только) нового пользователя.

pwd_mkdb
vipw
adduser
pw useradd
Еще что-нибудь
pwd_mkdb
Собственно, эта утилита только преобразует файл master.passwd в три остальных файла (см. "Где хранятся учетные карточки").

Вы можете любым текстовым редактором добавить строчку в master.passwd, взяв за образец любую из тех строчек, которые там уже есть (желательно, перед этим внимательно прочитать man 5 passwd). Если, после этого запустить команду
pwd_mkdb -p /etc/master.passwd
то она сделает соответствующие изменения в spwd.db, pwd.db, passwd.

Не забудьте, что пароль в учетной карточке хранится в зашифрованном виде. Поэтому, при составлении записи, это поле учетной карточки лучше оставить пустым, а потом занести пароль утилитой, которая специально для этого предназначена:
passwd <имя юзера>

Конечно, это самый сложный способ, но... Если вы когда-нибудь возьметесь написать свою программу для регистрации, то она должна будет просто сформировать правильную строчку для файла master.passwd, занести ее в этот файл, а потом просто вызвать pwd_mkdb. Кстати, остальные программы, о которых дальше идет речь, именно так и делают.

vipw
Эта программа слегка :-) автоматизирует процесс описанный выше. Она сама запускает текстовый редактор, а, по выходу из редактора, pwd_mkdb.

Облегчение состоит в том, что вам не надо помнить - какой файл вы редактируете и как правильно вызвать pwd_mkdb.

Запись в master.passwd вам все равно придется составить самостоятельно. При этом не забудьте, что Name и userID должны быть уникальными для каждого юзера.

Важное замечание по поводу текстового редактора. Программа vipw сама редактором не является. Она запускает текстовый редактор, который задан переменной окружения EDITOR, а если таковой не найдет, то редактор vi. Причем, обычно, при установке FreeBSD в стартовых файлах для root эта переменная устанавливается, но это тот же vi.

Дело в том, что работать с этим редактором без подготовки достаточно сложно. Поэтому, установите переменную EDITOR, выбрав свой любимый редактор. Если любимого редактора у вас пока нет, можно воспользоваться редактором /bin/ee.

adduser
Это самая "продвинутая" программа для добавления нового юзера. Она задает вопросы касающиеся нового юзера, сама проверяет имя и user ID на уникальность (причем, для user ID она сама предложит подходящее значение), создает домашнюю директорию для юзера и копирует туда заготовки настроечных файлов, и даже может послать приветственное письмо вновь зарегистрированному юзеру. Естественно, она же делает запись в БД учетных карточек.

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

Например, вам нужно зарегистрировать "почтового юзера". Для такого юзера не нужна домашняя директория (а тем более заготовки стартовых файлов) и Shell у этого юзера должен быть нестандартный. Так вот - заставить эту программу не делать домашнюю директорию очень трудно (если вообще возможно). Кроме того, она не даст вам указать в качестве Shell произвольную программу.

Поэтому, в этой ситуации, вам придется либо подчищать за ней все лишнее, что она сделает, либо обратиться к другим способам создания учетной карточки.

pw useradd
Возможно, вам покажется более удобной утилита pw. Эта программа, по замыслу авторов, должна быть универсальной утилитой для администратора в вопросах создания/изменения/удаления юзеров и групп. Поэтому, для данной задачи (регистрации нового юзера) ее надо запускать в виде:
pw useradd .....

В отличии от adduser эта утилита очень не разговорчивая, то есть, она не задает никаких вопросов и все нужные сведения о новом юзере ей нужно сказать в командной строке с помощью соответствующих ключей.

Но, с другой стороны она имеет и ряд достоинств:

обычно, достаточно ей указать только имя нового юзера, все остальное она "сочинит" сама. Например:
pw useradd vasia
(программа сама подберет подходящий userID, и заполнит поля group, Home dir, Shell и т.п., взяв их из своего конфигурационного файла)
все данные, подставляемые "по умолчанию", можно легко поменять, запустив эту же программу в виде
pw useradd -D ...
или отредактировав напрямую конфигурационный файл /etc/pw.conf
(если у вас в /etc такого файла нет, то просто наберите команду pw useradd -D и он сам создастся).
при этом можно иметь несколько различных конфигурационных файлов, для разных типов юзеров, и явно указывать в команде - какие "умолчания" использовать для создания данного юзера. Например, у вас есть юзеры трех различных типов (отличающися своими group, Home dir, Shell и т.п.). Сделайте три разных конфигурационных файла (просто "растиражируйте" /etc/pw.conf и подправьте в каждом то, что нужно.) Теперь, чтобы создать юзера с "умолчаниями" из файла /etc/pw1.conf, наберите команду
pw useradd vasia -C/etc/pw1.conf
Подробнее о всех параметрах (ключах) этой программы можно посмотреть в соответствующем man'уале (man pw), краткий список ключей можно "спросить" у самой программы, командой
pw useradd help
(но man pw все равно лучше прочитать, хотя бы раз :-)

Здесь я хочу только обратить внимание на ключь -m. Дело в том, что pw useradd "по умолчанию" делает только запись в учетной карточке. А с этим ключем
pw useradd vasia -m
она, также, создаст домашнюю директорию для юзера и скопирует туда соответствующие стартовые и настроечные файлы.

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

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

Ниже приводится пример программы, написанной на языке "интерпретатора комманд" sh, для регистрации "почтового юзера". Естественно, это не столько рабочая программа, сколько пример, который должен вдохновить вас на самостоятельное творчество. :-)

Некоторые пояснения. Программа использует системную утилиту id, которая выводит некоторую информацию о заданном юзере (причем, в качестве аргумента этой утилиты может использоваться как name юзера, так и его user ID). В данном случае она используется только для проверки - зарегистрирован ли уже такой юзер в системе.
Форма - id ... >/dev/null 2>&1
используется для того, чтобы подавить весь вывод этой утилиты, который, при использовании ее внутри программы, будет совершенно лишним.

#!/bin/sh # Эти переменные вынесены в начало, чтобы их можно было легко поменять # при необходимости shell=/bin/date # имя Shell для регистртруемого юзера group=2000 # group ID для регистрируемого юзера uid=2000 # user ID, начиная с которого программа ищет # ближайший свободный # найти ближайший не занятый user ID while (true) ; do if (id $uid >/dev/null 2>&1) then uid=$(($uid+1)) else break fi done # Запросить Name для нового юзера и проверить его на уникальность, # если юзер с таким Name уже зарегистрирован в системе, сообщить # об этом и повторить вопрос while (true) ; do read -p 'User Name: ' name if (id $name >/dev/null 2>&1) then echo 'user "'$name'" already exists' else break fi done # Запросить "реальное имя" юзера (чтобы записать его в General information) read -p 'Real name of "'$name'" : ' rname # Сформировать учетную карточку и вписать ее в master.passwd echo $name'::'$uid':'$group'::0:0:Postbox for '$rname'::'$shell >> /etc/master.passwd # Запустить pwd_mkdb, чтобы сделать изменения во всех файлах # БД учетных карточек pwd_mkdb -p /etc/master.passwd # Запросить секретный пароль для нового юзера passwd $name # Если необходимы еще какие-то действия - создать директорию или внести # изменения в другие файлы, то это можно сделать далее в той же программе. # Но, в данном случае, больше ничего делать не нужно.



Как поменять данные в учетной карточке?
Во-первых, для изменения секретного пароля юзера (поле Password) надо использовать специальную команду

passwd "имя юзера"

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

Все остальные поля можно поменять с помощью утилиты vipw или chpass. Можно, также, использовать "универсальную" утилиту pw, хотя в данном случае, это, пожалуй, самый неудобный инструмент.

Программа vipw (можете посмотреть о ней также в разделе "Как добавить юзера") позволяет редактировать запись непосредственно в файле master.passwd. Естественно, вы должны представлять себе формат этой записи (об этом можно прочитать в man 5 passwd).

Несколько более удобной является утилита chpass (она же chsh и chfn). Она дает возможность редактировать конкретную учетную карточку юзера, имя которого вы укажете при запуске этой программы. Но, при этом, она выводит какждое поле какрточки в отдельной строке с подсказкой - что какое поле означает.

Login: vasia Password: ..... Uid [#]: 1000 Gid [#]: 1000 ... и т.д. Особенно, программа chpass полезна, если вы захотите изменить Password change time (дату, когда система предложит юзеру поменять пароль) или Account expiration time (дату, после которой не пускать юзера в систему). Дело в том, что в самой учетной карточке эти даты хранятся в цифровом формате, понятном только самой системе, а chpass показывает и воспринимает их в "человеческом" виде (месяц, день, год).

Программу pw тоже можно использовать для изменения данных в учетной карточке (вообще-то ее удобнее применять для создания/удаления юзеров). Этой программе все данные нужно задавать в командной строке, с помощью соответствующих ключей. Например:
pw usermod vasia -s /bin/csh
запишет в учетную карточку юзера vasia Shell - /bin/csh.

Список всех возможных ключей можно "спросить" у самой программы
pw usermod help
(и, конечно, хорошо бы почитать man pw).

Чтобы не "действовать вслепую" можно посмотреть текущие данные у юзера командой
pw usershow vasia.

Конечно, в данном случае pw usermod менее удобна, чем "полноэкранные" утилиты. Ее использование может быть оправдано только в случае, когда надо сделать много однотипных изменений для нескольких юзеров. Ну, или если вы привыкли ей пользоваться (pw - утилита универсальная для регистрации/просмотра/изменения/удаления юзеров, и во многих случаях может оказаться более удобной, чем остальные).

Заметьте, что vipw вообще не проверяет корректность данных. А chpass и pw usermod проверяют только отдельные поля (и то, иногда отделываются предупреждениями). Ни одна из них не проверяет на уникальность Name и user ID. Поэтому, пользуйтесь ими с осторожностью.

И, наконец, опять замечание по поводу текстового редактора. Ни одна из описанных "полноэкранных" утилит не имеет своего редактора и вызывает тот редактор, который задан переменной окружения EDITOR (если таковой не обнаружится, используется редактор vi). Не забудьте указать, в качестве значения этой переменной, ваш любимый текстовый редактор.



Как удалить юзера?
С одной стороны, очень просто - удалите его учетную карточку из базы. Это можно сделать программой vipw - найдите соответствующую строчку и удалите ее.

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

Что надо удалить?
Найти все эти файлы можно с помощью...
Где еще могут остаться упоминания об этом юзере?
Самый простой способ удалить юзера (программы rmuser и pw).

Что надо удалить?
Во-первых, домашнюю директорию юзера. Кстати, если администратор не предпринимал никаких действий, чтобы дать юзеру возможность писать в другие директории, то все файлы, которые мог "наплодить" юзер должны лежать в его Home dir. Если же вы дали юзеру права создавать файлы в других диркториях (в публичном ftp архиве или в директории www сервера, например), то, возможно, надо "почистить" и там.

Во-вторых, "почтовый ящик" юзера в директории /var/mail. Сделайте это обязательно, даже если юзер просил "пока не удалять почту" (или хотя бы уберите этот файл из /var/mail). Дело в том, что название этого файла совпадает с Name юзера, а права на чтение/запись определяются его user ID, и, естественно, должны соответствовать друг-другу.

Не вдаваясь в подробности, могу сказать, что если вы вскоре зарегистрируете нового пользователя с тем же user ID (он же освобождается), но с другим именем, или наоборот - с таким же именем, как у старого юзера, но с другим user ID, то у этого нового юзера возникнут серьезные проблемы с получением почты.

В-третьих. Могут быть еще где-то раскиданы файлы, владельцем которых был этот юзер. Например, в директории /tmp, /usr/tmp, /var/tmp.

Найти все эти файлы можно с помощью программы find. Например, так
find / -user vasia
(Обратите внимание, первый аргумент - директория, начиная с которой искать. В данном примере это корневая, то есть будут просмотрены все файлы в системе. С одной стороны это хорошо - ничего не пропустите, но, с другой стороны, если у вас стоит ньюс-сервер или огоромный ftp-архив, то ждать придется долго).

С помощью этой же команды можно и удалить все найденные файлы
find / -user vasia -delete
однако, поскольку она не спрашивает подтверждения, этот метод очень опасный. Лучше уж заставить ее выполнять команду rm ( с подтверждением) для каждого найденного файла
find / -user vasia -exec rm -i {} ;

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

в файлах /etc/group, /etc/login.access, /etc/ftpusers
в таблицах программы sendmail: /etc/aliases и т.п. (virtusertable, genericstable и др.)
если у вас отдельным юзерам разрешается запускать задачи с помощью cron, то юзер может упоминаться в /etc/crontab или в /var/cron/allow, /var/cron/deny, а, также, может быть его индивидуальная crontab в /var/cron/tabs/
если юзерам разрешается пользоваться "пакетным" выполнением программ, то юзер может упоминаться в /var/at/at.allow, /var/at/at.deny
если у вас ведется "квотирование" дискового пространства, то должна быть quote для этого юзера
если юзер пользуется IP связью через модем, то он может упоминаться в файлах, лежащих в /etc/sliphome или /etc/ppp
от имени юзера могут запускаться какие-нибудь демоны (особенно это касается псевдо-юзеров), тогда имя юзера может быть в /etc/inetd.conf или /etc/rc.local.
Итак, вы видите, что полное удаление юзера из системы в общем случае очень не простая задача.

Однако, в большинстве случаев все гораздо проще.

Самый простой способ удалить юзера (программы rmuser и pw).
Большую часть работы по удалению юзера (и всяческих упоминаний о нем) выполняет программа

rmuser <имя юзера>

Во всяком случае, кроме удаления учетной карточки, она удаляет

его домашнюю директорию;
его "почтовый ящик" в /var/mail;
упоминания о юзере в /etc/group;
персональную crontab юзера;
"пакетные" задания юзера в /var/at/jobs.
Как я уже сказал, в большинстве случаев этого вполне достаточно.
Те же действия выполняет "универсальная" утилита pw. Для этого ее нужно запустить в виде
pw userdel <имя юзера> -r
(без ключа -r она только удалит учетную карточку из базы)



Что может поменять сам юзер в своей учетной карточке?
Естественно, любой юзер может поменять свой пароль (и даже желательно, чтобы он это делал время от времени).

Делается это командой passwd, той же, которой пользуется администратор. Разница в том, что администратор может поменять пароль любому юзеру, вызвав эту команду с именем юзера в качестве аргумента. А обычный юзер может поменять только свой пароль.

Кроме того, юзер, как и администратор, может воспользоваться программой chpass. Естественно, он может редактировать только свою учетную карточку. При этом, он сможет поменять в ней только поля Shell и General information (свое реальное имя, адрес, телефон).



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

Поэтому, этот способ - самый неудачный и его даже не стоит рассматривать. Лучше рассмотрим другие возможности:

Первый способ
Второй способ
Так как же все таки надо поступить?
Возможно, еще один способ
Первый способ
Этот способ (пожалуй, наиболее "цивилизованный") заключается в том, что в учетную карточку надо вписать"Account expiration time" (с помощью программы chpass), естественно, поставив там уже прошедшую дату. В этом случае, юзер как бы существует в системе - письма к нему идут, файлы сохраняются, во всех диагностиках, где может встретиться его имя, оно отображается правильно. Но, в то же время, если юзер попытается войти в систему, ему просто выдастся сообщение, что "ваш account истек".

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

Обычный юзер может войти в систему (и пользоваться ее ресурсами) через терминал или по сети, с помощью telnet. При этом должна проработать программа login (которая проверит имя и пароль юзера и, если все правильно, запустит для него Shell). Эта же программа обычно вызывается для тех, кто заходит через модем и устанавливает IP соединение по модемной линии (PPP или SLIP). (Кстати, login'у можно запретить пропускать юзера, если прописать правильную строчку (запрещающую вход конкретному юзеру) в файле /etc/login.access. Как это правильно сделать, можно посмотреть в man login.access). Но, кроме того, юзер может (если, конечно, ваша система предоставляет такой сервис):

иметь доступ к своим файлам через FTP, тогда проверкой имени/пароля занимается ftpd (программа-сервер FTP);
читать свою почту через POP-сервер, тогда проверкой имени/пароля занимается программа popper;
иметь доступ к своей домашней директории через сервер "samba", тогда проверкой имени/пароля занимается программа smbd;
пользоваться RPC-сервисами - "удаленным запуском программ" (rlogin, rsh и т.п.), тогда проверкой имени/пароля занимаются соответствующие демоны (rlogind, rshd и т.д.);
Так вот. Проблема в том, что не все перечисленные демоны (программы-серверы), ответственные за допуск юзера к ресурсам, могут обращать внимание на "Account expiration time". И, следовательно, все равно дадут юзеру возможность воспользоваться своими услугами.

Второй способ
Другой способ "отсечь" юзера заключается в том, чтобы "испортить" ему пароль. Для этого достаточно добавить к зашифрованному паролю, хранящемуся в учетной карточке, один знак. Обычно, ставят знак "*" в начале пароля, поскольку этот знак не может встретиться в нормальном зашифрованном пароле и, во-первых, пароль в этом случае невозможно подобрать, а во-вторых, такое "искажение" пароля легче потом искать, когда вы будете возвращать юзера обратно. Сделать такую манипуляцию можно программой vipw или chpass.

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

Недостаток этого способа в том, что он менее "цивилизованный". То есть, юзер просто получит сообщение о том, что он неправильно ввел свое имя или пароль, а не о том, что ему запрещен вход.

Кроме того, есть случаи, когда этот способ не работает. Дело в том, что RPC-сервисы могут не проверять пароль, если у юзера в домашней директории в соответствующем файле (.rhosts) записаны адреса машин "пользующихся доверием" и он осуществляет доступ именно с этих машин. В этом случае, проверяется только адрес машины (и имя юзера под которым он зарегистрирован там), а пароль не запрашивается, следовательно, описанный метод не сработает. (Кстати, предыдущий метод ("account expiration") в этом случае должен работать.)

Так как же все таки надо поступить?
Способ с "испорченным" паролем более универсальный, но неправильный :-).

Самый правильный путь - подбирать всех демонов таких, которые правильно отрабатывают запрет входа (например, через "account expiration"). Кстати, те демоны, которые у вас "с раздачи" (то есть, из "родного" дистрибутива), должны правильно обрабатывать такой запрет. Проблемы могут возникнуть только с программами от других разработчиков.

Кроме того, для юзеров, запускающих "IP по модему", обычно, другой способ входа недоступен. Поэтому можно смело пользоваться "account expiration" или запретом в /etc/login.access.

Возможно, еще один способ
И, наконец, следует отметить, что в FreeBSD, начиная с версии 2.2.2 появилась "база данных login-классов" (login class capability database), /etc/login.conf. Она предоставляет более гибкие возможности по ограничению входа. Можно не только полностью запретить вход юзеру, но разрешить только в определенное время суток или ограничить длительность сессии и т.п.

Но недостаток этого метода такой же как у первого способа ("account expiration"). Все ограничения (в том числе и полный запрет) установить в этой "базе данных" можно. Но это не означает, что все программы будут обращать на них внимание. Реально их использует программа login и некторые другие программы из "базовой поставки" (например ftpd). Но если вы используете программы от других производителей ("нештатный" ftpd, POP3- или IMAP-сервер и т.п.), то они, скорее всего, не подозревают о существовании login.conf и проигнорирут ваши запреты и ограничения.



Что еще почитать?
Естественно, man'уалы, имеющие отношение к теме.

man 5 passwd - описывает структуру учетной карточки (user account)

man adding_user - общие слова о добавлении юзера. Кстати, там есть рекомендации - каким должно быть Login name

Утилиты для регистрации нового юзера. А, также, для удаления, изменения полей в учетной карточке и т.п.
man pwd_mkdb
man vipw
man adduser
man pw

Утилиты для внесения изменений.
man passwd - изменение пароля
man chpass - другие изменения в учетной карточке
man pw - тоже делает изменения в учетной карточке

Утилиты для удаления юзера.
man rmuser
man pw

К вопросу о временной блокировке входа юзеру.
man login.access
man login.conf

А, также, в каждом из них есть раздел See Also (смотри также...). Их тоже можно почитать, хотя, в основном, они все ссылаются друг на друга.

Обновлено: 12.03.2015