Вступление
Возможности Linux - это специальные атрибуты в ядре Linux, которые предоставляют процессам и двоичным исполняемым файлам особые привилегии, которые обычно зарезервированы для процессов, эффективный идентификатор пользователя которых равен 0 (UID пользователя root и только пользователя root имеет 0).
В этой статье будут описаны некоторые из доступных возможностей, их использование, а также способы их установки и удаления. Обратите внимание, что настройка возможностей исполняемых файлов может поставить под угрозу безопасность вашей системы. Таким образом, вы должны рассмотреть возможность тестирования в непроизводственной системе, прежде чем внедрять возможности в производство.
Предпосылки
- Система Linux, в которой у вас есть root-доступ (либо через пользователя root, либо через пользователя с доступом sudo).
объяснение
По сути, цель возможностей состоит в том, чтобы разделить полномочия «root» на конкретные привилегии, чтобы при использовании процесса или двоичного файла, обладающего одной или несколькими возможностями, потенциальный ущерб был ограничен по сравнению с тем же процессом, выполняющимся как root.
Возможности могут быть установлены для процессов и исполняемых файлов. Процесс, полученный в результате выполнения файла, может получить возможности этого файла.
Возможности, реализованные в Linux, многочисленны, и многие из них были добавлены с момента их первоначального выпуска. Вот некоторые из них:
CAP_CHOWN
: Внести изменения в идентификатор пользователя и идентификатор группы файлов
CAP_DAC_OVERRIDE
: Переопределить ЦАП (дискреционный контроль доступа). Например, vto обойти проверки прав чтения / записи / выполнения.
CAP_KILL
: Обход проверок разрешений для отправки сигналов процессам.
CAP_SYS_NICE
: Повысить благородство процессов ( объяснение благородства можно найти здесь )
CAP_SYS_TIME
: Установка системных и аппаратных часов реального времени
Для полного списка, запустите man 7 capabilities
.
Возможности назначаются в наборах, а именно: «разрешенный», «наследуемый», «эффективный» и «окружающий» для потоков и «разрешенный», «наследуемый» и «эффективный» для файлов. Эти наборы определяют различные сложные поведения, их полное объяснение выходит за рамки этой статьи.
При настройке возможностей в файле мы почти всегда будем использовать, например, «разрешенный» и «эффективный» CAP_DAC_OVERRIDE+ep
. Обратите внимание на то +ep
, что обозначает вышеупомянутые множества.
Работа с файловыми возможностями
Требуемые пакеты
Есть два основных инструмента, getcap
и setcap
которые соответственно могут просматривать и устанавливать эти атрибуты.
- В Debian и Ubuntu эти инструменты предоставляются
libcap2-bin
пакетом, который можно установить с помощью:apt install libcap2-bin
- На CentOS и Fedora необходим
libcap
пакет:yum install libcap
- В Arch Linux они также предоставляются
libcap
:pacman -S libcap
Возможности чтения
Чтобы посмотреть, имеет ли файл какой-либо набор возможностей, вы можете просто запустить getcap /full/path/to/binary
, например:
root@demo:~# getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
root@demo:~# getcap /usr/bin/rcp
/usr/bin/rcp = cap_net_bind_service+ep
Если вы хотите узнать, какие возможности уже установлены в вашей системе, вы можете выполнить рекурсивный поиск по всей файловой системе с помощью следующей команды:
getcap -r /
В связи с тем, что виртуальные файловые системы (такие как /proc
) не поддерживают эти операции, приведенная выше команда выдаст тысячи ошибок, поэтому для более чистого вывода используйте следующее:
getcap -r / 2>/dev/null
Назначение и удаление возможностей
Чтобы установить определенную возможность для файла, используйте setcap "capability_string" /path/to/file
.
Чтобы удалить все возможности из файла, используйте setcap -r /path/to/file
.
Для демонстрации мы создадим пустой файл в текущем каталоге, дадим ему возможность и удалим его. Начните со следующего:
root@demo:~# touch testfile
root@demo:~# getcap testfile
Вторая команда не выдает никаких результатов, то есть этот файл не имеет никаких возможностей.
Далее установите возможность для файла:
root@demo:~# setcap "CAP_CHOWN+ep" testfile
root@demo:~# getcap testfile
testfile = cap_chown+ep
«CAP_CHOWN + ep» использовался в качестве примера, но любой другой может быть назначен таким образом.
Теперь удалите все возможности из testfile
:
root@demo:~# setcap -r testfile
root@demo:~# getcap testfile
Снова, не будет никакого вывода, потому что "CAP_CHOWN + ep" был удален.
Вывод
Возможности имеют много потенциальных применений и могут помочь повысить безопасность ваших систем. Если вы используете бит SUID в своих исполняемых файлах, подумайте о его замене на конкретные необходимые возможности.