Руководство по началу работы с возможностями Linux: базовая практика

задняя часть Linux

Эта серия статей разделена на три части:

Предыдущая статьяПредставлены предыстория рождения и основные принципы возможностей Linux.Эта статья покажет, как просматривать и устанавливать возможности файлов на конкретных примерах.

В основном в системе Linux есть два инструмента для управления возможностями:libcapа такжеlibcap-ng.libcapпри условииgetcapа такжеsetcapДве команды для просмотра и установки возможностей файла соответственно, а также предоставляютcapshдля просмотра возможностей текущего процесса оболочки.libcap-ngПроще использовать, используйте ту же командуfilecapдля просмотра и настройки возможностей.

1. libcap

Установка очень проста, на примере CentOS вы можете установить ее с помощью следующей команды:

$ yum install -y libcap

Если вы хотите просмотреть возможности текущего процесса оболочки, вы можете использоватьcapshЗаказ. Ниже приведено выполнение пользователя root в системе CentOS.capshВыход:

$ capsh --print

Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root)

объяснять:

  • Current: указывает действующие возможности и разрешенные возможности текущего процесса оболочки. Он может содержать несколько групп, и представление каждой группы выглядит следующим образом.capability[,capability…]+(e|i|p)eзначит эффективный,iозначает наследственный,pУказывает разрешено. Разные группы разделяются пробелами, например:Current: = cap_sys_chroot+ep cap_net_bind_service+eip. Чтобы привести еще один пример,cap_net_bind_service+e cap_net_bind_service+ipа такжеcap_net_bind_service+eipэквивалентность.

  • Bounding set: это представляет только возможности в коллекции Bounding, за исключением других коллекций, поэтому нет необходимости добавлять конец группировки.+....

  • Securebits: Я даже не знаю, что это за чертовщина.

Информация, выводимая этой командой, относительно ограничена.Для получения полной информации вы можете просмотреть файловую систему /proc, например, текущий процесс оболочки./proc/?/status. Одним из важных состояний являетсяNoNewPrivs, вы можете просмотреть его с помощью следующей команды:

grep NoNewPrivs /proc/?/status

NoNewPrivs:    0

согласно сprctl(2)как описано в , начиная с Linux 4.10,/proc/[pid]/statusсерединаNoNewPrivsЗначение представляет потокno_new_privsАтрибуты. Что касаетсяno_new_privsЧто именно он делает, я объясню отдельно ниже.

no_new_privs

В целом,execve()Системные вызовы могут предоставлять вновь запущенному процессу привилегии, которых нет у его родительского процесса.setuidа такжеsetgidдля установки uid и gid процесса программы и прав доступа к файлам. Это оставляет много лазеек для тех, у кого плохие намерения, они могут напрямую увеличить разрешения процесса через форк, чтобы достичь скрытых мотивов.

Для решения этой проблемы в ядро ​​Linux, начиная с версии 3.5, ввелиno_new_privsАтрибут (на самом деле бит, который можно включать и выключать) предоставляет процессуexecve()Используйте эффективные и безопасные методы для продолжения на протяжении всей фазы.

  • включенныйno_new_privsПосле этого функция execve гарантирует, что все операции должны быть вызваныexecve()Он может быть выполнен только после вынесения судебного решения и разрешения. Это гарантирует, что ни поток, ни дочерние потоки не смогут получить дополнительные разрешения, поскольку setuid и setgid не могут быть выполнены, а права доступа к файлам не могут быть установлены.

  • Как только текущий потокno_new_privsПосле установки этот бит не может быть очищен дочерними потоками, порожденными fork, clone или execve.

Docker может передавать параметры--security-optвключатьno_new_privsсвойства, такие как:docker run --security-opt=no_new_privs busybox. Давайте посмотрим на примерno_new_privsроль свойств.

Во-первых, запустите фрагмент кода C, чтобы отобразить эффективный идентификатор пользователя текущего процесса:

$ cat testnnp.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
        printf("Effective uid: %d\n", geteuid());
        return 0;
}
$ make testnnp
cc     testnnp.c   -o testnnp

Поместите исполняемый файл в образ докера:

FROM fedora:latest
ADD testnnp /root/testnnp
RUN chmod +s /root/testnnp
ENTRYPOINT /root/testnnp

Создайте образ:

$ docker build -t testnnp .
Step 1 : FROM fedora:latest
 ---> 760a896a323f
Step 2 : ADD testnnp /root/testnnp
 ---> 6c700f277948
Removing intermediate container 0981144fe404
Step 3 : RUN chmod +s /root/testnnp
 ---> Running in c1215bfbe825
 ---> f1f07d05a691
Removing intermediate container c1215bfbe825
Step 4 : ENTRYPOINT /root/testnnp
 ---> Running in 5a4d324d54fa
 ---> 44f767c67e30
Removing intermediate container 5a4d324d54fa
Successfully built 44f767c67e30

Проделаем два эксперимента, первый не открываяno-new-privilegesЗапустите контейнер без:

$ docker run -it --rm --user=1000  testnnp
Effective uid: 0

Из вывода видно, что пока для исполняемого файла установлен флаг SUID, даже если мы используем обычного пользователя (UID=1000) для запуска контейнера, эффективным пользователем процесса станет root.

Затем включитеno-new-privilegesЗапустите контейнер в помещении, чтобы предотвратить выполнение исполняемого файла с установленным флагом SUID для преобразования UID:

$ docker run -it --rm --user=1000 --security-opt=no-new-privileges testnnp
Effective uid: 1000

Вы можете видеть, он включенno_new_privsПосле атрибута эффективный идентификатор пользователя потока не станет корневым, даже если исполняемый файл установил флаг SUID. Таким образом, даже если код в образе представляет собой угрозу безопасности, его все равно можно предотвратить от атаки, предотвратив повышение привилегий.

Kubernetes также можно включитьno_new_privs, но логика немного сложнее. Когда стручокSecurityContextопределенныйallowPrivilegeEscalationКогда значение поля равно false (по умолчанию false), если какое-либо из следующих условий не выполняется, оно будет включено.no_new_privsАтрибуты:

  • уже настроенprivileged=true

  • повысилсяCAP_SYS_ADMINспособности, то естьcapAdd=CAP_SYS_ADMIN

  • Запуск от имени пользователя root, т.е. UID=0

Например, при установкеprivileged=trueа такжеallowPrivilegeEscalation=falseне включаетсяno_new_privsАтрибуты. Точно так же установитеcapAdd=CAP_SYS_ADMINа такжеallowPrivilegeEscalation=falseне включаетсяno_new_privsАтрибуты.

Управление возможностями

в состоянии пройтиgetcapдля просмотра возможностей файла, например:

$ getcap /bin/ping /usr/sbin/arping

/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/arping = cap_net_raw+p

также можно использовать-rПараметры для рекурсивного запроса:

$ getcap -r /usr 2>/dev/null

/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/bin/newgidmap = cap_setgid+ep
/usr/bin/newuidmap = cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p

Если вы хотите просмотреть возможности процесса, вы можете напрямую использоватьgetpcaps, за которым следует PID процесса:

$ getpcaps 1234

Если вы хотите просмотреть возможности набора взаимосвязанных потоков (например, nginx), вы можете посмотреть на это так:

$ getpcaps $(pgrep nginx)

Здесь вы увидите, что только основной поток имеет возможности, а подпотоки и другие рабочие процессы не имеют никаких возможностей, потому что только мастеру нужны специальные разрешения, такие как прослушивание сетевого порта, а другим потокам нужно только отвечать на запросы. .

Возможности файла настроек можно использоватьsetcap, синтаксис следующий:

$ setcap CAP+set filename

Например, будетCAP_CHOWNа такжеCAP_DAC_OVERRIDEвозможности, добавленные кpermittedа такжеeffectiveсобирать:

$ setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1

Если вы хотите удалить возможности файла, вы можете использовать-rпараметр:

$ setcap -r filename

2. libcap-ng

Установка тоже очень проста, на примере CentOS:

$ yum install libcap-ng-utils

Применение

libcap-ng используетfilecapкоманда для управления возможностями файла. Есть несколько замечаний:

  • При добавлении, удалении или просмотре возможностей в файловой шапке название возможностей не нужно указывать.CAP_префикс (например, используйтеNET_ADMINзаменятьCAP_NET_ADMIN);

  • filecap не поддерживает относительные пути, только абсолютные;

  • filecap не позволяет указать набор возможностей, возможности будут добавлены только вpermittedа такжеeffectiveсобирать.

Посмотреть возможности файла:

$ filecap /full/path/to/file

Рекурсивно просмотреть возможности всех файлов в каталоге:

$ filecap /full/path/to/dir

Например:

$ filecap /usr/bin

file                 capabilities
/usr/bin/newgidmap     setgid
/usr/bin/newuidmap     setuid

Уведомление:filecap покажет только "возможности добавлены вpermittedа такжеeffectiveCollection». Таким образом, ping и arping здесь не показаны.

Рекурсивно просматривать возможности всех файлов во всей системе:

$ filecap /
# or
$ filecap -a

Синтаксис возможностей файла настроек следующий:

$ filecap /full/path/to/file cap_name

Например:

$ filecap /usr/bin/tac dac_override

Удалить возможности из файла:

$ filecap /full/path/to/file none

3. Резюме

В этой статье показано, как управлять возможностями исполняемых файлов с помощью двух инструментов, и в качестве примера используется docker.no_new_privsсилы. Если позволяют условия, рекомендуется попробовать использовать возможности для замены полных прав root или установки идентификаторов SUID в будущем.

4. Ссылки

Публичный аккаунт WeChat

Отсканируйте QR-код ниже, чтобы подписаться на официальную учетную запись WeChat, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.