AmbientCapabilities= и CapabilityBoundingSet=: права без root
Возможности — это разрезанные на части права root. AmbientCapabilities= выдаёт процессу конкретные возможности, CapabilityBoundingSet= задаёт потолок: чего у процесса не может быть ни при каких условиях.
Что делает
Самый частый случай — порт ниже 1024. Вместо запуска службы от root ей выдают одну возможность CAP_NET_BIND_SERVICE: она сможет занять 80-й порт и ничего больше. Это заметно лучше, чем полные права из-за одного порта.
Два параметра работают вместе: выданная возможность обязана входить в ограничивающий набор. Иначе systemd откажет с кодом 218/CAPABILITIES — потолок ниже запроса.
Где ставится. В секции [Service]. Имена возможностей пишутся полностью, с префиксом CAP_.
Значения
| Значение | Что происходит |
|---|---|
CAP_NET_BIND_SERVICE | привязка к портам ниже 1024. |
CAP_NET_ADMIN | настройка сети: интерфейсы, маршруты, правила. |
CAP_SYS_NICE | повышение приоритета процесса и политики реального времени. |
CAP_SYS_RESOURCE | превышение жёстких пределов ресурсов. |
Пример
Служба от обычного пользователя, слушающая 443-й порт.
[Service]
User=web
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=no
ExecStart=/usr/local/bin/web --listen 0.0.0.0:443
Запрет новых привилегий тут отключён нарочно: он закрывает механизм, через который выдаются постоянные возможности.
Типичные ошибки
Возможность вне ограничивающего набора не выдаётся: запуск падает с кодом 218/CAPABILITIES.
NoNewPrivileges=yes несовместим с выдачей постоянных возможностей.
Опечатка в имени (например CAP_NET_BIND вместо CAP_NET_BIND_SERVICE) приводит к отказу применения.
Возможности не заменяют права на файлы: доступ к файлу они не открывают.
Связанные ошибки
- status=218/CAPABILITIES в systemdКод 218/CAPABILITIES: не удалось применить набор возможностей процесса из CapabilityBoundingSet= или AmbientCapabilities=.
- bind: Permission denied при привязке к портуОтказ при привязке к порту: обычно порт ниже 1024 у службы от непривилегированного пользователя. Как дать возможность CAP_NET_BIND_SERVICE.
- status=227/NO_NEW_PRIVILEGES в systemdКод 227/NO_NEW_PRIVILEGES: не удалось включить запрет получения новых привилегий. Редкий код, обычно из-за окружения.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.exec(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)