16 Назначение и работа systemd и sysvinit Различны
16 Назначение и работа systemd и sysvinit. Различные Systemd units. Редактирование units¶
Systemd и SysVinit — это системы инициализации в Linux, которые управляют процессом загрузки компьютера и службами, запускаемыми на различных этапах работы системы.
SysVinit¶
- Назначение: SysVinit был стандартной системой инициализации во многих ранних версиях Linux. Он основан на концепции уровней выполнения (runlevels), которые определяют, какие программы и службы должны быть запущены или остановлены в определенный момент времени.
- Работа: SysVinit использует скрипты инициализации, расположенные в
/etc/init.d, для управления службами. Эти скрипты вызываются с аргументамиstart,stop,restartи т. д. для управления состоянием служб. Уровни выполнения определены в/etc/inittab, и система может переключаться между ними, изменяя набор работающих служб.
Systemd¶
- Назначение: Systemd — это более современная система инициализации и системный менеджер, который заменил SysVinit в большинстве дистрибутивов Linux. Он предоставляет более быструю загрузку, зависимости между службами, возможность параллельного запуска задач и лучшее управление ресурсами.
- Работа: Вместо скриптов инициализации Systemd использует "юниты" (units) для представления служб, точек монтирования, устройств и других ресурсов. Systemd управляет этими юнитами в соответствии с их зависимостями, определенными в конфигурационных файлах юнитов, что позволяет более гибко настраивать загрузку системы и управление службами.
Различные Systemd units¶
Systemd использует различные типы юнитов для управления соответствующими ресурсами системы:
- Service units (.service): Определяют службы, которые могут быть запущены, остановлены, перезапущены и т. д.
- Socket units (.socket): Управляют сетевыми сокетами и слушающими портами, что позволяет динамически запускать службы при поступлении сетевых запросов.
- Device units (.device): Представляют аппаратные устройства, опознанные в системе.
- Mount units (.mount) и Automount units (.automount): Отвечают за монтирование и автоматическое монтирование файловых систем.
- Target units (.target): Используются для группировки юнитов в логические группы, аналогично уровням выполнения в SysVinit, но более гибкие.
Редактирование и создание Systemd units¶
Для редактирования или создания юнитов systemd используются текстовые файлы конфигурации, обычно расположенные в /etc/systemd/system для пользовательских юнитов или в /lib/systemd/system для юнитов, установленных по умолчанию. Процесс может включать следующие шаги:
- Создание или редактирование файла юнита: Используйте текстовый редактор для создания нового файла юнита или редактирования существующего в соответствующем каталоге. Например,
sudo nano /etc/systemd/system/my_service.service. - Конфигурация юнита: Определите параметры юнита, такие как тип, команды для запуска и остановки службы, зависимости и т. д.
- Перезагрузка конфигурации systemd: После создания или изменения файла юнита необходимо перезагрузить конфигурацию systemd, используя команду
sudo systemctl daemon-reload. - Управление юнитом: Используйте команды
systemctlдля управления состоянием юнита, например,sudo systemctl start my_service.serviceдля запуска службы.
Systemd предлагает значительные улучшения в управлении системой по сравнению с SysVinit, включая лучшую поддержку современных систем, быструю загрузку и более гибкое управление службами.
Безопасность¶
Для безопасности 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 в /etc/systemd/system/secure-nginx.service:
[Unit] Description=Secure NGINX Web Server After=network.target [Service] ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf User=nginx Group=nginx CapabilityBoundingSet=CAP_NET_BIND_SERVICE NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=full ReadWritePaths=/var/lib/nginx /var/log/nginx RestrictAddressFamilies=AF_INET AF_INET6 MemoryDenyWriteExecute=yes PrivateDevices=yes ProtectHome=yes SystemCallFilter=@system-service SystemCallArchitectures=native [Install] WantedBy=multi-user.target
Команда
systemd-analyze security secure-nginx.serviceпокажет оценку уязвимостей и предложит улучшения.
Проанализировать время загрузки:
systemd-analyze blame systemd-analyze plot > boot.svg