Эта серия статей разделена на три части:
-
Руководство по началу работы с возможностями 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
а такжеeffective
Collection». Таким образом, 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, и ответьте на официальную учетную запись ◉Добавить группу◉, чтобы присоединиться к нашей облачной коммуникационной группе и обсудить облачные технологии с Сунь Хунляном, директором Чжаном, Ян Мином и другими важными шишками.