Что делает паранойя четвертого уровня?

Что делает паранойя четвертого уровня?

В моей установке Ubuntu Focal kernel.perf_event_paranoidпо умолчанию установлено значение 4:

$ sysctl kernel.perf_event_paranoid
kernel.perf_event_paranoid = 4

(Я проверил /etc/sysctl.confи соответствующий каталог конфигурации, я этого не устанавливал.)

Мне это кажется странным, поскольку в документации ядра не описывается никакого дополнительного эффекта для значений выше 2:

perf_event_paranoid:

Controls use of the performance events system by unprivileged
users (without CAP_SYS_ADMIN).  The default value is 2.

 -1: Allow use of (almost) all events by all users
     Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>=0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
     Disallow raw tracepoint access by users without CAP_SYS_ADMIN
>=1: Disallow CPU event access by users without CAP_SYS_ADMIN
>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN

(Источник.)

Я быстро просмотрел исходный код основного ядра и не нашел ни одного места, где бы perf_event_paranoidсравнивалось число больше 2.

Однако установка на 4 имеет эффект. Я запустил следующую команду perf с perf_event_paranoidустановкой на 4 в качественекорневойпользователь:

perf stat -e context-switches,cpu-migrations -r 1 -- sleep 1

Появляется следующая ошибка:

Error:
Access to performance monitoring and observability operations is limited.
Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open
access to performance monitoring and observability operations for processes
without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.
More information can be found at 'Perf events and tool security' document:
https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
perf_event_paranoid setting is 4:
  -1: Allow use of (almost) all events by all users
      Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>= 0: Disallow raw and ftrace function tracepoint access
>= 1: Disallow CPU event access
>= 2: Disallow kernel profiling
To make the adjusted perf_event_paranoid setting permanent preserve it
in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)

Если я изменю значение kernel.perf_event_paranoidна 3 и выполню ту же команду, я получу следующий результат, снова как пользователь без прав root:


 Performance counter stats for 'sleep 1':

                 0      context-switches:u                                          
                 0      cpu-migrations:u                                            

       1.000502603 seconds time elapsed

       0.000460000 seconds user
       0.000000000 seconds sys

Таким образом, изменение perf_event_paranoidнастройки со значения по умолчанию 4 на 3 имеет некоторый эффект, даже если в документации ядра Linux не говорится, какой именно.

Что дает? Поставляется ли Ubuntu с пользовательским патчем, который добавляет новый, более параноидальный уровень производительности?

Другие дистрибутивы

Судя по всему, в Debian имеется нестандартный патч, создающий perf_event_paranoidуровень 3:

Джефф Вандер Стоеп опубликовал патч 27 июля. Он добавляет еще одно значение, которое можно задать для параметра sysctl (т. е. kernel.perf_event_paranoid=3), ограничивающего perf_event_open()процессы с CAP_SYS_ADMINвозможностью. В настоящее время perf_event_paranoidпо умолчанию установлено значение 2, что запрещает доступ к некоторым функциям perf (доступ к необработанным точкам трассировки, доступ к событиям ЦП и профилирование ядра) процессам без соответствующих возможностей; патч не изменяет значение по умолчанию. Он также представил еще один патч, который позволит настроить ядро ​​так, чтобы значение perf_event_paranoid по умолчанию было равно 3.

(Источник.)

Но, похоже, Ubuntu еще более параноидальна.

решение1

Уровень 4 делает то же самое, что и патч Debian: он отключает использование непривилегированных процессов perf_event_open(). Однако ограничение вступает в силу на уровне паранойи 4, а не на уровне паранойи 3.

Текущие уровни паранойи задокументированы в комментарии в исходном коде ядра, в файле kernel/events/core.c.

/*
 * perf event paranoia level:
 *  -1 - not paranoid at all
 *   0 - disallow raw tracepoint access for unpriv
 *   1 - disallow cpu events for unpriv
 *   2 - disallow kernel profiling for unpriv
 *   4 - disallow all unpriv perf event use
 */

Коммит, вносящий это изменение, можно найти здесьздесь. (Примечание: сообщение о коммите и комментарии ядра противоречат друг другу. Комментарии ядра кажутся мне правильными.)

Обобщить:

  • Уровни с 1 по 2: То же, что и у основного ядра.
  • Уровень 3: То же, что и уровень 2? Не могу подтвердить это на 100%. Есть константа, PERF_SECURITY_TRACEPOINTравная 3, которая до сих пор используется в некоторых местах.
  • Уровень 4: Полностью отключить perf_event_open для непривилегированных пользователей.

решение2

Наряду с отключением для непривилегированных пользователей, как правильно отмечает Ник, уровень паранойи 4, похоже, применяет те же ограничения к привилегированным файлам.

Например, в моей системе Ubuntu 20.04 я создал группу perf_users в соответствии софициальная документация, и наделены perfследующими возможностями

$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep

Запуск с уровнем паранойи 3 работает как и ожидалось для непривилегированных пользователей. Однако на уровне паранойи 4 perfвозвращает ошибку из вопроса, несмотря на возможности файла.

Связанный контент