Capabilities (Русский)
Привилегии (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 не поддерживает какую-либо систему мандатного управления доступом.
Программы, для которых удобно использовать привилегии
Перечисленные ниже пакеты не имеют файлов с атрибутом 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