4.3. Пользователи и основы управления учетными записями
Пред. | Глава 4. Основы UNIX | След.

## 4.3. Пользователи и основы управления учетными записями

Предоставил: Neil Blakey-Milner.
Перевод на русский язык: Денис Пеплин.

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

В этом разделе описаны:

- Разные типы учетных записей в системе FreeBSD.

- Как добавлять, удалять и изменять учетные записи пользователей.

- Как устанавливать ограничения на использование ресурсов для учетных записей или групп учетных записей.

- Как использовать группы для упрощения управлением учетными записями.

### 4.3.1. Разновидности учетных записей

Так как доступ к системе FreeBSD осуществляется через учетные записи, и все процессы запускаются пользователями, то управление пользователями и учетными записями является важным аспектом администрирования.

Существует три разновидности учетных записей: системные учетные записи, учетные записи пользователей и суперпользователь.

#### 4.3.1.1. Системные учетные записи

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

Примеры системных учетных записей: `daemon`, `operator`, `bind`, `news` и `www`.

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

#### 4.3.1.2. Учетные записи пользователей

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

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

С каждой учетной записью в системе FreeBSD связана определенная идентификационная информация:

Имя пользователя

  Имя пользователя вводится в приглашение `login:`. Имена пользователей должны быть уникальны. Существует множество правил для создания допустимых имен пользователей, документированных в passwd(5). Рекомендуется составлять имена пользователей из восьми или меньшего количества символов в нижнем регистре, чтобы поддерживать обратную совместимость с приложениями.

Пароль

  С каждой учетной записью связан пароль.

ID пользователя (User ID, UID)

  Идентификатор пользователя (UID) - это номер, используемый для однозначной идентификации пользователя в системе FreeBSD. Любая команда, принимающая в качестве аргумента имя пользователя, первым делом преобразует его к UID. Рекомендуется выбирать значения UID, не превышающие 65535, так как большие значения могут вызывать проблемы совместимости для некоторых пользовательских программ.

Идентификатор группы (Group ID, GID)

  Идентификатор группы (GID) - это номер, используемый для однозначной идентификации главной группы, к которой принадлежит пользователь. Группы это механизм для контроля доступа к ресурсам на основе GID пользователя вместо его UID. Это может значительно уменьшить размер некоторых файлов настройки. Кроме того, пользователь может быть включен более чем в одну группу. Рекомендуется использовать значения GID, не превышающие 65535, так как большие значения могут стать проблемой для некоторых программ.

Класс доступа (login class)

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

Срок действия пароля

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

Срок действия учетной записи

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

Полное имя пользователя

  Имя пользователя является уникальным идентификатором учетной записи в FreeBSD, однако оно не обязано соответствовать реальному имени пользователя. Это поле может содержать реальное имя пользователя. Здесь допустимы пробелы, символы подчеркивания, строка не ограничена до 8 символов.

Домашний каталог

  Домашний каталог определяется полным путем в системе. С него пользователь начнет работу после входа в систему. По общепринятому соглашению все домашние каталоги пользователей помещаются в `/home/username` или `/usr/home/username`. Пользователи хранят личные файлы и подкаталоги в своих домашних каталогах.

Оболочка пользователя

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

#### 4.3.1.3. Учетная запись суперпользователя

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

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

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

Есть несколько способов получения привилегий суперпользователя. Наименее удобный способ - войти в систему под учетной записью `root`.

Вместо этого можно воспользоваться su(1). Если при запуске этой команды указывается ключ `-`, пользователь получит настройки окружения учетной записи `root`. Пользователь, запускающий эту команду, обязан входить в группу `wheel`, в противном случае команда не выполнится. Пользователь также должен знать пароль учетной записи `root`.

В следующем примере пользователь повышает привилегии для запуска команды `make install`, так как этот шаг требует прав суперпользователя. По завершении работы команды пользователь набирает `exit`, тем самым выходя из учетной записи суперпользователя и возвращая привилегии собственной учетной записи.

Пример 4.1. Установка программы с привилегиями суперпользователя

    % configure
    % make
    % su -
    Password:
    # make install
    # exit
    %

Утилита su(1) прекрасно подходит для одиночных систем или небольших сетей с единственным системным администратором. В качестве альтернативы ей следует упомянуть порт или пакет security/sudo. Эта утилита предоставляет журналирование активности, а также позволяет администратору указывать перечень утилит, доступных пользователю для запуска с правами суперпользователя.

### 4.3.2. Изменение учетных записей

FreeBSD располагает набором различных команд для работы с учетными записями пользователей. Таблица 4.1, <<Утилиты для управления учетными записями>> перечисляет наиболее часто используемые команды, ниже находятся примеры их использования. За исчерпывающей информацией по каждой утилите следует обратиться к соответствующим страницам справочников.

Таблица 4.1. Утилиты для управления учетными записями

Команда | Краткое описание
--- | ---
adduser(8) | Рекомендуемое приложение командной строки для добавления новых пользователей.
rmuser(8) | Рекомендуемое приложение командной строки для удаления пользователей.
chpass(1) | Гибкий инструмент для изменения информации в базе данных пользователей.
passwd(1) | Инструмент командной строки для изменения паролей пользователей.
pw(8) | Мощный и гибкий инструмент для изменения любой информации, связанной с учетными записями пользователей.

#### 4.3.2.1. `adduser`

Для добавления новых пользователей рекомендуется использовать adduser(8). При добавлении нового пользователя программа автоматически обновляет `/etc/passwd` и `/etc/group`. Она также создает домашний каталог для нового пользователя, копируя файлы настройки по умолчанию из `/usr/share/skel`, и может отправлять новому пользователю приветственное сообщение электронной почтой. Эту утилиту необходимо запускать с правами суперпользователя.

Утилита adduser(8) является интерактивной. Для создания новой учетной записи потребуется ответить на несколько вопросов. Как показано в Пример 4.2, <<Добавление пользователя в FreeBSD>>, ответом считается либо ввод необходимой информации, либо нажатие клавиши Return для принятия значения по умолчанию, которое показано в квадратных скобках. В этом примере пользователь включен в группу `wheel`, что дает возможность ему повышать привилегии до суперпользователя при помощи su(1). На последнем шаге утилита предложит создать еще одну учетную запись или завершить работу.

Пример 4.2. Добавление пользователя в FreeBSD

    # adduser
    Username: jru
    Full name: J. Random User
    Uid (Leave empty for default):
    Login group [jru]:
    Login group is jru. Invite jru into other groups? []: wheel
    Login class [default]:
    Shell (sh csh tcsh zsh nologin) [sh]: zsh
    Home directory [/home/jru]:
    Home directory permissions (Leave empty for default):
    Use password-based authentication? [yes]:
    Use an empty password? (yes/no) [no]:
    Use a random password? (yes/no) [no]:
    Enter password:
    Enter password again:
    Lock out the account after creation? [no]:
    Username   : jru
    Password   : ****
    Full Name  : J. Random User
    Uid        : 1001
    Class      :
    Groups     : jru wheel
    Home       : /home/jru
    Shell      : /usr/local/bin/zsh
    Locked     : no
    OK? (yes/no): yes
    adduser: INFO: Successfully added (jru) to the user database.
    Add another user? (yes/no): no
    Goodbye!
    #

### Примечание:

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

#### 4.3.2.2. `rmuser`

Для полного удаления пользователя из системы запустите rmuser(8) с правами суперпользователя. Эта программа выполняет следующие действия:

1. Если в crontab(1) существуют записи пользователя, то они удаляются.

2. Удаляются принадлежащие пользователю задачи at(1).

3. Уничтожаются все процессы, принадлежащие пользователю.

4. Удаляется запись пользователя из локального файла паролей.

5. Если домашний каталог принадлежит пользователю, то каталог удаляется.

6. Удаляется принадлежащая пользователю входящая почта из `/var/mail`.

7. Удаляются все файлы, принадлежащие пользователю, из каталогов с временными файлами, например из `/tmp`.

8. Наконец, в `/etc/group` из всех групп удаляется имя пользователя. Если после этого удаления группа остается пустой и имя группы совпадает с именем пользователя, она удаляется. Это необходимо для удаления пользовательских уникальных групп, создаваемых adduser(8).

rmuser(8) не может использоваться для удаления учетной записи суперпользователя, поскольку это почти всегда означает разрушение системы.

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

Пример 4.3. Интерактивное удаление учетной записи с помощью `rmuser`

    # rmuser jru
    Matching password entry:
    jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
    Is this the entry you wish to remove? y
    Remove user's home directory (/home/jru)? y
    Removing user (jru): mailspool home passwd.
    #

#### 4.3.2.3. `chpass`

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

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

### Примечание:

Если утилита не была запущена с правами суперпользователя, то после выхода из редактора будет запрошен пароль пользователя.

В Пример 4.4, <<Работа с `chpass` с правами суперпользователя>> суперпользователь, выполнив команду `chpass jru`, просматривает доступные для изменения поля. Если `jru` запустит эту команду, то лишь последние шесть строк будут доступны ему для редактирования. Это показано в Пример 4.5, <<Работа с `chpass` с правами обычного пользователя>>.

Пример 4.4. Работа с `chpass` с правами суперпользователя

    #Changing user database information for jru.
    Login: jru
    Password: *
    Uid [#]: 1001
    Gid [# or name]: 1001
    Change [month day year]:
    Expire [month day year]:
    Class:
    Home directory: /home/jru
    Shell: /usr/local/bin/zsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:

Пример 4.5. Работа с `chpass` с правами обычного пользователя

    #Changing user database information for jru.
    Shell: /usr/local/bin/zsh
    Full Name: J. Random User
    Office Location:
    Office Phone:
    Home Phone:
    Other information:

### Примечание:

chfn(1) и chsh(1) это ссылки на chpass(1), как и ypchpass(1), ypchfn(1) и ypchsh(1). Так как NIS поддерживается автоматически, указание `yp` перед командой не обязательно. Настройка NIS будет рассмотрена в Глава 25, Сетевые серверы.

#### 4.3.2.4. `passwd`

Любой пользователь может изменить собственный пароль при помощи passwd(1). Для предотвращения случайного или несанкционированного изменения, команда запрашивает текущий пароль пользователя перед установкой нового:

Пример 4.6. Изменение пароля

    % passwd
    Changing local password for jru.
    Old password:
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done

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

Пример 4.7. Изменение пароля другого пользователя суперпользователем

    # passwd jru
    Changing local password for jru.
    New password:
    Retype new password:
    passwd: updating the database...
    passwd: done

### Примечание:

Как и в случае с chpass(1), yppasswd(1) это всего лишь ссылка на passwd(1), так что NIS работает с обеими командами.

#### 4.3.2.5. `pw`

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

### 4.3.3. Ограничение пользователей

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

Дисковые квоты ограничивают объем дискового пространства, занимаемого пользователями, а также предоставляют способ быстрой проверки занимаемого объема без пересчета его каждый раз. Квоты обсуждаются в Раздел 17.15, <<Квотирование файловых систем>>.

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

Классы учетных записей определяются в `/etc/login.conf`, они детально описаны на странице справочника login.conf(5). Каждой учетной записи присвоен класс (`default` по умолчанию), и каждому классу присвоен набор характеристик. Характеристика определяется в виде пары `имя=значение`, где `имя` это определенный идентификатор, а `значение` это произвольная строка, обрабатываемая в зависимости от `имени`. Настройка классов и характеристик довольно проста, и также описана в login.conf(5).

### Примечание:

FreeBSD, как правило, не читает настройки в `/etc/login.conf` непосредственно, вместо этого она обращается к файлу базы данных `/etc/login.conf.db` для ускорения доступа к данным. Всякий раз после редактирования `/etc/login.conf` необходимо обновить `/etc/login.conf.db` при помощи следующей команды:

    # cap_mkdb /etc/login.conf

Ограничения на ресурсы отличаются от обычных характеристик: во-первых, для каждого ограничения существует <<мягкое>> (текущее) и <<жесткое>> ограничение. Мягкое ограничение может настраиваться пользователем или приложением, но не может превышать жесткое ограничение. Последнее может быть уменьшено пользователем, а увеличено - лишь суперпользователем. Во-вторых, большинство ограничений ресурсов накладываются на каждый процесс определенного пользователя, а не к пользователю вообще. Эти различия диктуются особенностями обработки ограничений, а не реализацией структуры характеристик учетных записей.

Ниже приведен список наиболее часто используемых ограничений на ресурсы. Остальные, вместе с другими характеристиками, можно найти в login.conf(5).

`coredumpsize`

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

`cputime`

  Это максимальное количество времени ЦПУ, потребляемого пользователем. Превысившие это время процессы будут уничтожены ядром.

  ### Примечание:

  Это ограничение потребляемого времени ЦПУ, а не процентов использования ЦПУ, которые отображаются в некоторых полях top(1) и ps(1).

`filesize`

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

`maxproc`

  Это максимальное число процессов , которые могут быть запущены пользователем. В это число включаются и консольные, и фоновые процессы. Это ограничение не может превышать системный лимит, указываемый через переменную sysctl(8) `kern.maxproc`. Установка слишком жестких ограничений может стать помехой работе пользователя: зачастую ему удобно входить в систему с нескольких консолей или использовать каналы. Некоторые задачи, такие как компиляция большой программы, порождают множество процессов.

`memorylocked`

  Это максимальный объем памяти , блокировка которого может быть запрошена процессом при помощи mlock(2). Некоторые критически важные для системы программы, такие как amd(8), блокируют отведенную процессу память так, что в случае <<пробуксовывания>> системы (system thrashing) они не усугубляют проблему.

`memoryuse`

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

`openfiles`

  Это максимальное количество файлов, которые могут быть открыты процессом. В FreeBSD файлы также используются для представления сокетов и каналов IPC, поэтому не устанавливайте слишком маленькое значение. Ограничение этого параметра, устанавливаемое для всей системы, определяется переменной sysctl(8) `kern.maxfiles`.

`sbsize`

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

`stacksize`

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

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

- Процессам, загружаемым при старте системы скриптами `/etc/rc` присваивается класс `daemon`.

- Хотя поставляемый с системой `/etc/login.conf` - это хороший источник корректных значений для большинства ограничений, сами ограничения могут не подходить для конкретной системы. Установка слишком слабых ограничений может повлечь злоупотребления системой, а установка слишком сильных ограничений может стать помехой производительности.

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

- Многие ограничения применяются к отдельным процессам, а не к пользователю вообще. Например, установка `openfiles` в 50 означает, что каждый процесс, запущенный пользователем, может открывать до 50 файлов. Общее количество файлов, которые могут быть открыты пользователем, вычисляется как `openfiles`, умноженное на `maxproc`. Это также применимо к потребляемой памяти.

За дальнейшей информацией по ограничениям на ресурсы, классам учетных записей и характеристикам, обращайтесь к cap_mkdb(1), getrlimit(2), и login.conf(5).

### 4.3.4. Группы

Группа это список пользователей. Группа идентифицируется по имени и GID (Group ID). В FreeBSD для определения прав процесса ядро использует UID процесса, а также список групп, которым он принадлежит. В большинстве случаев, GID пользователя означает первую группу из списка.

Имена групп связываются с GID в файле `/etc/group`. Это текстовый файл с четырьмя разделенными двоеточием полями. Первое поле это имя группы, второе это зашифрованный пароль, третье это GID, а четвертое это разделенный запятыми список членов группы. За более полным описанием синтаксиса обратитесь к group(5).

Суперпользователь может редактировать `/etc/group` при помощи текстового редактора. Как вариант, можно задействовать pw(8) для добавления и редактирования групп. Например, для добавления группы, называемой `teamtwo`, и проверки ее существования вы можете использовать:

Пример 4.8. Добавление группы с использованием pw(8)

    # pw groupadd teamtwo
    # pw groupshow teamtwo
    teamtwo:*:1100:

В этом примере число `1100` это GID группы `teamtwo`. На данный момент в `teamtwo` нет членов. Следующая команда добавит `jru` в группу `teamtwo`.

Пример 4.9. Добавление пользователей в новую группу при помощи pw(8)

    # pw groupmod teamtwo -M jru
    # pw groupshow teamtwo
    teamtwo:*:1100:jru

Аргумент к параметру `-M` это разделенный запятыми список пользователей, которые добавляются в новую (пустую) группу или заменяют существующих членов группы. Что касается пользователя - это членство в группе отличается от первичной группы пользователя, указанного в файле паролей. Это значит, что пользователь не будет показан как член группы при использовании pw(8) `groupshow`, но будет отображен при использовании id(1) или похожего инструмента. Когда программа pw(8) задействована для добавления пользователя в группу, то она работает только с файлом `/etc/group` и не ищет дополнительную информацию в файле `/etc/passwd`.

Пример 4.10. Добавление нового члена группы с использованием pw(8)

    # pw groupmod teamtwo -m db
    # pw groupshow teamtwo
    teamtwo:*:1100:jru,db

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

Пример 4.11. Использование id(1) для определения принадлежности к группам

    % id jru
    uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

В этом примере `jru` является членом групп `jru` и `teamtwo`.

За дальнейшей информацией об этой команде и о формате файла `/etc/group` обратитесь к pw(8) и group(5).

Пред. | Наверх | След.
4.2. Виртуальные консоли и терминалы | Начало | 4.4. Права доступа

Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.