Capabilities (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Capabilities. Дата последней синхронизации: 22 сентября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Привилегии (POSIX 1003.1e, capabilities(7)) позволяют предоставить программам доступ к определённым возможностям, которые обычно есть только у суперпользователя, позволяя избежать запуска программ от имени root. Разработчикам программ рекомендуется заменить использование мощного атрибута setuid в системных исполняемых файлах на минимально необходимый программе набор привилегий. Многие пакеты используют привилегии; например, привилегия CAP_NET_RAW используется в fping. Это позволяет запускать fping от имени обычного пользователя (как при использовании метода setuid), но при этом процесс не получает root-права, что ограничивает возможность эксплуатации потенциальных уязвимостей в fping.

Реализация

Для реализации привилегий в Linux используются расширенные атрибуты (xattr(7)) в пространстве имён security. Расширенные атрибуты поддерживаются всеми основными файловыми системами Linux, в том числе Ext2, Ext3, Ext4, Btrfs, JFS, XFS и Reiserfs. Следующий пример выводит привилегии fping с помощью getcap, а затем выводит те же данные в закодированном виде с помощью getfattr:

$ getcap /usr/bin/fping
/usr/bin/fping cap_net_raw=ep
$ getfattr -d -m "^security\\." /usr/bin/fping
# file: usr/bin/fping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

Расширенные атрибуты копируются автоматически при использовании cp -a, но некоторые другие программы требуют специального флага: например, rsync -X.

Привилегии устанавливаются install-скриптами в пакетах Arch (например, fping.install).

Администрирование и обслуживание

Если у пакета слишком много ненужных привилегий — это считается ошибкой, о которой стоит сообщить. Использование привилегий, фактически эквивалентных root-доступу (CAP_SYS_ADMIN) или позволяющих легко получить root-доступ (CAP_DAC_OVERRIDE), ошибкой не считается, так как Arch не поддерживает какую-либо систему мандатного управления доступом.

Важно: Многие привилегии позволяют тривиально получить root-доступ. Примеры и объяснения можно посмотреть в сообщении Брэда Шпенглера: False Boundaries and Arbitrary Code Execution.

Программы, для которых удобно использовать привилегии

Перечисленные ниже пакеты не имеют файлов с атрибутом setuid и для работы требуют права root. Для них можно добавить привилегии, чтобы обычные пользователи могли использовать программу без получения root-доступа.

Символы +ep означают «effective permitted», подробнее в man-странице capabilities(7) § File capabilities.

beep

# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep

chvt

# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt

iftop

# setcap cap_net_raw+ep /usr/bin/iftop

mii-tool

# setcap cap_net_admin+ep /usr/bin/mii-tool

mtr

# setcap cap_net_raw+ep /usr/bin/mtr-packet

nethogs

# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs

wavemon

# setcap cap_net_admin+ep /usr/bin/wavemon

Полезные команды

Поиск файлов с setuid-root:

$ find /usr/bin /usr/lib -perm /4000 -user root

Поиск файлов с setgid-root:

$ find /usr/bin /usr/lib -perm /2000 -group root

Временная выдача привилегий

С помощью capsh(1) можно запустить программу с указанными привилегиями без редактирования расширенных атрибутов исполняемого файла. Следующий пример демонстрирует, как подключиться к процессу через GDB с помощью привилегии CAP_SYS_PTRACE:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

Пример прослушивания привилегированного порта с помощью netcat:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
Listening on 0.0.0.0 123

Смотрите также