В классической unix-модели root — это всё или ничего: либо процесс может абсолютно всё, либо ограничен правами обычного пользователя. POSIX capabilities (capabilities(7)) дробят этот монолит на отдельные биты — около сорока штук, от CAP_NET_BIND_SERVICE до CAP_SYS_TIME, каждый можно выдать процессу по отдельности, не трогая остальные.
Посмотреть, что уже есть у текущей сессии:
capsh --print
Покажет текущие capability sets процесса — Permitted, Effective, Inheritable и так далее; для большинства обычных пользовательских процессов список пустой.
Классический пример — веб-сервер, которому нужен порт 80 или 443, но запускать его под root ради одной операции (bind() на привилегированный порт) избыточно:
sudo setcap cap_net_bind_service=+ep /usr/local/bin/myapp
getcap /usr/local/bin/myapp
+ep значит добавить capability сразу в Effective и Permitted наборы файла — без Effective ядро её не учитывает, даже если она присутствует в Permitted. Привязка идёт к конкретному файлу на диске: после пересборки или передеплоя бинарника setcap придётся выполнить заново — ни systemd, ни пакетный менеджер это не запоминают сами. Через символическую ссылку capability тоже не работает — только напрямую на реальный файл.
От SELinux и AppArmor это отличается осью ограничения: MAC-системы решают, где (к каким путям, сокетам, ресурсам) процесс может обращаться, а capabilities — что именно из набора привилегий root ему доступно, независимо от путей. Используются вместе, а не вместо друг друга.
#linux #security
