Skip to content

Задание: разработка сценариев управления средствами безопасности

Pavel Roschin edited this page May 30, 2023 · 11 revisions

Пример, как сделать интерактивное меню в Bash.

Стандарт хорошего стиля программирования на Bash

Описание

В данной работе изучаются:

  • запрос данных, введенных пользователем с клавиатуры;
  • организация циклов и ветвлений;
  • управление средствами безопасности операционной системы.

Общие требования к разрабатываемым сценариям

Все задания необходимо выполнить по следующим правилам:

  1. Разработка ведётся на языке Bash.
  2. Сценарий должен при указании параметра --help выводить краткую справочную информацию.
  3. При запуске сценарий должен предоставлять многоуровневое интерактивное меню. Главное меню должно предоставлять возможность выхода, второстепенные меню — возможность выхода в главное меню или на уровень выше. Внутри каждого меню должна работать команда help, которая выводит справочную информацию о данном меню.
  4. Сценарий должен быть организован как бесконечный цикл (диалог с пользователем в виде вопрос-ответ). Выход из сценария осуществляется через главное меню. Меню должно быть реализовано с помощью встроенных команд select, read (интерактивный диалог командной строки).
  5. Сценарий в процессе работы должен выводить подсказки для пользователя, помогающие ему корректно работать с программой.
  6. Если ответ на запрос пользователя не помещается на экран, его нужно обернуть в команду less, позволяя тем самым листать вывод. Например, поиск файлов — вывод поиска может оказаться очень длинным, в таком случае его нужно перенаправить в less (см. man less).
  7. Сценарий должен обрабатывать аварийные ситуации, ошибки и некорректно введённые данные. Сообщения об ошибках должны выводиться в вывод ошибок (stderr). Ввод данных с пробелами или специальными символами, а также некорректных данных не должен приводить к ошибкам в программе или выводу непредусмотренных сообщений.
  8. Сценарий должен работать только от имени пользователя root, и выводить ошибку, если он был запущен с правами обычного пользователя.

Пример

Пример диалога пользователя с программой:

$ ./program.sh
Ошибка! Программу необходимо запустить с правами администратора.
$ sudo ./program.sh

С помощью данной программы вы можете управлять пользователями и группами.

Разработчик: Иванов Иван Иванович, группа К15-555

Главное меню:

1. Добавить пользователя
2. Добавить группу
3. Поиск пользователя
4. Добавить пользователя в группу
5. Справка
6. Выход

> 3

----------------------------------------------------------------------

Меню поиска пользователя:

1. Найти пользователя по UID
2. Найти UID по имени пользователя
3. Справка
4. Вернуться назад

> 1

----------------------------------------------------------------------

Поиск пользователя по UID

Введите UID пользователя:
100000

Ошибка! Пользователь с таким UID не найден.
Повторить? (y/n)
> y

----------------------------------------------------------------------

Введите UID пользователя:
> -1

Ошибка! UID должен быть неотрицательным числом.
Повторить? (y/n)
> y

Введите UID пользователя:
1005

Пользователь с таким UID не найден
Повторить? (y/n)
> y

Введите UID пользователя:
1000

Пользователь: user
Повторить? (y/n)
> n

----------------------------------------------------------------------

Главное меню:

1. Добавить пользователя
2. Добавить группу
3. Поиск пользователя
4. Добавить пользователя в группу
5. Справка
6. Выход

> 4
 1) abrt		 15) geoclue		  29) operator		   43) sstpc
 2) adm			 16) gluster		  30) pipewire		   44) sync
 3) akmods		 17) halt		  31) polkitd		   45) systemd-coredump
 4) avahi		 18) lightdm		  32) pulse		   46) systemd-network
 5) bin			 19) lp			  33) qemu		   47) systemd-oom
 6) chrony		 20) mail		  34) radvd		   48) systemd-resolve
 7) colord		 21) mosquitto		  35) root		   49) systemd-timesync
 8) daemon		 22) nginx		  36) rpc		   50) tcpdump
 9) dbus		 23) nm-fortisslvpn	  37) rpcuser		   51) test
10) dnsmasq		 24) nm-openconnect	  38) rtkit		   52) tss
11) firebird		 25) nm-openvpn		  39) saslauth		   53) unbound
12) flatpak		 26) nobody		  40) setroubleshoot	   54) vboxadd
13) ftp			 27) nvidia-persistenced  41) shutdown		   55) Справка
14) games		 28) openvpn		  42) sshd		   56) Назад

Выберите пользователя: 51
 1) abrt		 24) gluster		  47) printadmin	   70) systemd-network
 2) adm			 25) input		  48) pulse		   71) systemd-oom
 3) akmods		 26) jackuser		  49) pulse-access	   72) systemd-resolve
 4) audio		 27) kmem		  50) pulse-rt		   73) systemd-timesync
 5) avahi		 28) kvm		  51) qemu		   74) tape
 6) bin			 29) libvirt		  52) radvd		   75) tcpdump
 7) brlapi		 30) lightdm		  53) render		   76) test
 8) cdrom		 31) lock		  54) root		   77) tss
 9) chrony		 32) lp			  55) rpc		   78) tty
10) colord		 33) mail		  56) rpcuser		   79) unbound
11) daemon		 34) man		  57) rtkit		   80) users
12) dbus		 35) mem		  58) rtlsdr		   81) utempter
13) dialout		 36) mock		  59) saslauth		   82) utmp
14) dip			 37) mosquitto		  60) screen		   83) vboxsf
15) disk		 38) nginx		  61) setroubleshoot	   84) vboxusers
16) dnsmasq		 39) nm-fortisslvpn	  62) sgx		   85) video
17) docker		 40) nm-openconnect	  63) slocate		   86) wbpriv
18) firebird		 41) nm-openvpn		  64) sshd		   87) wheel
19) flatpak		 42) nobody		  65) ssh_keys		   88) Справка
20) floppy		 43) nvidia-persistenced  66) sstpc		   89) Назад
21) ftp			 44) openvpn		  67) sys
22) games		 45) pipewire		  68) systemd-coredump
23) geoclue		 46) polkitd		  69) systemd-journal

Выберите группу: 87

Пользователь test успешно добавлен в группу wheel.

Главное меню:

1. Добавить пользователя
2. Добавить группу
3. Поиск пользователя
4. Добавить пользователя в группу
5. Справка
6. Выход

> 5
...вывод документации по разделу...

> 6
...выход из программы...

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

readarray -t users < <(getent passwd | cut -d: -f 1 | sort)
users+=(Справка Назад)
select user in "${users[@]}"; do
  case $user in
    Назад) break;;
    Справка) echo "Введите число, соответствующее выбранному пользователю";;
    *)
      if [[ -z $user ]]; then
        echo "Ошибка: введите число из списка"
      else
        echo "Выбран пользователь:" "$user" "$REPLY"
        # ... do other things
        break
      fi
    ;;
  esac
done

Задания

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

  1. Управление пользователями

    1. Управление пользователями
      1. Добавить пользователя
        1. Запросить имя
        2. Вывести ошибку, если такой пользователь существует
      2. Удалить пользователя
        1. Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
          1. Удалить пользователя y/n?
          2. Удалить домашний каталог пользователя y/n?
      3. Добавить пользователя в группу
        1. Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
        2. Вывести пронумерованный список доступных групп, запросить имя или порядковый номер (должен работать любой вариант)
  2. Управление паролями и блокировка

    1. Блокировка пользователя (запрет на вход в систему)
      1. Вывести пронумерованный список доступных имён пользователей, отметить заблокированных пользователей символом Х (заблокирован)
      2. Запросить имя или порядковый номер (должен работать любой вариант)
      3. Заблокировать этого пользователя. Если пользователь заблокирован - разблокировать
    2. Смена пароля пользователя
      1. Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
      2. Сменить пароль
  3. Управление группами

    1. Отображение списка групп и входящих в группу пользователей
    2. Добавить группу
    3. Удалить группу
    4. Изменить состав группы
      1. Добавить пользователя в группу
      2. Удалить пользователя из группы
  4. Поиск пользователей или групп

    1. Найти пользователя
      1. Запросить имя пользователя или часть имени
      2. Вывести имя, UID, персональную информацию для каждого пользователя, совпадающего с ключевым словом
    2. Найти группу
      1. Запросить имя группы или часть имени
      2. Вывести имя группы, GID, список пользователей, входящих в эту группу
  5. Управление безопасностью файлов и каталогов

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

      1. Изменить права доступа для:

        1. Владельца

          1. Добавить право записи
          2. Убрать право записи
          3. Добавить право чтения
          4. Удалить право чтения
          5. Добавить право исполнения
          6. Удалить право исполнения
          7. Добавить бит SUID
          8. Удалить бит SUID
        2. Группы (аналогичное подменю, как для владельца)

        3. Остальных (аналогичное подменю)

        4. Все из вышеперечисленного (аналогичное подменю)

      2. Изменить владельца и группу файла

        1. Запросить имя нового владельца
        2. Запросить имя новой группы
  6. Управление ACL для файлов и каталогов

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

      1. Изменить ACL права файла:

        1. Добавить запись

          1. Пользователь или группа
          2. Права доступа
        2. Удалить запись

          1. Пользователь или группа
        3. Изменить запись

          1. Пользователь или группа
          2. Отобразить старые права доступа
          3. Запросить права доступа
    2. Поиск файлов, доступных всем пользователям на запись

      1. Найти файлы, доступные на запись всем (world writeable files) и вывести их список на экран
  7. Управление системными службами и журналами (systemctl, journalctl)

    1. Поиск системных служб

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

    3. Управление службами

      1. Вывести пронумерованный список доступных служб, над выбранной службой организовать выполнение действий:

        1. Включить службу
        2. Отключить службу
        3. Запустить/перезапустить службу
        4. Остановить службу
        5. Вывести содержимое юнита службы
        6. Отредактировать юнит службы
    4. Поиск событий в журнале

      1. Ввести имя службы (оставить пустым — любая служба)
      2. Степень важности (см. man journalctl)
      3. Строка поиска
  8. Управление входом в систему (PAM)

    1. Настройка срока действия паролей пользователей

      1. Восстановить значение по умолчанию

      2. Установить бессрочный срок действия паролей

      3. Изменить срок действия паролей пользователя

        1. Вывести на экран текущее значение
        2. Запросить срок действия пароля в сутках
    2. Настройка сложности (длины) паролей пользователей

      1. Восстановить значение по умолчанию

      2. Изменить сложность паролей пользователей

        1. Вывести на экран текущее значение
        2. Запросить сложность пароля (минимально допустимое количество символов пароля)
    3. Настройка количества неверных попыток входа, после чего сеанс запроса пароля должен быть прерван

      1. Восстановить значение по умолчанию

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

        1. Вывести на экран текущее значение
        2. Запросить количество попыток
    4. Настройка количества неверных попыток входа, после чего пользователь будет заблокирован

      1. Восстановить значение по умолчанию

      2. Установить неограниченное количество попыток входа

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

        1. Вывести на экран текущее значение
        2. Запросить количество попыток
  9. Управление файловыми системами (монтирование и отмонтирование)

    1. Вывести таблицу файловых систем (в таблице обязательно должны присутствовать поля: пусть до устройства, тип файловой системы, точка монтирования). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).

    2. Монтировать файловую систему

      1. Запросить путь до устройства или файла. Если указан файл - монтировать файловую систему в режиме loopback.
      2. Запросить каталог монтирования. Если каталог отсутствует, его нужно создать. Если каталог существует, нужно проверить, что он пустой.
    3. Отмонтировать файловую систему

      1. Вывести пронумерованный список разделов и предложить выбрать один из вариантов или ввести путь самостоятельно (должны работать оба варианта). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
      2. Отмонтировать выбранную файловую систему
    4. Изменить параметры монтирования примонтированной файловой системы

      1. Запросить примонтированную файловую систему (выбрать из нескольких вариантов). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).

        1. Перевести файловую систему в режим «только чтение»
        2. Перевести файловую систему в режим «чтение и запись»
    5. Вывести параметры монтирования примонтированной файловой системы

      1. Запросить примонтированную файловую систему (выбрать из нескольких вариантов). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
      2. Вывести параметры монтирования.
    6. Вывести детальную информацию о файловой системе ext*

      1. Запросить файловую систему (выбрать из нескольких вариантов). Из списка исключить все файловые системы, которые не относятся к семейству ext*.
      2. Вывести подробную информацию о файловой системе: UUID, свойства, кол-во инодов, блоков, кол-во свободных инодов и т.п.
  10. Управление сетевыми файловыми системами (монтирование и отмонтирование)

    1. Отмонтировать сетевую файловую систему

      1. Вывести пронумерованный список точек монтирования, связанных только с сетевыми файловыми системами.
      2. Отмонтировать выбранную файловую систему
    2. Монтировать сетевую файловую систему

      1. Запросить тип сетевой файловой системы: <span lang="en-US">Samba или <span lang="en-US">NFS
      2. Запросить имя узла
      3. Запросить общий каталог на узле (выбор из нескольких вариантов)
      4. Запросить каталог монтирования на локальной файловой системе, если каталог отсутствует – создать его.
    3. Изменить параметры монтирования примонтированной сетевой файловой системы

      1. Запросить примонтированную сетевую файловую систему (выбрать из нескольких вариантов, в списке должны быть только сетевые файловые системы)

        1. Перевести файловую систему в режим «только чтение»
        2. Перевести файловую систему в режим «чтение и запись»
  11. Управление RPM-пакетами и репозиториями

    1. Поиск пакета по ключевому слову

    2. Установить пакет

      1. Ввести имя или выбрать из списка доступных для установки
    3. Удалить пакет

      1. Ввести имя или выбрать из списка установленных
    4. Настройка репозиториев

      1. Добавить новый репозиторий

        1. Запросить имя репозитория
        2. Запросить путь до репозитория
      2. Отключить репозиторий

        1. Отобразить список доступных включённых репозиториев и предложить один из вариантов
      3. Включить репозиторий

        1. Отобразить список доступных отключённых репозиториев и предложить один из вариантов
    5. Управление ключами

      1. Ручной импорт ключа репозитория

      2. Автоматический импорт ключа репозитория

      3. Вывод списка установленных в систему ключей

      4. Удаление ключа репозитория из системы (отзыв)

      5. Управление проверкой цифровой подписи пакетов

        1. Отключить проверку ключа

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

          1. Выбрать репозиторий из списка репозиториев, для которых не осуществляется проверка цифровой подписи и включить для него проверку цифровой подписи
  12. Управление событиями безопасности (аудит)man ausearch, aureport, audit.rules

    1. Поиск событий аудита

      1. Запросить тип события (вывести для примера несколько типовых событий аудита)
      2. Запросить имя пользователя (можно оставлять пустым)
      3. Запросить строку поиска
    2. Отчёты аудита (отчёты должны генерироваться за периоды: 1 день, неделя, месяц, год, см. man aureport)

      1. Отчёт входе пользователей в систему (успешные и неуспешные попытки входа в систему – дата и время, имя пользователя, терминал и успешность попытки входа)
      2. Отчёт о нарушениях (все события, завершившиеся неудачей – дата и время события, тип события, пользователь, краткие сведения о событии)
    3. Настройка подсистемы аудита для наблюдения за файлами

      1. Добавить каталог или файл в список наблюдения
      2. Удалить каталог из списка наблюдения
      3. Вывести отчёт по наблюдению за каталогом (время и дата, действие, пользователь, осуществивший это действие)
  13. Управление SELinux

    1. Управление портами

      1. Изменить существующий порт службы

        1. Запросить имя службы
        2. Вывести список портов службы и предложить выбрать один из них
        3. Запросить новый номер порта службы
      2. Добавить новый порт для службы

        1. Запросить имя службы
        2. Запросить новый номер порта службы
    2. Управление файлами

      1. Переразметка каталога (рекурсивно) – см. restorecon

      2. Запустить полную переразметку файловой системы при перезагрузке

      3. Изменить домен файла или каталога (рекурсивно)

        1. Запросить путь (должно работать автодополнение путей)
        2. Запросить новый домен
    3. Управление переключателями

      1. Вывести список переключателей с описанием и состоянием

      2. Изменить переключатель

        1. Запросить имя переключателя

        2. Вывести текущее состояние

          1. Включить? (если выключен)
          2. Выключить? (если включён)
Clone this wiki locally