Иногда программе нужен root только для одной операции (bind к 80 порту, raw socket, cap_sys_ptrace). Для этого в Linux есть capabilities — они управляются через
setcap.Проверка
capabilities у исполняемого файла:getcap /usr/bin/ping
Типичный вывод:
/usr/bin/ping cap_net_raw=ep
В современных дистрибутивах
ping часто не setuid-root, а работает через capabilities, получая доступ к raw socket.Пример: разрешить бинарнику слушать порт
<1024 без root:sudo setcap cap_net_bind_service=ep ./server
Теперь запуск возможен от обычного пользователя:
./server
Bind к :80 будет работать без sudo.Проверка назначенных
capabilities:getcap ./server
Удаление
capabilities у бинарника, если нужно полностью убрать выданные ранее права и вернуть его в обычное состояние:sudo setcap -r ./server
Несколько
capabilities сразу, если бинарнику требуется больше одного привилегированного действия:sudo setcap cap_net_bind_service,cap_sys_time=ep ./tool
Просмотр списка и описания всех
capabilities:man 7 capabilities
Важно: работает только на файловых системах с поддержкой extended attributes,
cp по умолчанию сбрасывает xattr (используйте cp --preserve=xattr или -a), tar сохраняет capabilities только с --xattrs🔥
Capabilities — способ выдавать минимально необходимые права, вместо запуска всего от root.➡️ DevOps Ready | #практика