Работа с пользователями в Linux
Last updated
Last updated
Рассмотрим основные моменты, касающиеся работы с пользователями в системах Linux
Любая работа в Linux выполняется от имени какого-то пользователя, зарегистрированного и авторизованного в системе.
В Linux существуют три типа пользователей:
Администраторы — привилегированные пользователи с полным доступом к системе. По умолчанию на Linux-сервере после установки операционной системы всегда есть один такой пользователь — root
.
Локальные пользователи — непривилегированные пользователи. Их учётные записи создаёт администратор. Особенность таких аккаунтов в ограниченном доступе к серверу — они не могут пользоваться некоторыми системными утилитами, могут работать только с теми файлами и папками, к которым им открыт доступ. Тем не менее, можно повысить привилегии локального пользователя — ниже расскажем как.
Системные пользователи — учётные записи, автоматически создаваемые системой для работы внутренних процессов и служб. Например, после установки веб-сервера Apache, который входит в состав стека LAMP, на сервере появляется пользователь www-data
(на CentOS apache
), от имени которого потом работает веб-сервер. Такие пользователи нужны для повышения безопасности.
Каждый пользователь имеет свой уникальный идентификатор пользователя, UID
. Он отличается в зависимости от типа пользователя:
администратор — 0
обычный пользователь — от 100
системный пользователь — от 1 до 100
Чтобы упростить процесс настройки прав для новых пользователей, их объединяют в группы. Каждая группа имеет свой набор прав и ограничений. Любой пользователь, создаваемый или добавляемый в такую группу, автоматически их наследует. Если при добавлении пользователя для него не указать группу, то у него будет своя, индивидуальная группа — с именем пользователя. Один пользователь может одновременно входить в несколько групп.
Информацию о каждом пользователе сервера можно посмотреть в файле /etc/passwd
. Пользователи в нём перечислены в следующем формате:
Для отображения только учетных записей пользователей можно ввести команду:
users
Если вам известно имя пользователя и вы хотите узнать о нём побольше, необязательно читать /etc/passwd
. Всё то же самое в человекочитаемом виде можно посмотреть с помощью команды pinky -l
:
Эта же команда без аргументов покажет вам всех авторизованных в текущий момент пользователей сервера, включая информацию о времени и источнике входа:
В качестве альтернативы можно использовать команду w
— она тоже показывает всех авторизованных в текущий момент пользователей, включая создаваемую ими нагрузку на сервер:
Узнать UID
пользователя можно с помощью команды id
:
Мы должны увидеть что-то на подобие:
uid=1001(username) gid=1001(username) groups=1001(username),27(sudo)
* учетная запись username существует, она находится в основной группе username и дополнительной sudo. Ее идентификатор 1001.
Также мы можем получить строку о пользователе из файла /etc/passwd:
getent passwd username
Мы увидим что-то такое:
username:x:1001:1001::/home/username:/bin/sh
* наш пользователь username имеет идентификатор пользователя и группы 1001, его домашняя директория /home/username, командная оболочка /bin/sh.
Для именования пользователей в Linux есть набор стандартных правил:
Имя пользователя может содержать только английские буквы [a-z]
в верхнем и нижнем регистре, цифры, символ «_»
, тире «-»
и точку;
Имя пользователя может оканчиваться символом «$»
;
Имя пользователя не может начинаться с тире, содержать только цифры или состоять из «.»
или «..»
;
Не рекомендуется использовать точку в начале имени пользователя;
Имя пользователя может включать до 32 символов.
Теперь перейдём непосредственно к управлению пользователями.
Процесс добавления пользователя состоит из двух шагов: создания пользователя и настройки пароля.
На первом шаге используется команда useradd
c набором опций для настройки нового пользователя и его именем (логином):
* опции не являются обязательными при создании пользователя.
Эта команда имеет ряд настроек по умолчанию, которые задаются с помощью файлов /etc/default/useradd
и /etc/login.defs
Увидеть основные можно с помощью команды:
Все эти настройки применяются, если использовать самый простой вариант команды создания пользователя без параметров:
Но обычно нам требуется добавить пользователя со специфическими настройками — для этого используется расширенный вариант этой команды. Перечислим основные опции:
В итоге получится вот такая сборная солянка из настроек:
В примере мы создаём тестового пользователя test-user
с идентификатором 666
, домашней папкой в /home/users/test-user
, комментарием «Тестовый пользователь»
и доступом к командной оболочке. Учётная запись будет действительна до конца света по Ньютону.
Более подробную информацию о доступных опциях для useradd
можно увидеть с помощью команды man useradd
.
Очень важно после создания пользователя настроить для него надёжный пароль. Для этого нужно ввести следующую команду:
Система предложит ввести и подтвердить пароль. На этом процесс создания пользователя можно считать завершённым.
Смена настроек для активного пользователя может привести к сбою системы. Поэтому перед изменением данных важно убедиться, что в текущий момент редактируемый пользователь не авторизован, под ним отсутствуют запущенные процессы, редактируемые файлы. Посмотреть список запущенных процессов пользователя user
можно следующим образом:
Проверить, авторизован ли пользователь, можно с помощью уже известной команды:
Отредактировать данные существующего пользователя можно с помощью команды usermod
. По структуре она похожа на предыдущую команду:
Набор параметров расширен дополнительными опциями:
То есть если мы захотим отредактировать данные пользователя test-user
, созданного в примере выше, это будет выглядеть так:
В примере мы меняем логин — имя пользователя на new-test-user
, изменяем домашнюю папку на /home/new-test-user
с копированием файлов, меняем комментарий, UID
пользователя, срок жизни аккаунта и отменяем блокировку в случае устаревания пароля.
При изменении данных пользователя система предпримет попытку автоматически указать новые данные для всех файлов и папок пользователя. Тем не менее, после редактирования нужно всё перепроверить и исправить права доступа, где они не изменились автоматически.
Как и в случае с редактированием, перед удалением пользователя нужно убедиться, что под ним отсутствуют активные процессы, не редактируются файлы. Иначе существует риск сбоя системы. В программу встроен механизм защиты, поэтому она не позволит удалить пользователя, если он авторизован или под ним работают какие-то службы.
Для удаления пользователей используется команда userdel
. Её структура аналогична предыдущим:
Основных параметра два:
После удаления пользователей важно вручную проверить, что на сервере не осталось файлов или директорий, принадлежащих удалённому пользователю.
man userdel
Информация о группах хранится в файле /etc/group
. Работа с группами пользователей куда проще.
Группы применяются для делегирования прав доступа на определённые файлы, папки, скрипты сразу нескольким пользователям. Живой пример: работа с FTP-сервером. Вы выбираете какую-то директорию для работы с файлами, создаёте группу пользователей и присваиваете ей выбранную папку. Теперь вам не нужно отдельно настраивать права каждому новому пользователю — достаточно добавить его в эту группу, и он автоматически получит доступ к FTP-каталогу.
1. Можно заблокировать пользователя, не удаляя его из системы:
usermod -L <имя пользователя>
Пример:
usermod -L test-user
Чтобы разблокировать пользователя, вводим:
usermod -U <имя пользователя>
2. В некоторых системах Linux может использоваться pam-модуль tally. Он осуществляет подсчет количества неудачных попыток входа в систему. Также он может блокировать доступ при превышении данного количества.
Чтобы посмотреть счетчик для пользователя, вводим команду:
pam_tally2 --user=admin
В версия постарее:
pam_tally --user=admin
Для сброса счетчика (и блокировки, если она есть) вводим:
pam_tally2 --user=admin --reset
Для создания групп используется команда groupadd
:
Из параметров можно выделить следующие:
Для редактирования групп используется команда groupmod
. Список изменений задаётся с помощью параметров:
Например, если нам нужно изменить имя группы test-group
на имя named-group
, команда будет выглядеть так:
Нельзя удалить группу, если она указана в качестве основной для какого-то существующего пользователя. Сначала нужно предварительно удалить этого пользователя из группы.
Само удаление группы выполняется одной командой:
Как и в случае удаления пользователей, нужно вручную проверить, что на сервере не осталось данных, принадлежащих удалённой группе.
Базовым инструментом для управления группами является утилита gpasswd
. Она имеет несколько параметров, но с одной особенностью — в отличие от предыдущих примеров, здесь большинство параметров (кроме -A
и -M
) не сочетаются. То есть в команде может быть только один параметр за раз.
Структура команды проста:
Рассмотрим опции команды подробнее:
То есть если нам потребуется добавить пользователя в новую группу, достаточно будет использовать следующую команду:
Также для добавления пользователей в новую группу используется описанная выше команда usermod
. Следующий пример добавляет пользователя test-user
в группу new-group
:
Или, если нужно указать группу new-group
в качестве основной группы пользователя test-user
:
Помимо этого, любой пользователь может сам авторизоваться и добавиться в новую группу с помощью команды:
Эта команда позволяет переключить группу пользователя в рамках текущей сессии, а также автоматически добавляет запрошенную группу в список групп пользователя.
Для определения в каких группах состоит пользователь, необходимо воспользоваться командой groups:
Из этого примера видно, что пользователь user состоит в группах user, adm, cdrom, sudo, dip, plugdev, lxd, lpadmin, sambashare. Если вы хотите посмотреть, в каких группах состоит другой пользователь, то передайте его имя в качестве аргумента.
Посмотреть список пользователей можно в файле /etc/passwd:
cat /etc/passwd
Мы увидим что-то на подобие:
Как правило, большая часть данных пользователей является системными — их UID меньше 1000 и больше 60000.
Более функциональная команда для отображения содержимого файла passwd — getent:
getent passwd
Можно найти пользователя по идентификатору:
getent passwd 1000
Получить список не системных пользователей:
getent passwd {1000..60000}
Получить только список логинов не системных учетных записей:
getent passwd {1000..60000} | awk -F: '{ print $1}'
Рассмотрим несколько утилит, с помощью которых можно управлять учетными записями в Linux.
1. Создать пользователя, добавить его в группу и создать домашнюю директорию:
useradd test-user -G printer -m
2. Создать учетную запись с возможностью получения привилегий суперпользователя (командой sudo su):
useradd test-user -G wheel -m
* для систем RPM.
useradd test-user -G sudo -m
* для систем DEB.
3. Создать пользователя с определенными UID и GID (соответственно идентификаторы пользователя и группы):
useradd test-user -u 900 -g 950
* группа с используемым идентификатором (в данном примере 950) уже должна быть создана заранее с использованием команды groupadd.
4. Создать пользователя и указать путь к домашней директории:
useradd test-user -d /home/newdmosk
5. Создать учетную запись без возможности входа в систему:
useradd test-user -s /sbin/nologin
1. Потребовать сменить пароль при следующем входе в систему:
chage -d 0 test-user
2. Поменять пользователю основную группу:
usermod test-user -g kdonewgroup
3. Задать пользователю дополнительную группу с правами root:
usermod test-user -G sudo
4. Добавить пользователя в группу:
usermod -a -G group test-user
* в данном примере мы добавим пользователя dmosk в группу group.
5. Сменить домашнюю директорию:
usermod -d /var/www/dmosk test-user
* данной командой мы меняем для пользователя dmosk домашнюю директорию на /var/www/dmosk.
1. Автоматическая блокировка учетной записи:
chage -E 2023-05-01 test-user
* данной командой мы указали, что учетная запись test-user перестанет действовать после 1 мая 2023 года.
Чтобы посмотреть информацию о дате окончания срока действия учетной записи вводим:
chage -l test-user
Сделать учетную запись бессрочной:
chage -E -1 test-user
При попытке получить привилегии командой:
sudo su
... система возвращает ошибку:
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
Причина: эта ошибка возникает, когда утилита sudo не имеет правильных прав доступа на вашей системе. В частности, она происходит, когда владелец файла /usr/bin/sudo не является пользователем root или когда установлен неправильный бит setuid на файле.
Решение: убедитесь, что вы вошли в систему с учетной записью, имеющей права администратора. Это можно сделать, войдя напрямую под пользователем root.
Выполняем команду, чтобы проверить права файла sudo:
ls -l /usr/bin/sudo
Если владелец не является пользователем root, выполните следующую команду, чтобы изменить владельца файла:
chown root:root /usr/bin/sudo
Убедитесь, что установлен правильный бит setuid на файле sudo, выполнив следующую команду:
chmod u+s /usr/bin/sudo
С управлением пользователями разобрались, идём дальше. Как было сказано выше, чтобы локальный пользователь мог начать работу на сервере, администратор (root
или пользователь c привилегиями sudo
) должен настроить права доступа к файлам и папкам, которые понадобятся этому пользователю.
GROUP
GID
группы, в которую пользователь будет добавлен после создания
HOME
базовый каталог, в котором будет размещена директория пользователя
INACTIVE
указывает время до блокировки пользователя, когда его пароль станет недействителен. Значение «-1»
отключает опцию
EXPIRE
дата, до которой действителен аккаунт. По умолчанию не установлена — то есть без ограничений
SHELL
используется для настройки доступа к командной оболочке
SKEL
содержит путь к директории, в которой хранятся файлы по умолчанию. После создания пользователя они будут автоматически скопированы в его домашнюю папку
CREATE_MAIL_SPOOL
определяет, нужно ли создать папку для писем этого пользователя в /var/spool/mail/
-m
создаёт указанную домашнюю директорию, если она ещё не существует
-d /home/test-user
устанавливает /home/test-user
в качестве домашней директории
-c "Евграф Шматкунос"
добавляет комментарий. Например, с именем пользователя
-g test
указывает группу, в которую попадёт пользователь после создания. Можно использовать с GID
или именем группы. Указанная группа должна существовать. Используется в сочетании с ключом -N
(отменяет автоматическое создание группы с именем пользователя)
-G users,wheel
указывает список дополнительных групп пользователя. Они перечисляются через запятую без пробелов
-s /bin/bash
позволяет настроить доступ к shell
-r
создаёт системного пользователя. Используется, когда вам нужно настроить службу на работу из-под конкретного пользователя. По умолчанию данные таких пользователей не вносятся в /etc/shadow
, для них не создаётся домашняя папка
-u
позволяет указать свой UID
, который будет присвоен новому пользователю. В качестве UID
указывается положительное целое число. UID
должен быть уникален
-e 2021-01-01
указывает дату, до которой аккаунт будет активен. Дата задаётся в формате YYYY-MM-DD
-f 3
указывает количество дней до блокировки пользователя, когда его пароль станет недействителен
-b
Задает базовый каталог для домашнего каталога useradd test-user -b /var/home
-D
Позволяет показать или изменить настройки по умолчанию, которые будут применяться при последующем создании пользователей useradd test-user -Ds /bin/bash
-k
Путь к источнику скелета (файлы с шаблонами для нового пользователя) useradd test-user -k /var/skel
-M
Не создавать домашний каталог useradd test-user -M
-N
Не создавать основную группу с таким же именем, как у пользователя useradd test-user -N
-o
Разрешает создание учетной записи с повторяющимся UID useradd test-user -u 15 -o
-p
Задает пароль useradd test-user -p pass
-R
Каталог, в который выполняется chroot useradd test-user -R /var/chroot/home
-U
Имя группы будет таким же, как у пользователя useradd test-user -U
-m
создаёт новую директорию, указанную в качестве домашней (если её не существует), и переносит туда данные из старой
-d /home/users/new-test-user
меняет домашнюю директорию пользователя на /home/users/new-test-user
-c "Чак Норрис"
меняет комментарий к пользователю
-a -G users,wheel,sudo
добавляет пользователя в дополнительные группы
-s /bin/bash
меняет командную оболочку пользователя
-u 100500
изменяет UID
пользователя
-e 2060-01-01
меняет дату, до которой аккаунт будет активен
-f 7
меняет количество дней до блокировки пользователя, когда его пароль станет недействителен
-l new-test-user
меняет имя пользователя на new-test-user
-L
блокирует аккаунт пользователя. Для этого в файле /etc/shadow
перед хэшем пароля пользователя ставится символ «!»
-U
снимает блокировку с аккаунта (удаляет символ «!»
из пароля в /etc/shadow
)
-r
удаляет папки пользователя: домашнюю директорию, почтовую очередь
-f
отключает механизм защиты. При использовании этой опции пользователь будет удалён даже при наличии запущенных процессов и пр. Используется на свой страх и риск, так как может привести к сбою системы
-f
если группа с указанным именем или GID уже существует, опция прерывает выполнение команды без соответствующей ошибки
-g 100500
позволяет назначить свой GID для создаваемой группы
-r
создаёт системную группу
-p p@ssw0rd
Устанавливает для группы пароль p@ssw0rd
. Пароль запрашивается системой при попытке входа в группу с помощью команды newgrp
.
Не рекомендуется к использованию из-за проблем с безопасностью. Настроенный таким образом пароль можно увидеть в истории команд.
-g 100500
меняет GID
группы на 100500
-n another-name
меняет имя группы на another-name
-a new-user
Добавляет пользователя new-user в группу
-d bad-user
Удаляет пользователя bad-user из группы
-A user1,user2,...
Доступна для использования привилегированным пользователям (с правами root). Назначает список пользователей-администраторов группы
-M user1,user2,...
Доступна для использования привилегированным пользователям. Назначает список участников группы
-r
Отключает пароль группы. После этого только члены группы смогут использовать команду newgrp для подключения к группе
-R
Отключает внешний доступ к группе. После этого только члены группы смогут использовать команду newgrp для подключения к группе