
В моей установке 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
возвращает ошибку из вопроса, несмотря на возможности файла.