Задание: разработка сценариев управления средствами безопасности - efanov/mephi GitHub Wiki
Пример, как сделать интерактивное меню в Bash.
Стандарт хорошего стиля программирования на Bash
Описание
В данной работе изучаются:
- запрос данных, введенных пользователем с клавиатуры;
- организация циклов и ветвлений;
- управление средствами безопасности операционной системы.
Общие требования к разрабатываемым сценариям
Все задания необходимо выполнить по следующим правилам:
- Разработка ведётся на языке Bash.
- Сценарий должен при указании параметра --help выводить краткую справочную информацию.
- При запуске сценарий должен предоставлять многоуровневое интерактивное меню. Главное меню должно предоставлять возможность выхода, второстепенные меню — возможность выхода в главное меню или на уровень выше. Внутри каждого меню должна работать команда help, которая выводит справочную информацию о данном меню.
- Сценарий должен быть организован как бесконечный цикл (диалог с пользователем в виде вопрос-ответ). Выход из сценария осуществляется через главное меню. Меню должно быть реализовано с помощью встроенных команд select, read (интерактивный диалог командной строки).
- Сценарий в процессе работы должен выводить подсказки для пользователя, помогающие ему корректно работать с программой.
- Если ответ на запрос пользователя не помещается на экран, его нужно обернуть в команду less, позволяя тем самым листать вывод. Например, поиск файлов — вывод поиска может оказаться очень длинным, в таком случае его нужно перенаправить в less (см. man less).
- Сценарий должен обрабатывать аварийные ситуации, ошибки и некорректно введённые данные. Сообщения об ошибках должны выводиться в вывод ошибок (stderr). Ввод данных с пробелами или специальными символами, а также некорректных данных не должен приводить к ошибкам в программе или выводу непредусмотренных сообщений.
- Сценарий должен работать только от имени пользователя 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 ](/efanov/mephi/wiki/--z-$user-); then
echo "Ошибка: введите число из списка"
else
echo "Выбран пользователь:" "$user" "$REPLY"
# ... do other things
break
fi
;;
esac
done
Задания
Задания построены так, чтобы отражать внутреннюю структуру многоуровневого меню программы.
-
Управление пользователями
- Управление пользователями
- Добавить пользователя
- Запросить имя
- Вывести ошибку, если такой пользователь существует
- Удалить пользователя
- Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
- Удалить пользователя y/n?
- Удалить домашний каталог пользователя y/n?
- Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
- Добавить пользователя в группу
- Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
- Вывести пронумерованный список доступных групп, запросить имя или порядковый номер (должен работать любой вариант)
- Добавить пользователя
- Управление пользователями
-
Управление паролями и блокировка
- Блокировка пользователя (запрет на вход в систему)
- Вывести пронумерованный список доступных имён пользователей, отметить заблокированных пользователей символом Х (заблокирован)
- Запросить имя или порядковый номер (должен работать любой вариант)
- Заблокировать этого пользователя. Если пользователь заблокирован - разблокировать
- Смена пароля пользователя
- Вывести пронумерованный список доступных имён пользователей, запросить имя или порядковый номер (должен работать любой вариант)
- Сменить пароль
- Блокировка пользователя (запрет на вход в систему)
-
Управление группами
- Отображение списка групп и входящих в группу пользователей
- Добавить группу
- Удалить группу
- Изменить состав группы
- Добавить пользователя в группу
- Удалить пользователя из группы
-
Поиск пользователей или групп
- Найти пользователя
- Запросить имя пользователя или часть имени
- Вывести имя, UID, персональную информацию для каждого пользователя, совпадающего с ключевым словом
- Найти группу
- Запросить имя группы или часть имени
- Вывести имя группы, GID, список пользователей, входящих в эту группу
- Найти пользователя
-
Управление безопасностью файлов и каталогов
-
Запросить имя файла для дальнейшей работы. Если файл был указан в качестве аргумента программы, пропустить данный шаг. Программа должна одинаково хорошо работать для файлов и каталогов, причём если указанный файл является каталогом, необходимо предложить возможность рекурсивного применения изменений.
-
Изменить права доступа для:
-
Владельца
- Добавить право записи
- Убрать право записи
- Добавить право чтения
- Удалить право чтения
- Добавить право исполнения
- Удалить право исполнения
- Добавить бит SUID
- Удалить бит SUID
-
Группы (аналогичное подменю, как для владельца)
-
Остальных (аналогичное подменю)
-
Все из вышеперечисленного (аналогичное подменю)
-
-
Изменить владельца и группу файла
- Запросить имя нового владельца
- Запросить имя новой группы
-
-
-
Управление ACL для файлов и каталогов
-
Запросить имя файла для дальнейшей работы. Если файл был указан в качестве аргумента программы, пропустить данный шаг. Программа должна одинаково хорошо работать для файлов и каталогов, причём если указанный файл является каталогом, необходимо предложить возможность рекурсивного применения изменений.
-
Изменить ACL права файла:
-
Добавить запись
- Пользователь или группа
- Права доступа
-
Удалить запись
- Пользователь или группа
-
Изменить запись
- Пользователь или группа
- Отобразить старые права доступа
- Запросить права доступа
-
-
-
Поиск файлов, доступных всем пользователям на запись
- Найти файлы, доступные на запись всем (world writeable files) и вывести их список на экран
-
-
Управление системными службами и журналами (systemctl, journalctl)
-
Поиск системных служб
- Запросить часть имени или имя службы
- Вывести статус всех служб, имя которых совпадает с заданной маской
-
Вывести список процессов и связанных с ними systemd служб. В списке должны быть только процессы, которые связаны с .service юнитом.
-
Управление службами
-
Вывести пронумерованный список доступных служб, над выбранной службой организовать выполнение действий:
- Включить службу
- Отключить службу
- Запустить/перезапустить службу
- Остановить службу
- Вывести содержимое юнита службы
- Отредактировать юнит службы
-
-
Поиск событий в журнале
- Ввести имя службы (оставить пустым — любая служба)
- Степень важности (см. man journalctl)
- Строка поиска
-
-
Управление входом в систему (PAM)
-
Настройка срока действия паролей пользователей
-
Восстановить значение по умолчанию
-
Установить бессрочный срок действия паролей
-
Изменить срок действия паролей пользователя
- Вывести на экран текущее значение
- Запросить срок действия пароля в сутках
-
-
Настройка сложности (длины) паролей пользователей
-
Восстановить значение по умолчанию
-
Изменить сложность паролей пользователей
- Вывести на экран текущее значение
- Запросить сложность пароля (минимально допустимое количество символов пароля)
-
-
Настройка количества неверных попыток входа, после чего сеанс запроса пароля должен быть прерван
-
Восстановить значение по умолчанию
-
Изменить количество неверных попыток входа, после чего сеанс запроса пароля должен быть прерван
- Вывести на экран текущее значение
- Запросить количество попыток
-
-
Настройка количества неверных попыток входа, после чего пользователь будет заблокирован
-
Восстановить значение по умолчанию
-
Установить неограниченное количество попыток входа
-
Изменить количество неверных попыток входа, после чего пользователь будет заблокирован
- Вывести на экран текущее значение
- Запросить количество попыток
-
-
-
Управление файловыми системами (монтирование и отмонтирование)
-
Вывести таблицу файловых систем (в таблице обязательно должны присутствовать поля: пусть до устройства, тип файловой системы, точка монтирования). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
-
Монтировать файловую систему
- Запросить путь до устройства или файла. Если указан файл - монтировать файловую систему в режиме loopback.
- Запросить каталог монтирования. Если каталог отсутствует, его нужно создать. Если каталог существует, нужно проверить, что он пустой.
-
Отмонтировать файловую систему
- Вывести пронумерованный список разделов и предложить выбрать один из вариантов или ввести путь самостоятельно (должны работать оба варианта). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
- Отмонтировать выбранную файловую систему
-
Изменить параметры монтирования примонтированной файловой системы
-
Запросить примонтированную файловую систему (выбрать из нескольких вариантов). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
- Перевести файловую систему в режим «только чтение»
- Перевести файловую систему в режим «чтение и запись»
-
-
Вывести параметры монтирования примонтированной файловой системы
- Запросить примонтированную файловую систему (выбрать из нескольких вариантов). Из списка исключить виртуальные файловые системы и файловые системы в памяти (proc, sys, tmpfs и т.п.).
- Вывести параметры монтирования.
-
Вывести детальную информацию о файловой системе ext*
- Запросить файловую систему (выбрать из нескольких вариантов). Из списка исключить все файловые системы, которые не относятся к семейству ext*.
- Вывести подробную информацию о файловой системе: UUID, свойства, кол-во инодов, блоков, кол-во свободных инодов и т.п.
-
-
Управление сетевыми файловыми системами (монтирование и отмонтирование)
-
Отмонтировать сетевую файловую систему
- Вывести пронумерованный список точек монтирования, связанных только с сетевыми файловыми системами.
- Отмонтировать выбранную файловую систему
-
Монтировать сетевую файловую систему
- Запросить тип сетевой файловой системы:
<span lang="en-US">
Samba или<span lang="en-US">
NFS - Запросить имя узла
- Запросить общий каталог на узле (выбор из нескольких вариантов)
- Запросить каталог монтирования на локальной файловой системе, если каталог отсутствует – создать его.
- Запросить тип сетевой файловой системы:
-
Изменить параметры монтирования примонтированной сетевой файловой системы
-
Запросить примонтированную сетевую файловую систему (выбрать из нескольких вариантов, в списке должны быть только сетевые файловые системы)
- Перевести файловую систему в режим «только чтение»
- Перевести файловую систему в режим «чтение и запись»
-
-
-
Управление RPM-пакетами и репозиториями
-
Поиск пакета по ключевому слову
-
Установить пакет
- Ввести имя или выбрать из списка доступных для установки
-
Удалить пакет
- Ввести имя или выбрать из списка установленных
-
Настройка репозиториев
-
Добавить новый репозиторий
- Запросить имя репозитория
- Запросить путь до репозитория
-
Отключить репозиторий
- Отобразить список доступных включённых репозиториев и предложить один из вариантов
-
Включить репозиторий
- Отобразить список доступных отключённых репозиториев и предложить один из вариантов
-
-
Управление ключами
-
Ручной импорт ключа репозитория
-
Автоматический импорт ключа репозитория
-
Вывод списка установленных в систему ключей
-
Удаление ключа репозитория из системы (отзыв)
-
Управление проверкой цифровой подписи пакетов
-
Отключить проверку ключа
- Выбрать репозиторий из списка репозиториев, для которых осуществляется проверка цифровой подписи и отключить для него проверку цифровой подписи
-
Включить проверку ключа
- Выбрать репозиторий из списка репозиториев, для которых не осуществляется проверка цифровой подписи и включить для него проверку цифровой подписи
-
-
-
-
Управление событиями безопасности (аудит) —
man ausearch
,aureport
,audit.rules
-
Поиск событий аудита
- Запросить тип события (вывести для примера несколько типовых событий аудита)
- Запросить имя пользователя (можно оставлять пустым)
- Запросить строку поиска
-
Отчёты аудита (отчёты должны генерироваться за периоды: 1 день, неделя, месяц, год, см. man aureport)
- Отчёт входе пользователей в систему (успешные и неуспешные попытки входа в систему – дата и время, имя пользователя, терминал и успешность попытки входа)
- Отчёт о нарушениях (все события, завершившиеся неудачей – дата и время события, тип события, пользователь, краткие сведения о событии)
-
Настройка подсистемы аудита для наблюдения за файлами
- Добавить каталог или файл в список наблюдения
- Удалить каталог из списка наблюдения
- Вывести отчёт по наблюдению за каталогом (время и дата, действие, пользователь, осуществивший это действие)
-
-
Управление SELinux
-
Управление портами
-
Изменить существующий порт службы
- Запросить имя службы
- Вывести список портов службы и предложить выбрать один из них
- Запросить новый номер порта службы
-
Добавить новый порт для службы
- Запросить имя службы
- Запросить новый номер порта службы
-
-
Управление файлами
-
Переразметка каталога (рекурсивно) – см.
restorecon
-
Запустить полную переразметку файловой системы при перезагрузке
-
Изменить домен файла или каталога (рекурсивно)
- Запросить путь (должно работать автодополнение путей)
- Запросить новый домен
-
-
Управление переключателями
-
Вывести список переключателей с описанием и состоянием
-
Изменить переключатель
-
Запросить имя переключателя
-
Вывести текущее состояние
- Включить? (если выключен)
- Выключить? (если включён)
-
-
-