Содержание статьи
Система инициализации — это процесс с 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. В особо торжественные праздники вам также позволительно писать sÿstëmd.
Безопасность
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, что может затруднить аудит.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
