Работа с пользователями в Linux

Рассмотрим основные моменты, касающиеся работы с пользователями в системах Linux

Любая работа в Linux выполняется от имени какого-то пользователя, зарегистрированного и авторизованного в системе.

В Linux существуют три типа пользователей:

  • Администраторы — привилегированные пользователи с полным доступом к системе. По умолчанию на Linux-сервере после установки операционной системы всегда есть один такой пользователь — root.

  • Локальные пользователи — непривилегированные пользователи. Их учётные записи создаёт администратор. Особенность таких аккаунтов в ограниченном доступе к серверу — они не могут пользоваться некоторыми системными утилитами, могут работать только с теми файлами и папками, к которым им открыт доступ. Тем не менее, можно повысить привилегии локального пользователя — ниже расскажем как.

  • Системные пользователи — учётные записи, автоматически создаваемые системой для работы внутренних процессов и служб. Например, после установки веб-сервера Apache, который входит в состав стека LAMP, на сервере появляется пользователь www-data (на CentOS apache), от имени которого потом работает веб-сервер. Такие пользователи нужны для повышения безопасности.

Каждый пользователь имеет свой уникальный идентификатор пользователя, UID. Он отличается в зависимости от типа пользователя:

  • администратор — 0

  • обычный пользователь — от 100

  • системный пользователь — от 1 до 100

Чтобы упростить процесс настройки прав для новых пользователей, их объединяют в группы. Каждая группа имеет свой набор прав и ограничений. Любой пользователь, создаваемый или добавляемый в такую группу, автоматически их наследует. Если при добавлении пользователя для него не указать группу, то у него будет своя, индивидуальная группа — с именем пользователя. Один пользователь может одновременно входить в несколько групп.

Информацию о каждом пользователе сервера можно посмотреть в файле /etc/passwd. Пользователи в нём перечислены в следующем формате:

test-user:x:1000:1000::/home/test-user:/n/bash

Для отображения только учетных записей пользователей можно ввести команду:

users

Если вам известно имя пользователя и вы хотите узнать о нём побольше, необязательно читать /etc/passwd. Всё то же самое в человекочитаемом виде можно посмотреть с помощью команды pinky -l :

pinky -l test-user

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

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

Узнать UID пользователя можно с помощью команды id :

id test-user

Мы должны увидеть что-то на подобие:

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 набором опций для настройки нового пользователя и его именем (логином):

useradd <имя пользователя> [опции]

* опции не являются обязательными при создании пользователя.

Эта команда имеет ряд настроек по умолчанию, которые задаются с помощью файлов /etc/default/useradd и /etc/login.defs Увидеть основные можно с помощью команды:

useradd -D

GROUP

GID группы, в которую пользователь будет добавлен после создания

HOME

базовый каталог, в котором будет размещена директория пользователя

INACTIVE

указывает время до блокировки пользователя, когда его пароль станет недействителен. Значение «-1» отключает опцию

EXPIRE

дата, до которой действителен аккаунт. По умолчанию не установлена — то есть без ограничений

SHELL

используется для настройки доступа к командной оболочке

SKEL

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

CREATE_MAIL_SPOOL

определяет, нужно ли создать папку для писем этого пользователя в /var/spool/mail/

Все эти настройки применяются, если использовать самый простой вариант команды создания пользователя без параметров:

useradd test-user

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

-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

В итоге получится вот такая сборная солянка из настроек:

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 <имя пользователя> [опции]

Набор параметров расширен дополнительными опциями:

-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)

То есть если мы захотим отредактировать данные пользователя 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 <имя пользователя> [опции]

Основных параметра два:

-r

удаляет папки пользователя: домашнюю директорию, почтовую очередь

-f

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

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

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:

groupadd new-group

Из параметров можно выделить следующие:

-f

если группа с указанным именем или GID уже существует, опция прерывает выполнение команды без соответствующей ошибки

-g 100500

позволяет назначить свой GID для создаваемой группы

-r

создаёт системную группу

-p p@ssw0rd

Устанавливает для группы пароль p@ssw0rd. Пароль запрашивается системой при попытке входа в группу с помощью команды newgrp.

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

Редактирование

Для редактирования групп используется команда groupmod. Список изменений задаётся с помощью параметров:

-g 100500

меняет GID группы на 100500

-n another-name

меняет имя группы на another-name

Например, если нам нужно изменить имя группы test-group на имя named-group, команда будет выглядеть так:

groupmod -n named-group test-group

Удаление

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

Само удаление группы выполняется одной командой:

groupdel test-group

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

Управление пользователями в группе

Базовым инструментом для управления группами является утилита gpasswd. Она имеет несколько параметров, но с одной особенностью — в отличие от предыдущих примеров, здесь большинство параметров (кроме -A и -M) не сочетаются. То есть в команде может быть только один параметр за раз.

Структура команды проста:

gpasswd [что сделать] [в какой группе]

Рассмотрим опции команды подробнее:

-a new-user

Добавляет пользователя new-user в группу

-d bad-user

Удаляет пользователя bad-user из группы

-A user1,user2,...

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

-M user1,user2,...

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

-r

Отключает пароль группы. После этого только члены группы смогут использовать команду newgrp для подключения к группе

-R

Отключает внешний доступ к группе. После этого только члены группы смогут использовать команду 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

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

Для определения в каких группах состоит пользователь, необходимо воспользоваться командой groups:

user@ubuntu:~$ groups
user adm cdrom sudo dip plugdev lxd lpadmin sambashare

Из этого примера видно, что пользователь user состоит в группах user, adm, cdrom, sudo, dip, plugdev, lxd, lpadmin, sambashare. Если вы хотите посмотреть, в каких группах состоит другой пользователь, то передайте его имя в качестве аргумента.

user@ubuntu:~$ groups root
root : root

Привилегии суперпользователя. Sudo

pageРедактирование файла Sudoers

Список пользователей

Посмотреть список пользователей можно в файле /etc/passwd:

cat /etc/passwd

Мы увидим что-то на подобие:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
...

Как правило, большая часть данных пользователей является системными — их UID меньше 1000 и больше 60000.

Более функциональная команда для отображения содержимого файла passwd — getent:

getent passwd

Можно найти пользователя по идентификатору:

getent passwd 1000

Получить список не системных пользователей:

getent passwd {1000..60000}

Получить только список логинов не системных учетных записей:

getent passwd {1000..60000} | awk -F: '{ print $1}'

Примеры работы с учетными записями

Рассмотрим несколько утилит, с помощью которых можно управлять учетными записями в Linux.

useradd

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

usermod

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.

chage

1. Автоматическая блокировка учетной записи:

chage -E 2023-05-01 test-user

* данной командой мы указали, что учетная запись test-user перестанет действовать после 1 мая 2023 года.

Чтобы посмотреть информацию о дате окончания срока действия учетной записи вводим:

chage -l test-user

Сделать учетную запись бессрочной:

chage -E -1 test-user

Возможные ошибки

sudo must be owned by uid 0 and have the setuid bit set

При попытке получить привилегии командой:

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) должен настроить права доступа к файлам и папкам, которые понадобятся этому пользователю.

Доп. команды

whoami #показать имя текущего пользователя
who #показать кто сейчас в системе 
w #показать кто сейчас в системе и что делает
last #показать последние логины

Last updated