Любая работа в Linux выполняется от имени какого-то пользователя, зарегистрированного и авторизованного в системе.
В Linux существуют три типа пользователей:
- Администраторы — привилегированные пользователи с полным доступом к системе. По умолчанию на Linux-сервере после установки операционной системы всегда есть один такой пользователь —
root
. - Локальные — непривилегированные пользователи. Их учётные записи создаёт администратор. Особенность таких аккаунтов в ограниченном доступе к серверу — они не могут пользоваться некоторыми системными утилитами, могут работать только с теми файлами и папками, к которым им открыт доступ. Тем не менее, можно повысить привилегии локального пользователя — ниже расскажем как.
- Системные — учётные записи, автоматически создаваемые системой для работы внутренних процессов и служб. Например, после установки веб-сервера Apache, который входит в состав стека LAMP, на сервере появляется пользователь
www-data
(на CentOSapache
), от имени которого потом работает веб-сервер. Такие пользователи нужны для повышения безопасности.
Каждый пользователь имеет свой уникальный идентификатор, UID
. Он отличается в зависимости от типа пользователя:
- администратор — 0
- обычный — от 100
- системный — от 1 до 100
Чтобы упростить процесс настройки прав для новых пользователей, их объединяют в группы. Каждая группа имеет свой набор прав и ограничений. Любой пользователь, создаваемый или добавляемый в такую группу, автоматически их наследует. Если при добавлении пользователя для него не указать группу, то у него будет своя, индивидуальная группа — с его именем. Один пользователь может одновременно входить в несколько групп.
Информацию о каждом пользователе сервера можно посмотреть в файле /etc/passwd
. Они в нём перечислены в следующем формате:
test-user:x:1000:1000::/home/test-user:/bin/bash
|
имя пользователя |
|
говорит о том, что пароль зашифрован (хранится в |
|
идентификатор пользователя ( |
|
тут может быть |
|
домашняя папка |
|
указывает, что пользователь имеет доступ к командной оболочке сервера |
Если вам известно имя пользователя и вы хотите узнать о нём побольше, необязательно читать /etc/passwd
. Всё то же самое в человекочитаемом виде можно посмотреть с помощью команды pinky -l
:
pinky -l test-user
Эта же команда без аргументов покажет вам всех авторизованных в текущий момент пользователей сервера, включая информацию о времени и источнике входа:
В качестве альтернативы можно использовать команду w
— она тоже показывает всех авторизованных в текущий момент пользователей, включая создаваемую ими нагрузку на сервер:
Узнать UID
можно с помощью команды id
:
id test-user
Для именования пользователей в Linux есть набор стандартных правил:
- может содержать только английские буквы
[a-z]
в верхнем и нижнем регистре, цифры, символ«_»
, тире«-»
и точку; - может оканчиваться символом
«$»
; - не может начинаться с тире, содержать только цифры или состоять из
«.»
или«..»
; - Не рекомендуется использовать точку в начале имени;
- может включать до 32 символов.
Теперь перейдём непосредственно к управлению пользователями.
- Создание пользователей
- Изменение данных
- Удаление
- Группы пользователей
- Привилегии суперпользователя. Sudo
Создание пользователей
Процесс добавления пользователя состоит из двух шагов: создание и настройка пароля.
На первом шаге используется команда useradd
c набором опций для настройки нового пользователя и его именем (логином):
useradd [как создать] [как назвать]
Эта команда имеет ряд настроек по умолчанию, которые задаются с помощью файлов /etc/default/useradd
и /etc/login.defs
Увидеть основные можно с помощью команды:
useradd -D
|
|
|
базовый каталог, в котором будет размещена директория |
|
указывает время до блокировки пользователя, когда его пароль станет недействителен. Значение |
|
дата, до которой действителен аккаунт. По умолчанию не установлена — то есть без ограничений |
|
используется для настройки доступа к командной оболочке |
|
содержит путь к директории, в которой хранятся файлы по умолчанию. После создания пользователя они будут автоматически скопированы в его домашнюю папку |
|
определяет, нужно ли создать папку для писем этого пользователя в |
Все эти настройки применяются, если использовать самый простой вариант команды создания пользователя без параметров:
useradd test-user
Но обычно нам требуется добавить пользователя со специфическими настройками — для этого используется расширенный вариант этой команды. Перечислим основные опции:
|
создаёт указанную домашнюю директорию, если она ещё не существует |
|
устанавливает |
|
добавляет комментарий |
|
указывает группу, в которую попадёт пользователь после создания. Можно использовать с |
|
указывает список дополнительных групп. Они перечисляются через запятую без пробелов |
|
позволяет настроить доступ к |
|
создаёт системного пользователя. Используется, когда вам нужно настроить службу на работу из-под конкретного пользователя. По умолчанию данные таких пользователей не вносятся в |
|
позволяет указать свой |
|
указывает дату, до которой аккаунт будет активен. Дата задаётся в формате |
|
указывает количество дней до блокировки пользователя, когда его пароль станет недействителен |
В итоге получится вот такая сборная солянка из настроек:
useradd -m -u 666 -d /home/users/test-user -c "Тестовый пользователь" -e 2060-01-01 -s /bin/bash test-user
В примере мы создаём тестового пользователя test-user
с идентификатором 666
, домашней папкой в /home/users/test-user
, комментарием «Тестовый пользователь»
и доступом к командной оболочке. Учётная запись будет действительна до конца света по Ньютону.
Более подробную информацию о доступных опциях для useradd
можно увидеть с помощью команды man useradd
.
Очень важно также настроить для пользователя надёжный пароль. Для этого нужно ввести следующую команду:
passwd test-user
Система предложит ввести и подтвердить пароль. На этом процесс создания пользователя можно считать завершённым.
Изменение данных пользователей
Смена настроек для активного пользователя может привести к сбою системы. Поэтому перед изменением данных важно убедиться, что в текущий момент редактируемый пользователь не авторизован, под ним отсутствуют запущенные процессы, редактируемые файлы. Посмотреть список запущенных процессов пользователя user
можно следующим образом:
pgrep -l -u user
Проверить, авторизован ли пользователь, можно с помощью уже известной команды:
pinky user
Отредактировать данные существующего пользователя можно с помощью команды usermod
. По структуре она похожа на предыдущую команду:
usermod [что поменять] [для какого пользователя]
Набор параметров расширен дополнительными опциями:
|
создаёт новую директорию, указанную в качестве домашней (если её не существует), и переносит туда данные из старой |
|
меняет домашнюю директорию пользователя на |
|
меняет комментарий к пользователю |
|
добавляет пользователя в дополнительные группы |
|
меняет командную оболочку пользователя |
|
изменяет |
|
меняет дату, до которой аккаунт будет активен |
|
меняет количество дней до блокировки пользователя, когда его пароль станет недействителен |
|
меняет имя пользователя на |
|
блокирует аккаунт. Для этого в файле |
|
снимает блокировку с аккаунта (удаляет символ |
То есть если мы захотим отредактировать данные пользователя test-user
, созданного в примере выше, это будет выглядеть так:
usermod -l new-test-user -m -d /home/new-test-user -c "Чак Норрис" -u 100500 -e 3000-01-01 -f -1 test-user
В примере мы меняем логин — имя на new-test-user
, изменяем домашнюю папку на /home/new-test-user
с копированием файлов, меняем комментарий, UID
, срок жизни аккаунта и отменяем блокировку в случае устаревания пароля.
При изменении данных пользователя система предпримет попытку автоматически указать новые данные для всех файлов и папок. Тем не менее, после редактирования нужно всё перепроверить и исправить права доступа, где они не изменились автоматически.
Удаление пользователей
Как и в случае с редактированием, перед удалением нужно убедиться, что под ним отсутствуют активные процессы, не редактируются файлы. Иначе существует риск сбоя системы. В программу встроен механизм защиты, поэтому она не позволит удалить пользователя, если он авторизован или под ним работают какие-то службы.
Для удаления пользователей используется команда userdel
. Её структура аналогична предыдущим:
userdel [что удаляем] [кого удаляем]
Основных параметра два:
|
удаляет папки пользователя: домашнюю директорию, почтовую очередь |
|
отключает механизм защиты. При использовании этой опции пользователь будет удалён даже при наличии запущенных процессов и пр. Используется на свой страх и риск, так как может привести к сбою системы |
После удаления пользователей важно вручную проверить, что на сервере не осталось файлов или директорий, принадлежащих удалённому пользователю.
Группы пользователей
Информация о группах хранится в файле /etc/group
. Работа с группами пользователей куда проще.
Группы применяются для делегирования прав доступа на определённые файлы, папки, скрипты сразу нескольким пользователям. Живой пример: работа с FTP-сервером. Вы выбираете какую-то директорию для работы с файлами, создаёте группу пользователей и присваиваете ей выбранную папку. Теперь вам не нужно отдельно настраивать права каждому новому пользователю — достаточно добавить его в эту группу, и он автоматически получит доступ к FTP-каталогу.
Создание
Чтобы создать группу используется команда groupadd
:
groupadd new-group
Из параметров можно выделить следующие:
|
если группа с указанным именем или GID уже существует, опция прерывает выполнение команды без соответствующей ошибки |
|
позволяет назначить свой GID для создаваемой группы |
|
создаёт системную группу |
-p p@ssw0rd |
Устанавливает для группы пароль Не рекомендуется к использованию из-за проблем с безопасностью. Настроенный таким образом пароль можно увидеть в истории команд. |
Редактирование
Для редактирования групп используется команда groupmod
. Список изменений задаётся с помощью параметров:
|
меняет |
|
меняет имя группы на |
Например, если нам нужно изменить имя группы test-group
на имя named-group
, команда будет выглядеть так:
groupmod -n named-group test-group
Удаление
Нельзя удалить группу, если она указана в качестве основной для какого-то существующего пользователя. Сначала нужно предварительно удалить этого пользователя из группы.
Само удаление группы выполняется одной командой:
groupdel test-group
Как и в случае удаления пользователей, нужно вручную проверить, что на сервере не осталось данных, принадлежащих удалённой группе.
Управление пользователями в группе
Базовым инструментом для управления группами является утилита gpasswd
. Она имеет несколько параметров, но с одной особенностью — в отличие от предыдущих примеров, здесь большинство параметров (кроме -A
и -M
) не сочетаются. То есть в команде может быть только один параметр за раз.
Структура команды проста:
gpasswd [что сделать] [в какой группе]
Рассмотрим опции команды подробнее:
|
Добавляет new-user в группу |
|
Удаляет bad-user из группы |
|
Доступна для использования привилегированным пользователям (с правами root). Назначает список пользователей-администраторов группы |
|
Доступна для использования привилегированным пользователям. Назначает список участников группы |
|
Отключает пароль группы. После этого только члены группы смогут использовать команду newgrp для подключения к группе |
|
Отключает внешний доступ к группе. После этого только члены группы смогут использовать команду newgrp для подключения к группе |
Как добавить пользователя в группу
Если нам потребуется добавить пользователя в новую группу, достаточно будет использовать следующую команду:
gpasswd -a new-user test-group
Также для добавления пользователей в новую группу используется описанная выше команда usermod
. Следующий пример добавляет пользователя test-user
в группу new-group
:
usermod -a -G new-group test-user
Или, если нужно указать группу new-group
в качестве основной группы пользователя test-user
:
usermod -g new-group test-user
Помимо этого, любой пользователь может сам авторизоваться и добавиться в новую группу с помощью команды:
newgrp new-group
Эта команда позволяет переключить группу пользователя в рамках текущей сессии, а также автоматически добавляет запрошенную группу в список групп пользователя.
Привилегии суперпользователя. Sudo
Итак, мы знаем, что на сервере есть три типа пользователей: администраторы (корневой пользователь root
), локальные (люди, которым мы предоставляем учётные записи для работы с сервером) и системные (сущности, от имени которых запускаются те или иные процессы). То есть реально для управления системой используются только первые два типа пользователей. Их основное различие — в объёме прав доступа.
По умолчанию после установки операционной системы на сервере присутствует только один пользователь — администратор root
. Он имеет полные права доступа ко всем процессам и данным сервера.
Если создать локального пользователя, по умолчанию он будет иметь доступ только к тем файлам и каталогам, которые принадлежат ему либо группе пользователей, в которую он входит. Помимо прочего, при работе в командной оболочке ему будет закрыт доступ к ряду системных инструментов, необходимых для расширенной настройки или диагностики сервера. При попытке выполнить их под непривилегированным пользователем вы будете видеть ошибки, намекающие, что для работы с этими инструментами требуются права повыше:
Тем не менее, основная часть работы с конечными данными на сервере происходит именно под локальным пользователем — например, загрузка и изменение файлов сайтов. Если вы загрузите на сервер файл под root
-ом, файл будет принадлежать ему, а не пользователю, в папку которого загружен. Соответственно, потом это может привести к ошибкам, если вручную не изменить владельца загруженного файла.
Когда вы полностью настроите ваш сервер, работа под root
-ом вообще может стать опасной. Случайная ошибка в команде на удаление папки может запросто скосить все ваши труды по разворачиванию системы. Да и в целом сам факт наличия пользователя root
на сервере при неправильном подходе к безопасности может стать фатальным — если злоумышленник получит к нему доступ, он получит неограниченный контроль над всем содержимым сервера.
С учётом всего этого при администрировании оптимальной считается следующая практика: пользователь root
как он есть отключается, а его привилегии делегируются узкому кругу локальных пользователей. Это даёт сразу несколько преимуществ:
- повышается уровень внешней безопасности (отсутствие
root
отсекает часть автоматических попыток взлома); - ограничивается объём административных прав — повышение привилегий используется для конкретных рабочих операций и действует ограниченное время.
Для делегирования прав суперпользователя локальные пользователи добавляются в специальную группу. Способ настройки отличается в зависимости от используемой операционной системы:
-
Ubuntu и Debian:
Для предоставления прав пользователи добавляются в группу
sudo
:usermod -a -G sudo test-user
-
CentOS:
Для предоставления прав пользователи добавляются в группу
wheel
:usermod -a -G wheel test-user
Можно делегировать права пользователям по отдельности — через файл /etc/sudoers
Для работы с ним нужно вызвать специальный редактор:
visudo
В этом файле можно тонко настроить объём делегируемых прав — вплоть до списка команд, которые пользователям разрешено вызывать от имени администратора.
Проверить, может ли пользователь использовать sudo
, можно с помощью команды:
sudo -l -U test-user
В примере пользователь test-user
может выполнять через sudo
любые команды (ALL:ALL
— символизирует, что команды могут исполняться от имени любых пользователей и групп, третий аргумент символизирует список доступных команд — в примере ALL
, не ограничен)
Чтобы выполнить ту или иную команду с правами суперпользователя, перед ней вызывается команда sudo
:
sudo groupadd newgroup
Для подтверждения система запросит ввести пароль текущего пользователя (символы при вводе пароля не отображаются — введите пароль «вслепую» или скопируйте и вставьте кликом правой кнопки мыши). После ввода команда будет отправлена на исполнение. Также в течение пяти следующих минут (по умолчанию) вы сможете запускать команды от имени суперпользователя без использования sudo
и повторного ввода пароля.
Количество времени, которое действуют права суперпользователя после вызова sudo
, можно изменить через настройки в /etc/sudoers
. Запрос пароля можно отключить там же.
Если вам нужно выполнить сразу несколько операций с повышенными привилегиями, можно временно войти в режим суперпользователя:
sudo -s
С управлением пользователями разобрались, идём дальше. Как было сказано выше, чтобы локальный пользователь мог начать работу на сервере, администратор (root
или пользователь c привилегиями sudo
) должен настроить права доступа к файлам и папкам, которые понадобятся этому пользователю. Рассмотрим этот вопрос подробнее.