Утилита capsh в Ubuntu: аудит и изоляция Capabilities

Введение

Для тонкой настройки прав процессов и исследования механизма Linux Capabilities незаменимым инструментом системного инженера выступает обертка capsh (Capability Shell Wrapper). В данном руководстве на примере дистрибутива Ubuntu подробно рассматривается практическая работа с этой утилитой: от первичного развертывания пакетов и инспекции текущих привилегий до декодирования битовых масок, безвозвратного отзыва полномочий (Drop) и безопасного переключения контекста пользователя.

Инсталляция libcap2-bin и аудит текущих привилегий процесса (–print)

Для получения доступа к исполняемому файлу capsh в операционной системе необходимо установить набор системных утилит libcap2-bin.

Установка пакета libcap2-bin в среде Ubuntu

Ключ capsh --print инициирует полный диагностический вывод параметров безопасности работающего процесса. Команда отображает все актуальные наборы привилегий (Effective, Permitted, Bounding и др.), идентификаторы UID/GID, а также состояние битов защиты Securebits.
Изучение полученных данных позволяет мгновенно оценить фактические полномочия текущей командной оболочки в операционной системе.
⚙️ [Ключевые параметры утилиты]

--print : формирует подробную сводку по всем наборам Capabilities, параметрам учетных записей и защитным флагам процесса.
--drop : выполняет безвозвратное исключение указанных привилегий из ограничивающего набора (Bounding set).
--caps : задает точную конфигурацию назначаемых процессу полномочий в виде текстовой спецификации.
--user : переключает выполнение в контекст заданной системной учетной записи с соответствующими правами групп.
--inh : определяет набор наследуемых привилегий (Inheritable set), доступных при выполнении execve.
--addamb : активирует передачу прав через внешний набор (Ambient set) исполняемым файлам без установленных файловых возможностей.
--secbits : задает защитные флаги Securebits, блокирующие несанкционированную модификацию привилегий процесса.
--chroot : изолирует файловую систему процесса, смещая корневую директорию в указанную точку монтирования.

Инспекция наборов привилегий с помощью capsh –print

Проверка поддержки возможностей ядром и декодирование масок (–supports, –decode)

Инструкция capsh --supports=cap_net_raw позволяет удостовериться, что загруженное ядро Linux способно работать с полномочием cap_net_raw.
При наличии корректной поддержки со стороны ядра процесс завершается без текстовых сообщений с нулевым статусом возврата (код 0).

Верификация поддержки cap_net_raw на уровне ядра

Аналогичным образом вызов capsh --supports=cap_sys_admin проверяет доступность прав категории cap_sys_admin, охватывающих наиболее широкий спектр системных операций.
Успешный код завершения делает эту проверку удобным триггером в автоматизированных bash-скриптах для предварительного аудита функциональности окружения.

Проверка совместимости ядра с привилегией cap_sys_admin

Команда capsh --decode=0x000001ffffffffff транслирует шестнадцатеричные числовые битовые маски (часто встречающиеся в /proc/[PID]/status) в понятный список строковых идентификаторов.
В результате дешифровки администратор получает детальную расшифровку всех включенных флагов, включая cap_chown, cap_sys_admin, cap_bpf и смежные права.

Преобразование шестнадцатеричной маски в список возможностей

Ограничение Bounding Set и изоляция контекста выполнения (–drop)

Конструкция capsh --drop=cap_chown,cap_setuid --print гарантирует бесповоротное исключение прав cap_chown и cap_setuid из ограничивающего набора (Bounding set) с последующим выводом обновленной конфигурации.
В секциях Bounding set и Current IAB результирующего отчета можно наглядно убедиться в отсутствии исключенных возможностей, что на практике реализует концепцию наименьших привилегий.

Отзыв прав cap_chown и cap_setuid из Bounding Set

С помощью команды capsh --drop=cap_chown -- -c "capsh --print | grep 'Bounding set'" запускается изолированная субоболочка, внутри которой проверяется реальное состояние ограничивающего набора.
Отфильтрованная строка наглядно демонстрирует, что дочерние процессы надежно наследуют урезанную конфигурацию прав, полностью лишаясь возможности смены владельца файлов через cap_chown.

Аудит наследования ограничивающего набора в дочерней оболочке

Запуск от непривилегированного пользователя с точечными правами (–user, –caps)

Вызов capsh --user=nobody --print переводит рабочий сеанс под учетную запись непривилегированного пользователя nobody, после чего отображает текущие реквизиты доступа.
Терминал фиксирует изменение UID и GID на значение nobody (65534), демонстрируя стандартную защитную конфигурацию, вступающую в силу при базовой смене пользователя без дополнительных разрешений.

Переход в контекст учетной записи nobody

Команда capsh --user=nobody --caps="cap_net_bind_service+ep cap_setpcap-ep" --print выполняет понижение прав до пользователя nobody, но при этом точечно делегирует право cap_net_bind_service в действующий (Effective) и разрешенный (Permitted) наборы.
Значение cap_net_bind_service=ep в блоке Current подтверждает: непривилегированный сервис может безопасно открывать привилегированные сетевые порты (ниже 1024) без необходимости запуска под полным суперпользовательским доступом root.

Делегирование права cap_net_bind_service непривилегированному пользователю

Мы рассмотрели практические сценарии применения инструмента capsh в Ubuntu для аудита и гранулярного разграничения полномочий через механизм Linux Capabilities.
Отказ от избыточных прав суперпользователя в пользу минимально необходимых возможностей позволяет выстроить устойчивую к компрометации архитектуру безопасности сервера.