Усиление защиты хоста [332.1]

Рейтинг: 61% · 6 голосов
Специализация LPIC-3 303 (v3.0): криптография и PKI/X.509, шифрование ФС (LUKS/TPM2/Clevis), DNSSEC, hardening хоста, IDS, контроль доступа (SELinux/AppArmor), сетевая безопасность, nftables, VPN, пентест.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Усиление защиты хоста [332.1]

Сообщение Sergey_Sysadmin »

Оглавление курса (16)
  1. Введение в LPIC-3 303: безопасность Linux
  2. X.509 и инфраструктура открытых ключей [331.1]
  3. X.509 для шифрования, подписи и аутентификации [331.2]
  4. Шифрование файловых систем [331.3]
  5. DNS и криптография [331.4]
  6. Усиление защиты хоста [332.1] (вы здесь)
  7. Урок 6. Обнаружение вторжений на хосте: AIDE, auditd, сканеры руткитов и OpenSCAP
  8. Контроль ресурсов [332.3]
  9. Дискреционный контроль доступа: ACL и атрибуты [333.1]
  10. Мандатный контроль доступа: SELinux и AppArmor [333.2]
  11. Усиление сетевой защиты [334.1]
  12. Сетевое обнаружение вторжений
  13. Фильтрация пакетов [334.3]
  14. Виртуальные частные сети (VPN) [334.4]
  15. Уязвимости и угрозы [335.1]
  16. Основы тестирования на проникновение [335.2]
Урок 5. Усиление защиты хоста [332.1]

Чем меньше у системы работающих служб, загруженных модулей ядра и открытых интерфейсов, тем меньше у атакующего точек входа. В этом уроке мы сокращаем поверхность атаки: гасим лишние сервисы и юниты, запрещаем загрузку ненужных модулей ядра, ограничиваем USB через USBGuard, заворачиваем демоны в песочницу systemd и подкручиваем параметры ядра через sysctl. Всё это - повседневная работа администратора, которую на экзамене 303-300 спрашивают именно как набор конкретных механизмов.

Изображение

Как это работает

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

Службами управляет systemd. Юнит может быть активен (running), остановлен, но включён в автозапуск (enabled), или замаскирован (masked) - тогда его нельзя запустить даже вручную или по зависимости. Маскирование - это симлинк юнита в /dev/null, самый жёсткий способ выключить службу навсегда. Сокеты systemd могут поднимать демон по первому подключению (socket activation), поэтому проверять надо не только .service, но и .socket.

Модули ядра - это код, исполняемый в кольце 0. Лишний драйвер файловой системы или сетевого протокола (cramfs, dccp, sctp, firewire) - это потенциальная дыра. Модуль можно занести в чёрный список (blacklist), но это лишь мешает автозагрузке. Чтобы запретить намертво, используют директиву install ... /bin/true (или /bin/false), которая подменяет загрузку модуля заведомо безобидной командой.

USBGuard реализует политику для USB-устройств на лету. Демон слушает события udev, сверяет дескрипторы устройства (vendor/product ID, serial, интерфейсы) с белым списком и разрешает или блокирует подключение. Это защита от BadUSB и от того, что кто-то воткнёт в сервер свою флешку или HID-эмулятор.

Песочница systemd - это набор директив юнита, которые ограничивают процесс средствами ядра (namespaces, capabilities, seccomp). ProtectSystem делает /usr и /etc только для чтения, PrivateTmp выдаёт службе изолированный /tmp, NoNewPrivileges запрещает повышение прав через suid и file capabilities. Это сильно сужает урон от скомпрометированного демона без переписывания самого демона.

Параметры ядра через sysctl управляют поведением сети и памяти в рантайме. Тут же лежит защита /proc: монтирование с hidepid скрывает чужие процессы от непривилегированных пользователей. Secure Boot проверяет подпись загрузчика и ядра на этапе старта, не давая подсунуть свой неподписанный код.

Команды и примеры

Найти и погасить лишние слушающие службы и сокеты:

Код: Выделить всё

ss -tulpnH
systemctl list-units --type=socket --state=listening
systemctl disable --now avahi-daemon.service
systemctl mask avahi-daemon.socket
Список включённых юнитов одинаков в Debian/Ubuntu и RHEL/Fedora, а вот имена пакетов и сами лишние службы различаются - проверяйте под свой дистрибутив.

Запрет модуля ядра. Создаём файл в /etc/modprobe.d/:

Код: Выделить всё

# /etc/modprobe.d/hardening.conf
blacklist dccp
install dccp /bin/false
install firewire-core /bin/false
Проверка, какие модули загружены и кто их тянет:

Код: Выделить всё

lsmod
modprobe -r firewire-core        # выгрузить сейчас
modinfo firewire-core            # откуда модуль, зависимости
USBGuard. Установка различается по семействам:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
apt install usbguard

# RHEL 10 / Fedora 41+
dnf install usbguard
Сгенерировать политику из текущих устройств и запустить демон:

Код: Выделить всё

usbguard generate-policy > /etc/usbguard/rules.conf
systemctl enable --now usbguard.service
usbguard list-devices
usbguard allow-device 6            # разрешить устройство с id 6
Песочница для произвольного юнита через drop-in. Не правьте файл из пакета, кладите override:

Код: Выделить всё

systemctl edit myservice.service

Код: Выделить всё

[Service]
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
SystemCallFilter=@system-service
ReadWritePaths=/var/lib/myservice
Оценить, насколько служба изолирована (10 - решето, 0 - крепость):

Код: Выделить всё

systemd-analyze security myservice.service
Параметры ядра через sysctl. Кладём в /etc/sysctl.d/:

Код: Выделить всё

# /etc/sysctl.d/90-hardening.conf
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.unprivileged_bpf_disabled = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1

Код: Выделить всё

sysctl --system            # применить все файлы
sysctl kernel.dmesg_restrict
Защита /proc через hidepid. В /etc/fstab:

Код: Выделить всё

proc  /proc  proc  defaults,hidepid=2,gid=proc  0  0
Проверка состояния Secure Boot и прав на критичные файлы:

Код: Выделить всё

mokutil --sb-state
find / -xdev -perm -4000 -type f 2>/dev/null   # все suid
Частые грабли
  • disable без mask: служба не стартует сама, но её всё ещё может поднять другой юнит по зависимости или socket activation. Для гарантии - mask.
  • Забыли про .socket. Гасите .service, а демон всё равно просыпается при подключении к порту, потому что активен парный сокет.
  • blacklist без install. Чёрный список не мешает явной загрузке модуля по имени или подгрузке по зависимости. Нужна именно директива install ... /bin/false.
  • ProtectSystem=strict без ReadWritePaths ломает службу: ей некуда писать. Сначала найдите рабочие каталоги, потом откройте только их.
  • SystemCallFilter слишком узкий - демон падает с SIGSYS на старте. Снимайте профиль постепенно, смотрите журнал на ошибки seccomp.
  • Правки прямо в /usr/lib/systemd/system/. Их затрёт обновление пакета. Используйте systemctl edit и drop-in в /etc.
  • hidepid сломал доступ агентам мониторинга. Заведите группу proc и добавьте туда нужные сервисные учётки через gid.
  • Отключение Secure Boot ради проприетарного драйвера (NVIDIA) без понимания последствий - теряете цепочку доверия загрузки.
Мини-лаба
  • Снимите карту слушающих сокетов: ss -tulpnH и сопоставьте каждый порт с конкретным юнитом.
  • Выберите одну заведомо лишнюю службу (например avahi или cups, если печать не нужна), выполните disable --now, затем mask и проверьте, что она не поднимается.
  • Запретите модуль dccp через install ... /bin/false, перезагрузитесь и убедитесь, что modprobe dccp молча ничего не делает.
  • Установите usbguard, сгенерируйте политику из текущих устройств, запустите демон и попробуйте подключить новую флешку - она должна заблокироваться.
  • Выберите свой демон, прогоните systemd-analyze security, затем через override добавьте ProtectSystem, PrivateTmp, NoNewPrivileges и снова сравните оценку.
  • Примените набор sysctl из урока через sysctl --system и проверьте 2-3 значения чтением.
  • Найдите все suid-бинарники через find и обоснуйте для себя, зачем нужен каждый.
Контрольные вопросы
  • Чем mask отличается от disable и почему disable не всегда достаточно?
  • Почему blacklist в modprobe.d не гарантирует, что модуль не загрузится, и какая директива решает проблему?
  • Что именно ограничивают ProtectSystem=strict и NoNewPrivileges, и какой риск несёт первый без ReadWritePaths?
  • Как USBGuard принимает решение разрешить или заблокировать устройство и от какого класса атак он защищает?
  • Зачем нужен hidepid на /proc и как не отрезать от данных легитимный мониторинг?
  • Что проверяет Secure Boot на этапе загрузки и чем грозит его отключение?
👍4 ❤️3 🔥1 😄 🤔3
Аватара пользователя
Slindauer
Сообщения: 1
Зарегистрирован: 11 май 2026, 12:47

Re: Усиление защиты хоста [332.1]

Сообщение Slindauer »

А mask можно откатить если что? Или потом сервис уже не вернуть без переустановки пакета?
👍1 ❤️ 🔥1 😄 🤔1
Аватара пользователя
cpp_ninja
Сообщения: 1
Зарегистрирован: 21 май 2026, 09:32

Re: Усиление защиты хоста [332.1]

Сообщение cpp_ninja »

Прогнал systemd-analyze security на своём nginx - выдало 9.6 unsafe, после ProtectSystem и PrivateTmp упало до 6.2. Дальше что трогать чтобы ещё ниже?
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
DNS и криптография [331.4]
Следующая глава →
Урок 6. Обнаружение вторжений на хосте: AIDE, auditd, сканеры руткитов и OpenSCAP

Все главы курса «LPIC-3 303: безопасность Linux»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-3 303: безопасность Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость