
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>)
3으로 변경 kernel.perf_event_paranoid
하고 동일한 명령을 실행하면 루트가 아닌 사용자로서 다시 다음과 같은 결과를 얻습니다.
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
Linux 커널 문서에 내용이 나와 있지 않더라도 설정을 기본값인 4에서 3으로 변경하면 어느 정도 효과가 있습니다.
무엇을 제공합니까? Ubuntu는 새롭고 편집증적인 성능 수준을 추가하는 사용자 정의 패치와 함께 제공됩니까?
기타 배포판
데비안은 레벨 3을 만드는 비표준 패치를 가지고 있는 것 같습니다 perf_event_paranoid
:
Jeff Vander Stoep은 7월 27일에 패치를 게시했습니다. 이 패치는 해당 기능이 있는 프로세스로 제한하는 sysctl 매개변수(예:
kernel.perf_event_paranoid=3
) 에 대해 설정할 수 있는 또 다른 값을 추가합니다 . 현재는 기본적으로 2로 설정되어 있으며, 이는 적절한 기능 없이 프로세스에 대한 일부 성능 기능(원시 추적점 액세스, CPU 이벤트 액세스 및 커널 프로파일링)에 대한 액세스를 허용하지 않습니다. 패치는 기본값을 변경하지 않습니다. 그는 또한 3을 기본 perf_event_paranoid 값으로 만들도록 커널을 구성할 수 있는 또 다른 패치를 제출했습니다.perf_event_open()
CAP_SYS_ADMIN
perf_event_paranoid
(원천.)
그러나 우분투는 그보다 훨씬 더 편집증적인 것 같습니다.
답변1
레벨 4는 데비안 패치와 똑같은 일을 합니다. 즉, 권한이 없는 프로세스가 perf_event_open()
. 그러나 제한은 편집증 레벨 3이 아닌 편집증 레벨 4에서 시작됩니다.
현재 편집증 수준은 커널 소스 파일의 주석에 문서화되어 있습니다 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
Nick이 올바르게 지적했듯이 권한이 없는 사용자에 대해 비활성화하는 것과 함께 편집증 수준 4는 권한 있는 파일에도 동일한 제한을 적용하는 것으로 보입니다.
예를 들어, Ubuntu 20.04 시스템에서는 다음에 따라 perf_users 그룹을 설정했습니다.공식 문서, 다음과 perf
같은 기능을 부여받습니다.
$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep
편집증 수준 3으로 실행하면 권한이 없는 사용자의 경우 예상대로 작동합니다. 그러나 편집증 수준 4에서는 perf
파일 기능에도 불구하고 질문에서 오류를 반환합니다.