Содержание статьи
Система инициализации — это процесс с PID 1, который запускает все остальное в Linux. Если она настроена неправильно, это может открыть двери для атак или усложнить восстановление после сбоя. Например, в 2018 году уязвимость CVE-2018-15686 в systemd позволяла злоумышленнику с локальным доступом получить root-права через ошибку в обработке сообщений D-Bus. Такие проблемы показывают, что выбор и настройка init-системы напрямую влияют на безопасность. Понимание того, как разные системы работают и защищаются, помогает минимизировать риски и упростить аудит.
Systemd: возможности и риски
Systemd — экосистема, используемая в Ubuntu, RHEL, Debian. Она управляет множеством внутренних механизмов в этих системах. Поддержка cgroups v2, namespaces и resolved позволяет изолировать процессы и ресурсы, что делает systemd популярным инструментом для DevSecOps, но сложность этого инструмента увеличивает поверхность атаки. Сложность всегда создает дополнительные риски!
Давай разберем, что умеет systemd и как ее обезопасить.
Как писать systemd
Автор systemd Леннарт Пёттеринг:
Правильно писать systemd, а не System D или даже SystemD. И уж точно не system d. Почему? Потому что это системный демон (system daemon), а в Unix/Linux их пишут в нижнем регистре и добавляют суффикс d (тоже строчный). А так как systemd управляет системой (system), он и называется systemd. Все просто. Единственный случай, когда мы допускаем заглавную букву в названии (хотя и это нам не по душе), — если вы начинаете предложение со слова systemd.
Безопасность
Systemd — это не просто механизм инициализации, а целая экосистема, которая управляет службами, сетью, логированием и даже контейнерами. Она стоит по умолчанию в Ubuntu, RHEL, Debian и других популярных дистрибутивах, но ее сложность вызывает споры. Давай разберем, что она умеет и как ее обезопасить.
Systemd работает с юнитами — конфигурационными файлами, которые задают, как запускать службы (.service), сокеты (.socket), таймеры (.timer) или точки монтирования (.mount). Например, файл nginx. определяет, как поднять веб‑сервер, его зависимости и ограничения. Среди компонентов — systemd-journald для бинарного логирования (альтернатива rsyslog), systemd-networkd и resolved для управления сетью и DNS, logind для контроля пользовательских сессий и systemd-nspawn для легкой контейнеризации.
Для безопасности systemd предлагает механизмы ограничения привилегий, которые проще, чем настройка seccomp или POSIX-капабилити.
-
NoNewPrivileges=yesблокирует повышение привилегий, даже при эксплуатации уязвимостей. -
PrivateTmp=yesизолирует/, чтобы служба не читала чужие файлы.tmp -
ProtectSystem=fullделает каталоги/,usr /иboot /доступными только для чтения.etc -
ReadWritePathsразрешает запись только в указанные директории, например/.var/ log/ nginx -
CapabilityBoundingSetограничивает capabilities — возможности процессов выполнять те или иные действия. -
RestrictAddressFamiliesразрешает только нужные протоколы, такие какAF_INETиAF_INET6. -
MemoryDenyWriteExecute=yesзащищает от инъекции кода в процессы. -
PrivateDevices=yesограничивает доступ к /dev.
Вот пример безопасной конфигурации для Nginx в /:
[Unit]Description=Secure NGINX Web ServerAfter=network.target[Service]ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.confUser=nginxGroup=nginxCapabilityBoundingSet=CAP_NET_BIND_SERVICENoNewPrivileges=yesPrivateTmp=yesProtectSystem=fullReadWritePaths=/var/lib/nginx /var/log/nginxRestrictAddressFamilies=AF_INET AF_INET6MemoryDenyWriteExecute=yesPrivateDevices=yesProtectHome=yesSystemCallFilter=@system-serviceSystemCallArchitectures=native[Install]WantedBy=multi-user.targetЭта конфигурация запускает nginx от имени непривилегированного пользователя, ограничивает его возможности, изолирует /, / и системные директории, разрешает только IPv4/IPv6 и блокирует выполнение кода из памяти. Команда systemd-analyze покажет оценку уязвимостей и предложит улучшения.
Но у systemd есть и риски. Уязвимости, такие как CVE-2018-15686, показывают, что сложность системы создает потенциальные векторы атак. Бинарные логи journald сложнее анализировать без journalctl, что может затруднить аудит.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
