мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| notes:howlinuxworks:vol7 [2026/05/18 15:40] – radi0dev | notes:howlinuxworks:vol7 [2026/05/18 16:18] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 453: | Строка 453: | ||
| Команда **systemd-run** создаёт таймеры без юнит-файлов, | Команда **systemd-run** создаёт таймеры без юнит-файлов, | ||
| + | ===== 7.7 Планирование разовых задач с помощью службы at ===== | ||
| + | Выполнить задачу **один раз в будущем** без cron: | ||
| + | |||
| + | <code bash> | ||
| + | $ at 22:30 | ||
| + | at> myjob | ||
| + | # Ctrl+D для завершения | ||
| + | </ | ||
| + | |||
| + | ^ Команда ^ Действие ^ | ||
| + | | atq | Список запланированных задач | | ||
| + | | atrm | Удалить задачу | | ||
| + | | at 22:30 30.09.15 | Запланировать на дату и время | | ||
| + | |||
| + | ==== 7.7.1 Аналоги таймера ==== | ||
| + | |||
| + | Замена **at** на **systemd-run**: | ||
| + | |||
| + | <code bash> | ||
| + | # systemd-run --on-calendar=' | ||
| + | Running timer as unit: run-rbd000cc6ee6f45b69cb87ca0839c12de.timer | ||
| + | Will run service as unit: run-rbd000cc6ee6f45b69cb87ca0839c12de.service | ||
| + | |||
| + | # Смещение по времени (выполнить через 30 минут) | ||
| + | # systemd-run --on-active=30m / | ||
| + | |||
| + | # Просмотр таймеров | ||
| + | systemctl list-timers | ||
| + | </ | ||
| + | |||
| + | **--on-calendar** требует **будущую дату и время**, | ||
| + | |||
| + | ===== 7.8. Юниты таймера обычных пользователей ===== | ||
| + | |||
| + | Создать таймер от имени обычного пользователя: | ||
| + | |||
| + | <code bash> | ||
| + | $ systemd-run --user --on-calendar=' | ||
| + | </ | ||
| + | |||
| + | **Проблема: | ||
| + | |||
| + | **Решение - сохранить менеджер пользователя: | ||
| + | |||
| + | <code bash> | ||
| + | # Для текущего пользователя | ||
| + | $ loginctl enable-linger | ||
| + | |||
| + | # Для другого пользователя (от root) | ||
| + | # loginctl enable-linger user | ||
| + | </ | ||
| + | |||
| + | ===== 7.9 Доступ пользователя ===== | ||
| + | |||
| + | Управление входом, | ||
| + | |||
| + | ==== 7.9.1 ID пользователей и переключение пользователей ==== | ||
| + | |||
| + | **Переключение = смена идентификатора пользователя (UID)** через: | ||
| + | 1. Исполняемый файл **setuid** (пример: | ||
| + | 2. Системные вызовы **setuid()** | ||
| + | |||
| + | === Правила ядра (основные) === | ||
| + | |||
| + | 1. Процесс может запустить setuid файл, если **имеет права доступа** на него | ||
| + | 2. **Суперпользователь (UID 0)** может вызвать setuid() и **стать любым пользователем** | ||
| + | 3. **Обычный пользователь** практически **не может использовать setuid()** | ||
| + | |||
| + | **Следствие: | ||
| + | |||
| + | Переключение пользователей независимо от паролей и имён - чисто концепция пользовательского пространства (как / | ||
| + | |||
| + | ==== 7.9.2 Владельцы процессов, | ||
| + | |||
| + | Каждый процесс имеет **несколько UID идентификаторов**: | ||
| + | |||
| + | ^ UID ^ Назначение ^ Пример ^ | ||
| + | | **euid** (effective) | Определяет **права доступа** к файлам (исполнитель) | Setuid программа меняет на владельца файла | | ||
| + | | **ruid** (real) | **Кто инициировал** процесс (владелец) | Обычный пользователь, | ||
| + | | **saved UID** | Процесс может переключиться между euid и ruid | Позволяет вернуться к исходному UID | | ||
| + | | **fsuid** | Редко: доступ к файловой системе | Практически не используется | | ||
| + | |||
| + | **Аналогия: | ||
| + | |||
| + | **ruid определяет, | ||
| + | |||
| + | Пример: | ||
| + | |||
| + | === Просмотр UID === | ||
| + | |||
| + | <code bash> | ||
| + | $ ps -eo pid, | ||
| + | </ | ||
| + | |||
| + | Для большинства процессов euid = ruid (поэтому они совпадают в выводе по умолчанию) | ||
| + | |||
| + | === Типичное поведение setuid программ === | ||
| + | |||
| + | **sudo, su и похожие программы явно меняют оба UID (euid и ruid)** чтобы избежать побочных эффектов и проблем с доступом | ||
| + | |||
| + | Если нужно запретить sudo менять ruid - добавить в **/ | ||
| + | <code bash> | ||
| + | Defaults stay_setuid | ||
| + | </ | ||
| + | |||
| + | **Осторожно**: | ||
| + | |||
| + | === Последствия для безопасности === | ||
| + | |||
| + | Setuid программы - **основной путь взлома систем** | ||
| + | |||
| + | **Критические риски: | ||
| + | * Setuid копия bash → **любой локальный пользователь = полный контроль** | ||
| + | * Баги в setuid программах = вторжение | ||
| + | * Большое количество setuid файлов = большой риск | ||
| + | |||
| + | **Защита: | ||
| + | * **Минимизировать** количество setuid программ | ||
| + | * **Проверять качество** setuid кода | ||
| + | * **Идентифицировать пользователей** надёжными паролями | ||
| + | |||
| + | ==== 7.9.3 Идентификация пользователя, | ||
| + | |||
| + | Система безопасности включает три области: | ||
| + | * **Идентификация** - определение, | ||
| + | * **Аутентификация** - доказательство личности | ||
| + | * **Авторизация** - определение разрешенных действий | ||
| + | |||
| + | Ядро Linux оперирует только числовыми UID. Вся аутентификация (имена, | ||
| + | |||
| + | **Упрощенный процесс получения имени пользователя: | ||
| + | 1. Вызов getuid() для получения euid | ||
| + | 2. Открыть /etc/passwd | ||
| + | 3. Прочитать строку, | ||
| + | 4. Сравнить UID из файла с полученным | ||
| + | 5. При совпадении - найдено имя пользователя | ||
| + | |||
| + | ==== 7.9.4 Применение библиотек для получения информации о пользователе ==== | ||
| + | |||
| + | **Стандартные библиотеки** упрощают работу. Вместо ручной реализации используется getpwuid() после geteuid(). | ||
| + | |||
| + | **Преимущества: | ||
| + | |||
| + | **Недостатки традиционного подхода с паролями в / | ||
| + | * Отсутствие единого стандарта шифрования | ||
| + | * Требует доступа к зашифрованному паролю | ||
| + | * Запрос пароля при каждой аутентификации | ||
| + | * Не поддерживает альтернативные методы (токены, | ||
| + | |||
| + | ===== 7.10 Подключаемые модули аутентификации (PAM) ===== | ||
| + | |||
| + | **PAM** (Pluggable Authentication Module) - стандарт от Sun Microsystems (1995) для гибкой аутентификации. Система разделяемых библиотек позволяет добавлять методы аутентификации (двухфакторная, | ||
| + | |||
| + | Модули - динамически загружаемые объекты (.so). Пример: | ||
| + | |||
| + | ==== 7.10.1 Конфигурация PAM ==== | ||
| + | |||
| + | Файлы конфигурации: | ||
| + | |||
| + | **Структура строки конфигурации (3 поля): | ||
| + | |||
| + | ^ Поле ^ Описание ^ Пример ^ | ||
| + | | **Тип функции** | Операция, | ||
| + | | **Аргумент управления** | Поведение при успехе/ | ||
| + | | **Модуль** | Модуль аутентификации | pam_shells.so | | ||
| + | |||
| + | **Типы функции: | ||
| + | * **auth** - аутентификация (кто ты?) | ||
| + | * **account** - проверка статуса учетной записи | ||
| + | * **session** - действия только для текущего сеанса (motd) | ||
| + | * **password** - изменение пароля | ||
| + | |||
| + | **Управляющие аргументы (стек правил): | ||
| + | * **sufficient** - успех → немедленный успех, пропустить остальные; | ||
| + | * **requisite** - успех → далее; неудача → немедленный отказ | ||
| + | * **required** - успех → далее; неудача → далее, но всегда отказ в конце | ||
| + | |||
| + | **Пример стека (функции аутентификации chsh):** | ||
| + | < | ||
| + | auth sufficient pam_rootok.so | ||
| + | auth requisite pam_shells.so | ||
| + | auth sufficient pam_unix.so | ||
| + | auth required pam_deny.so | ||
| + | </ | ||
| + | |||
| + | ++++При такой конфигурации, | ||
| + | - Модуль pam_rootok.so проверяет, | ||
| + | - Модуль pam_shells.so проверяет, | ||
| + | - Модуль pam_unix.so запрашивает у пользователя пароль и проверяет его. Аргументу управления присвоено значение sufficient, поэтому успеха данного модуля (правильного пароля) достаточно, | ||
| + | - Модуль pam_deny.so никогда не выполняется, | ||
| + | |||
| + | {{: | ||
| + | ++++ | ||
| + | |||
| + | **Аргументы модулей: | ||
| + | |||
| + | ==== 7.10.2 Советы по синтаксису конфигурации PAM ==== | ||
| + | |||
| + | * Список модулей: | ||
| + | * Локализация: | ||
| + | * Комментарии в /etc/pam.d указывают на источник генерации | ||
| + | * **/ | ||
| + | * Включение файлов: | ||
| + | * Дополнительные настройки в **/ | ||
| + | |||
| + | ==== 7.10.3 Модули PAM и пароли ==== | ||
| + | |||
| + | **/ | ||
| + | |||
| + | **Установка пароля (функция password): | ||
| + | < | ||
| + | password sufficient pam_unix.so obscure sha512 | ||
| + | </ | ||
| + | |||
| + | Аргументы: | ||
| + | |||
| + | **Проверка пароля (функция auth):** pam_unix.so автоматически определяет алгоритм через libcrypt (перебор), | ||
| + | |||
| + | **Поиск конфига: | ||