PrivateDevices= и защита устройств в systemd
Выдаёт службе урезанный /dev: только базовые псевдоустройства вроде null, zero и random. Физические устройства становятся недоступны.
Что делает
Большинству прикладных служб доступ к устройствам не нужен, и параметр включается безболезненно. Он же закрывает возможность читать диск напрямую в обход прав файловой системы.
Рядом стоят родственные защиты: ProtectKernelTunables= запрещает менять настройки ядра через /proc и /sys, ProtectKernelModules= — загружать модули, ProtectClock= — менять системное время. Для точечного доступа к конкретному устройству есть DeviceAllow=.
Где ставится. В секции [Service].
Значения
| Значение | Что происходит |
|---|---|
PrivateDevices=yes | урезанный /dev без физических устройств. |
ProtectKernelTunables=yes | запрет изменения настроек ядра. |
ProtectKernelModules=yes | запрет загрузки модулей ядра. |
DeviceAllow=/dev/ttyUSB0 rw | точечный доступ к устройству. |
Пример
Служба, которой нужен только один последовательный порт.
[Service]
PrivateDevices=yes
DeviceAllow=/dev/ttyUSB0 rw
ProtectKernelTunables=yes
ProtectKernelModules=yes
Порядок важен по смыслу: сначала закрываем всё, потом открываем одно нужное устройство.
Типичные ошибки
Службам, работающим с оборудованием (мониторинг диска, работа с портами), параметр ломает доступ.
Вместе с ним включается запрет получения новых привилегий: это может сломать setuid-программы внутри.
Нарушение запрета на изменение настроек ядра проявляется как отказ в доступе к /proc — причину легко не связать с unit-файлом.
Связанные ошибки
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=226/NAMESPACE в systemdКод 226/NAMESPACE: не удалось настроить пространства имён монтирования, UTS или IPC. Частая причина — путь в ReadOnlyPaths= или ProtectHome=.
- Read-only file system в журнале службыСлужба не может писать: файловая система только для чтения. Разбор: параметры изоляции unit, монтирование ro, ошибки файловой системы.
Рядом стоящие параметры
Источники
- systemd.exec(5)
- systemd.resource-control(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)