Лабораторная работа "Управление пользователями" - efanov/mephi GitHub Wiki

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

Выполните все примеры и разберитесь, как они устроены.

Содержание

Общие сведения

Идентификация — это процедура распознавания пользователя по его личному идентификатору.

Аутентификация — это процедура проверки подлинности пользователя (пользователь доказывает, что он тот, за кого себя выдаёт).

Изучаемые команды и файлы

  • Команды управления пользователями и паролями пользователей: useradd, userdel, usermod, chage, passwd
  • Команды управления группами: groupadd, groupdel, groupmod
  • Команды для повышения привилегий: sudo, su
  • Конфигурационные файлы: /etc/passwd, /etc/shadow, /etc/group, /etc/default/useradd, /etc/login.defs, /etc/sudoers

Файлы

/etc/passwd

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

Формат файла представлен на рисунке:

passwd-passwd drawio

/etc/shadow

Текстовый файл /etc/shadow для управления паролями пользователей. Он принадлежит пользователю root и не доступен на чтение и запись обычным пользователям. Каждая строка этого файла соответствует одному пользователю системы и представляет собой запись, состоящую из девяти полей, разделенных двоеточием. Основная функция файла /etc/shadow – хранить хэш-суммы паролей пользователей системы. Для вычисления хэш-суммы пароля должна использоваться криптографическая хэш-функция.

Формат файла представлен на рисунке:

passwd-shadow drawio

/etc/group

Пользователи объединяются в группы для более гибкого управления доступом к файлам. Пользователь должен входить как минимум в одну группу — такую группу называют основной (primary). Также пользователь может входить в несколько дополнительных (supplementary) групп. Список групп хранится в текстовом файле /etc/group. Каждая строка этого файла описывает одну группу и представляет собой запись, состоящую из четырех полей, разделенных двоеточием.

Формат файла представлен на рисунке:

passwd-group drawio

Командный интерфейс

Рассмотрим основные команды.

useradd

Для создания пользователя предназначена команда useradd. С помощью опций команды можно явно задать каждую характеристику пользователя. Если опции не заданы, берутся значения по умолчанию из файлов /etc/default/useradd и /etc/login.defs. После создания домашней директории пользователя в нее копируется содержимое директории /etc/skel, в которую системный администратор может поместить файлы, которые по умолчанию должны присутствовать у каждого пользователя. Изучите содержимое этих конфигурационных файлов и папок самостоятельно.

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

Для модификации пользователя используется команда usermod. Ее опции в основном повторяют опции команды useradd.

Иногда пользователю требуется возможность аутентификации по паролю, но не требуется работать в командной оболочке. Например, на почтовом сервере пользователи должны иметь учетные записи, чтобы подключаться из почтовых клиентов. Тогда в качестве входной оболочки можно установить программу /sbin/nologin.

userdel

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

passwd

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

Чтобы заставить пользователя сменить пароль при следующем входе в систему, можно выполнить команду passwd -e или chage -d 0. В результате, в поле даты последнего изменения пароля будет записан 0.

Чтобы заблокировать вход пользователя в систему по паролю, можно использовать команды usermod с опцией -L или passwd с опцией -l. Для разблокировки используются флаги -U и -u соответственно.

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

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

groupadd

Перед тем, как добавить пользователя в группу, её необходимо создать. Для создания группы используется команда groupadd.

Суперпользователь

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

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

Для повышения своих привилегий используются такие программы, как sudo, su или Polkit. Команда su - <username> позволяет войти под пользователем <username>. Если имя пользователя не указано, подразумевается root:

su -

Команда sudo позволяет выполнить другую команду от лица суперпользователя или другого пользователя в зависимости от настроек в конфигурационном файле /etc/sudoers. В отличие от su, sudo требует ввода пароля текущего пользователя, а не пользователя, от лица которого запрашивается доступ:

sudo cat /etc/shadow
# [sudo] password for <username>:

Все действия с использованием sudo по умолчанию записываются в файл /var/log/secure.

Задания

Повышение привилегий

su

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

id
pwd
echo $HOME
echo $PATH

Повысьте свои привилегии, сменив пользователя на root. Снова изучите своё окружение.

su
id
pwd
echo $HOME
echo $PATH

Для выхода выполните команду exit или нажмите <Ctrl-D>.

Теперь выполните su - вместо su и проделайте всё то же самое. Что делает опция -?

sudo

Войдите в систему от лица обычного пользователя. Попробуйте вывести последние 5 строк файла /var/log/messages. Воспользуйтесь sudo, чтобы решить задачу.

Сделайте резервную копию файла /etc/motd, назовите её /etc/motdOLD. Попробуйте выполнить

sudo echo "Welcome to Linux!" >> /etc/motd

Объясните вывод. Добавьте в файл /etc/motd строку "Welcome to Linux!". Проверьте, что при входе в систему Вы получаете введённое выше сообщение. Восстановите файл /etc/motd из резервной копии.

Изучение конфигурационных файлов

/etc/passwd

В качестве примера работы с файлом /etc/passwd рассмотрим shell-скрипт, который выводит на экран информацию о пользователях, у которых в качестве оболочки установлен Bash. Для разбиения записей на отдельные поля используется тот факт, что поля разделяются символом :. Поэтому если переопределить переменную IFS (Internal Field Separator), Bash будет читать отдельные поля, как отдельные слова, разделенные символом-разделителем:

grep 'bash$' /etc/passwd |
while IFS=: read user passwd uid gid name homedir shell
do
    printf "%16s: %s\n" \
        User "$user" \
        Password "$passwd" \
        "User ID" "$uid" \
        "Group ID" "$gid" \
        Name "$name" \
        "Home directory" "$homedir" \
        Shell "$shell"
    echo
done

/etc/shadow

Предположим, что сегодня 31 января, и в системе создан пользователь, который будет работать над проектом в течение шести месяцев (180 дней). Команда date позволяет вычислить дату, которая наступит через определенное количество дней после текущего дня. Срок действия учетной записи для нового пользователя можно ограничить 180 днями. Пароль требуется менять не реже, чем каждые три месяца (90 дней). Минимальный срок действия пароля не установлен. За пять дней до обязательной смены пароля пользователю начнут выдаваться предупреждения. Если пользователь не поменяет свой пароль, то в течение 10 дней он сможет войти в систему со старым паролем и установить новый пароль. Команда chage -l выводит текущие настройки пароля пользователя.

date
# Вывод: Mon 31 Jan 2022 02:50:12 PM MSK

date -d +180days +%Y-%m-%d
# Вывод: 2022-07-30

sudo chage -E $(date -d +180days +%Y-%m-%d) ivan
# Нет вывода

sudo chage -m 0 -M 90 -W 5 -I 10 ivan
# Нет вывода

sudo chage -l ivan
# Вывод:
# Last password change                              : Jan 31, 2022
# Password expires                                  : May 01, 2022
# Password inactive                                 : May 11, 2022
# Account expires                                   : Jul 30, 2022
# Minimum number of days between password change    : 0
# Maximum number of days between password change    : 90
# Number of days of warning before password expires : 5

sudo grep ivan /etc/shadow
# Вывод: ivan:$6$ZjdXqIs4BlbjqkBs$7oRI476rdxWEr-iysR0UYScdvaLrHO2uq9msYpVxnxeO0zuaeDTvpmfedb8oLC8kDBz9FPrrzRLn70y9//f06x.:19023:0:90:5:10:19203:

Видно, что в записи для пользователя в файле /etc/shadow установлены соответствующие поля. Например, число 19023 означает количество дней с 1 января 1970 г. по 31 января 2022 г.

Создание пользователя

Вручную

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

  1. Выбрать отличительные характеристики пользователя: логическое имя, идентификатор пользователя UID, идентификатор группы пользователя GID.
  2. Создать запись в /etc/passwd.
  3. Создать запись в /etc/group.
  4. Создать домашнюю директорию пользователя по шаблону /home/<username>
  5. Скопировать в домашнюю директорию файлы, которые должны присутствовать у пользователя и, в том числе, выполняться при входе пользователя в систему.
  6. Изменить владельца и группу домашней директории со всем ее содержимым на вновь созданного пользователя и его группу. При необходимости изменить права к домашней директории.
  7. Создать запись в /etc/shadow в соответствии с политикой безопасности организации по управлению паролями (например, как часто надо пользователю менять свой пароль).
  8. Установить пользователю пароль.
Подсказка Для создания записи в /etc/shadow можно воспользоваться командой openssl passwd.

Проделайте эти шаги и создайте пользователя вручную.

С использованием командного интерфейса

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

Сравните результаты.

Удаление пользователя

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

sudo useradd old
id old
# Вывод: uid=1003(old) gid=1004(old) groups=1004(old)

ls -l /home/
# Часть вывода: drwx------. 2 old     old      62 Sep 26 20:52 old

sudo userdel old
ls -l /home
# Часть вывода: drwx------. 2    1003    1004  62 Sep 26 20:52 old

sudo useradd new
id new
# Вывод:  uid=1003(new) gid=1004(new) groups=1004(new)

ls -l /home
# Часть вывода:
# drwx------. 2 new     new      62 Sep 26 20:54 new
# drwx------. 2 new     new      62 Sep 26 20:52 old

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

При создании нового пользователя явно указывать его UID:

sudo useradd -u 1002 user2

При удалении пользователя перемещать все его файлы в специально выделенную директорию, а его домашнюю директорию удалять:

find / -user user1 -exec mv {} /new/location; 2>/dev/null
sudo userdel -r user1

Чтобы найти файлы, которые не принадлежат никакому пользователю, можно выполнить следующую команду:

find / -nouser -o -nogroup 2>/dev/null

Прикладная задача

Пусть вам необходимо

  • Создать группу consultants с GID 40000, создать в ней пользователей для Ивана, Полины и Дмитрия. Основная группа должна быть группой с именем пользователя
  • Задать каждому пользователю пароль default
  • Потребовать смены пароля пользователей каждые 30 дней, за исключением Полины — ей 15 дней
  • Аккаунты должны истечь через 90 дней
  • После первого входа пользователи должны сменить свой пароль

Решите эту задачу.

Вопросы для самоконтроля

  1. В каком файле хранятся данные о пользователях?
  2. Назовите команды для создания/удаления/изменения пользователя/группы.
  3. Как повысить свои привилегии?
  4. Какой командой пользователь может изменить свой пароль?
  5. Как добавить пользователя в ещё одну дополнительную группу?

Формат защиты работы

Защита работы проходит в формате беседы с преподавателем.

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

⚠️ **GitHub.com Fallback** ⚠️