мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| notes:howlinuxworks:vol7 [2026/05/14 18:00] – создано radi0dev | notes:howlinuxworks:vol7 [2026/05/18 16:18] (текущий) – radi0dev | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Глава 7: Настройка системы: | ====== Глава 7: Настройка системы: | ||
| + | |||
| + | ===== 7.1 Ведение системного журнала ===== | ||
| + | |||
| + | Системные программы записывают логи через **syslogd** (традиционный) или **journald** (современный, | ||
| + | |||
| + | ^ Компонент ^ Назначение ^ | ||
| + | | syslogd | Традиционная служба логирования | | ||
| + | | journald | Современная служба (systemd) | | ||
| + | | /var/log | Директория с логами | | ||
| + | | / | ||
| + | |||
| + | ==== 7.1.1 Проверка настроек журнала ==== | ||
| + | |||
| + | Определить тип логирования в системе: | ||
| + | |||
| + | * **journald**: | ||
| + | * **rsyslogd**: | ||
| + | * **syslog-ng**: | ||
| + | |||
| + | Дополнительные логи: `/ | ||
| + | |||
| + | ==== 7.1.2 Поиск и мониторинг журналов ==== | ||
| + | |||
| + | === Фильтрация по времени === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -S -4h # последние 4 часа | ||
| + | journalctl -S 06: | ||
| + | journalctl -S 2020-01-14 | ||
| + | journalctl -S ' | ||
| + | journalctl -U < | ||
| + | </ | ||
| + | |||
| + | === Фильтрация по юнитам === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -u cron.service | ||
| + | journalctl -F _SYSTEMD_UNIT | ||
| + | </ | ||
| + | |||
| + | === Поиск полей === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -N # список всех полей | ||
| + | journalctl _PID=8792 | ||
| + | </ | ||
| + | |||
| + | **Примечание**: | ||
| + | |||
| + | === Фильтрация по тексту === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -g ' | ||
| + | </ | ||
| + | |||
| + | Часто важная информация находится рядом по времени - используйте метку времени совпадений и `journalctl -S`. | ||
| + | |||
| + | **Примечание**: | ||
| + | |||
| + | === Фильтрация по загрузке системы === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -b # текущая загрузка | ||
| + | journalctl -b -1 # предыдущая загрузка | ||
| + | journalctl --list-boots | ||
| + | journalctl -k # только сообщения ядра | ||
| + | journalctl -r -b -1 # проверка корректного выключения | ||
| + | </ | ||
| + | |||
| + | === Фильтрация по важности === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -p 3 # от уровня 0 (важное) до 3 | ||
| + | journalctl -p 2..3 # уровни 2 и 3 | ||
| + | </ | ||
| + | |||
| + | Уровни: | ||
| + | |||
| + | === Простой мониторинг журнала === | ||
| + | |||
| + | <code bash> | ||
| + | journalctl -f # следить за новыми сообщениями (как tail -f) | ||
| + | </ | ||
| + | |||
| + | Можно комбинировать с другими параметрами фильтрации (`-u`, `-S`, `-p` и т.д.). | ||
| + | |||
| + | ==== 7.1.3 Ротация файлов журнала ==== | ||
| + | |||
| + | **Логротация** - удаление старых сообщений с помощью **logrotate**. Вместо удаления из файла старые логи разделяются на блоки: | ||
| + | |||
| + | * `auth.log` (новые) | ||
| + | * `auth.log.1`, | ||
| + | |||
| + | Процесс ротации: | ||
| + | 1. Удалить `auth.log.3` | ||
| + | 2. `auth.log.2` → `auth.log.3` | ||
| + | 3. `auth.log.1` → `auth.log.2` | ||
| + | 4. `auth.log` → `auth.log.1` | ||
| + | |||
| + | Варианты в разных дистрибутивах: | ||
| + | * **Ubuntu**: сжатие (`.gz`) при переносе с позиции 1 на 2 | ||
| + | * Другие: | ||
| + | |||
| + | **Конфликты ротации**: | ||
| + | |||
| + | ==== 7.1.4 Обслуживание журналов journald ==== | ||
| + | |||
| + | Логи в `/ | ||
| + | |||
| + | Критерии удаления: | ||
| + | * Свободное место на ФС | ||
| + | * Процент от размера ФС | ||
| + | * Максимальный размер журнала | ||
| + | * Максимальный возраст сообщения | ||
| + | |||
| + | Настройка: | ||
| + | |||
| + | ==== 7.1.5 Детали системного журналирования ==== | ||
| + | |||
| + | === История и архитектура === | ||
| + | |||
| + | **syslog** развился в 1980-х годах с sendmail (RFC 3164, затем RFC 5424). Классическая архитектура **«клиент - сервер»**. | ||
| + | |||
| + | **Механизм**: | ||
| + | |||
| + | === Объекты и важность === | ||
| + | |||
| + | ^ Параметр ^ Назначение ^ | ||
| + | | **Facility** (объект) | Категория службы (ядро, почта, принтер) | | ||
| + | | **Severity** (важность) | Уровни 0–7 (emerg до debug) | | ||
| + | | **Priority** (приоритет) | Комбинация facility + severity | | ||
| + | |||
| + | Уровни: | ||
| + | |||
| + | Ограничения: | ||
| + | |||
| + | RFC 5424 поддерживает **структурированные данные** - пары ключ-значение для произвольных полей. | ||
| + | |||
| + | === syslog vs journald === | ||
| + | |||
| + | **syslog остаётся нужен**: | ||
| + | * Чёткое объединение логов на нескольких машинах | ||
| + | * rsyslogd модульна, | ||
| + | |||
| + | **journald**: | ||
| + | * Фокус на логирование одной машины в едином формате | ||
| + | * Может передавать логи в другие регистраторы | ||
| + | * systemd собирает выход серверов → journald | ||
| + | |||
| + | === Тренды журналирования === | ||
| + | |||
| + | Журналирование эволюционирует: | ||
| + | * Централизованное хранение → интернет-сервисы и БД | ||
| + | * Назначение: | ||
| + | * Безопасность: | ||
| + | |||
| + | ===== 7.2 Структура каталога /etc ===== | ||
| + | |||
| + | Большинство конфигов системы находятся в **/etc**. Исторически каждая программа имела свой файл конфигурации, | ||
| + | |||
| + | **Решение: | ||
| + | |||
| + | **Правило: | ||
| + | |||
| + | ===== 7.3 Файлы управления пользователями ===== | ||
| + | |||
| + | В Unix пользователи - это числа (UID) в ядре, но на уровне ОС используются имена (usernames). Любая программа должна переводить имя в UID для работы с ядром. | ||
| + | |||
| + | ==== 7.3.1 Файл /etc/passwd ==== | ||
| + | |||
| + | Текстовый файл сопоставляет имена пользователей с UID. **Формат: | ||
| + | |||
| + | ^ Поле ^ Описание ^ | ||
| + | | Имя пользователя | Логин (root, daemon и т.д.) | | ||
| + | | Пароль | x - в shadow-файле; | ||
| + | | UID | Идентификатор пользователя в ядре; должен быть уникальным | | ||
| + | | GID | Идентификатор основной группы (из /etc/group) | | ||
| + | | GECOS | Полное имя пользователя (может содержать телефоны, | ||
| + | | Домашний каталог | Каталог пользователя | | ||
| + | | Оболочка | Программа при входе в сеанс (обычно /bin/bash или /bin/sh) | | ||
| + | |||
| + | {{: | ||
| + | |||
| + | **Пример: | ||
| + | < | ||
| + | root: | ||
| + | juser: | ||
| + | nobody: | ||
| + | </ | ||
| + | |||
| + | **Важно: | ||
| + | - Синтаксис строг, комментарии и пустые строки не допускаются | ||
| + | - Пароли не хранятся в passwd, а хранятся в shadow-файле (доступен только root) | ||
| + | - Запись в passwd + домашний каталог = учётная запись (account) | ||
| + | |||
| + | ==== 7.3.2 Особые пользователи ==== | ||
| + | |||
| + | **Суперпользователь (root):** UID 0, GID 0 - единственный UID, имеющий значение для ядра. | ||
| + | |||
| + | **Псевдопользователи: | ||
| + | * **nobody** - непривилегированный, | ||
| + | * **daemon** и др. - для системных сервисов | ||
| + | |||
| + | Это соглашения пользовательского пространства; | ||
| + | |||
| + | ==== 7.3.3 Файл /etc/shadow ==== | ||
| + | |||
| + | Теневой файл пароля содержит данные аутентификации: | ||
| + | |||
| + | Работает вместе с **PAM** (Pluggable Authentication Modules) и конфигом / | ||
| + | |||
| + | ==== 7.3.4. Управление пользователями и паролями ==== | ||
| + | |||
| + | **Команды для обычных пользователей: | ||
| + | * **passwd** - изменить свой пароль | ||
| + | * **chfn** - изменить полное имя (GECOS) | ||
| + | * **chsh** - изменить оболочку (должна быть в / | ||
| + | |||
| + | Все эти команды - suid-root утилиты (потому что только root может изменить / | ||
| + | |||
| + | **Управление от суперпользователя: | ||
| + | |||
| + | ^ Операция ^ Команда ^ | ||
| + | | Установить пароль | passwd < | ||
| + | | Добавить пользователя | adduser | | ||
| + | | Удалить пользователя | userdel | | ||
| + | | Редактировать passwd безопасно | vipw | | ||
| + | | Редактировать shadow безопасно | vipw -s | | ||
| + | |||
| + | **Избегайте** прямого редактирования passwd текстовым редактором (ошибки синтаксиса, | ||
| + | |||
| + | **vipw** - создаёт резервные копии и блокирует файл во время редактирования для безопасности. | ||
| + | |||
| + | ==== 7.3.5 Работа с группами пользователей ==== | ||
| + | |||
| + | **Группы** - способ организации совместного доступа к файлам между пользователями через биты разрешений. Менее актуальна в современных системах (общие рабочие станции стали редкостью). | ||
| + | |||
| + | Файл **/ | ||
| + | |||
| + | ^ Поле ^ Описание ^ | ||
| + | | Название группы | Отображается в ls -l | | ||
| + | | Пароль группы | Почти никогда не используется; | ||
| + | | GID | Идентификатор группы (должен быть уникальным) | | ||
| + | | Список пользователей | Необязателен; | ||
| + | |||
| + | {{: | ||
| + | |||
| + | **Примечание: | ||
| + | |||
| + | **Просмотр групп пользователя: | ||
| + | <code bash> | ||
| + | groups | ||
| + | </ | ||
| + | |||
| + | ===== 7.4 Команды getty и login ===== | ||
| + | |||
| + | **getty** - подключается к терминалам и отображает приглашение входа. В Linux используется в основном на виртуальных терминалах (Ctrl+Alt+F1). Часто в виде **agetty**: | ||
| + | <code bash> | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | **Процесс входа: | ||
| + | 1. getty заменяется программой **login** | ||
| + | 2. login запрашивает пароль | ||
| + | 3. При верном пароле login заменяется (exec) оболочкой пользователя | ||
| + | 4. При ошибке: | ||
| + | |||
| + | Аутентификация выполняется через **PAM** (Pluggable Authentication Modules). | ||
| + | |||
| + | **Примечание: | ||
| + | |||
| + | **В современных системах getty и login редко используются: | ||
| + | |||
| + | ===== 7.5 Установка времени ===== | ||
| + | |||
| + | Системные часы ядра должны быть максимально точными. Ядро опирается на аппаратные часы RTC (Real-Time Clock) при загрузке, | ||
| + | |||
| + | **Основной принцип: | ||
| + | |||
| + | Время ядра - это секунды с 1970-01-01 00:00 UTC | ||
| + | |||
| + | RTC - Аппаратные часы с питанием от батареи; | ||
| + | |||
| + | Time drift - это сдвиг между временем ядра и истинным; | ||
| + | |||
| + | **Установка RTC на UTC:** | ||
| + | <code bash> | ||
| + | hwclock --systohc --utc | ||
| + | </ | ||
| + | |||
| + | ==== 7.5.1 Представление времени ядра и часовые пояса ==== | ||
| + | |||
| + | Системные часы = секунды с 1970-01-01 00:00 UTC. Пользовательские программы преобразуют в локальное время. | ||
| + | |||
| + | **Управление часовыми поясами: | ||
| + | * **/ | ||
| + | * **/ | ||
| + | |||
| + | **Установка часового пояса: | ||
| + | <code bash> | ||
| + | # Копирование или симлинк | ||
| + | ln -sf / | ||
| + | |||
| + | # Или интерактивная утилита | ||
| + | tzselect | ||
| + | </ | ||
| + | |||
| + | **Использование альтернативного пояса: | ||
| + | <code bash> | ||
| + | # На сеанс | ||
| + | export TZ=US/ | ||
| + | date | ||
| + | |||
| + | # На одну команду | ||
| + | TZ=US/ | ||
| + | </ | ||
| + | |||
| + | ==== 7.5.2 Сетевое время ==== | ||
| + | |||
| + | При постоянном интернете используйте демон NTP для синхронизации времени с удалённым сервером. | ||
| + | |||
| + | ^ Демон ^ Описание ^ Применение ^ | ||
| + | | **timesyncd** | Встроен в systemd; по умолчанию включен | Системы с интернетом (рекомендуется) | | ||
| + | | **ntpd** | Старый демон; нужно отключить timesyncd | Если требуется расширенный контроль | | ||
| + | | **chronyd** | Поддерживает время при периодическом интернете | Мобильные системы, | ||
| + | |||
| + | **Конфигурация timesyncd: | ||
| + | |||
| + | **Информация о серверах: | ||
| + | |||
| + | **Синхронизация RTC с сетевым временем: | ||
| + | <code bash> | ||
| + | # После синхронизации с NTP | ||
| + | hwclock --systohc --utc | ||
| + | </ | ||
| + | |||
| + | Многие дистрибутивы это делают автоматически. | ||
| + | |||
| + | ===== 7.6 Планирование повторяющихся задач с помощью команды cron и юнитов таймера ===== | ||
| + | |||
| + | Два способа запуска повторяющихся задач: **cron** и **таймеры systemd**. Используется для автоматизации (например, | ||
| + | |||
| + | **Формат crontab:** | ||
| + | |||
| + | Строка: | ||
| + | |||
| + | | Поле | Диапазон | Пример | | ||
| + | | минута | 0-59 | 15 | | ||
| + | | час | 0-23 | 09 | | ||
| + | | день месяца | 1-31 | * | | ||
| + | | месяц | 1-12 | * | | ||
| + | | день недели | 0-7 (0, | ||
| + | |||
| + | **Символ * = все значения** | ||
| + | |||
| + | <code bash> | ||
| + | # Ежедневно в 9:15 | ||
| + | 15 09 * * * / | ||
| + | |||
| + | # Только 14-го числа в 9:15 | ||
| + | 15 09 14 * * / | ||
| + | |||
| + | # 5-го и 14-го числа в 9:15 | ||
| + | 15 09 5,14 * * / | ||
| + | </ | ||
| + | |||
| + | ==== 7.6.1 Установка файлов Crontab ==== | ||
| + | |||
| + | Каждый пользователь имеет свой crontab в **/ | ||
| + | |||
| + | Команды: | ||
| + | | crontab file | Установить файл как текущий crontab | | ||
| + | | crontab -l | Список заданий | | ||
| + | | crontab -e | Редактировать текущий crontab | | ||
| + | | crontab -r | Удалить crontab | | ||
| + | |||
| + | ==== 7.6.2 Системные файлы Crontab ==== | ||
| + | |||
| + | **/ | ||
| + | |||
| + | Отличие: | ||
| + | |||
| + | <code bash> | ||
| + | # Формат: | ||
| + | 42 6 * * * root / | ||
| + | </ | ||
| + | |||
| + | Дополнительные файлы в **/ | ||
| + | |||
| + | ==== 7.6.3 Юниты таймера ==== | ||
| + | |||
| + | Альтернатива cron - **таймер systemd**. Требует два юнита: **таймер** (активация) + **служебный юнит** (задача). | ||
| + | |||
| + | Файлы в **/ | ||
| + | |||
| + | === Юнит таймера (loggertest.timer) === | ||
| + | |||
| + | <code bash> | ||
| + | [Unit] | ||
| + | Description=Example timer unit | ||
| + | |||
| + | [Timer] | ||
| + | OnCalendar=*-*-* *:00,20,40 | ||
| + | Unit=loggertest.service | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=timers.target | ||
| + | </ | ||
| + | |||
| + | **OnCalendar** - время в формате '' | ||
| + | |||
| + | Запускается каждые 20 минут. Синтаксис: | ||
| + | * '' | ||
| + | * '','' | ||
| + | * '' | ||
| + | |||
| + | Полный синтаксис: | ||
| + | |||
| + | === Связанный служебный юнит (loggertest.service) === | ||
| + | |||
| + | <code bash> | ||
| + | [Unit] | ||
| + | Description=Example Test Service | ||
| + | |||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | ExecStart=/ | ||
| + | </ | ||
| + | |||
| + | **Type=oneshot** - служба запускается, | ||
| + | |||
| + | Преимущества oneshot: | ||
| + | * Несколько **ExecStart** в одном файле | ||
| + | * Строгий порядок зависимостей (Wants, Before) | ||
| + | * Точные записи о времени в журнале | ||
| + | |||
| + | Быстрые задачи могут завершиться до записи в журнал (эффект гонок) | ||
| + | |||
| + | ==== 7.6.4. Утилита cron против юнитов таймера ==== | ||
| + | |||
| + | ^ Критерий ^ cron ^ Таймеры systemd ^ | ||
| + | | Сложность | **Простая** | Сложнее | | ||
| + | | Совместимость | **Высокая** (множество служб) | Зависит от системы | | ||
| + | | Пользовательские задачи | **Легко** | Требует юнит-файлов | | ||
| + | | Отслеживание процессов (cgroups) | Слабо | **Эффективно** | | ||
| + | | Логирование | Базовое | **Детальное** (journal) | | ||
| + | | Параметры времени | Ограничены | **Расширенные** | | ||
| + | | Зависимости systemd | Нет | **Да** | | ||
| + | |||
| + | **cron вряд ли исчезнет** благодаря простоте. **Таймеры - будущее** системных задач. | ||
| + | |||
| + | Команда **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 (перебор), | ||
| + | |||
| + | **Поиск конфига: | ||