Capabilities (Русский) - ArchWiki

Jump to content

# Capabilities (Русский)

4 languages

- English
- 日本語
- Português
- 中文（简体）

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

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

- Man-страницы: capabilities(7), setcap(8), getcap(8)
- Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions
- Seccomp BPF (SECure COMPuting with filters)

Category:

- Security (Русский)