
Na minha instalação do Ubuntu Focal, kernel.perf_event_paranoid
está definido como 4 por padrão:
$ sysctl kernel.perf_event_paranoid
kernel.perf_event_paranoid = 4
(Eu verifiquei /etc/sysctl.conf
o diretório de configuração associado, não configurei isso.)
Isso me parece estranho, porque a documentação do kernel não descreve nenhum efeito adicional para valores superiores a 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
(Fonte.)
Fiz uma pesquisa rápida no código-fonte do kernel principal e não consegui encontrar nenhum lugar onde perf_event_paranoid
fosse comparado a um número superior a 2.
No entanto, definir como 4 tem um efeito. Executei o seguinte comando perf, perf_event_paranoid
definido como 4, como umnão raizdo utilizador:
perf stat -e context-switches,cpu-migrations -r 1 -- sleep 1
Apresenta o seguinte erro:
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>)
Se eu mudar kernel.perf_event_paranoid
para 3 e executar o mesmo comando, obtenho o seguinte resultado, novamente como usuário não 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
Portanto, alterar a perf_event_paranoid
configuração do padrão 4 para 3 tem algum efeito, mesmo que a documentação do kernel Linux não diga o quê.
O que da? O Ubuntu vem com um patch personalizado que adiciona um nível de desempenho novo e mais paranóico?
Outras distribuições
O Debian parece carregar um patch não padrão criando um perf_event_paranoid
nível 3:
Jeff Vander Stoep postou o patch em 27 de julho. Ele adiciona outro valor que pode ser definido para o parâmetro sysctl (ou seja,
kernel.perf_event_paranoid=3
) que restringeperf_event_open()
a processos com esseCAP_SYS_ADMIN
recurso. Atualmente,perf_event_paranoid
está definido como 2 por padrão, o que não permite o acesso a alguns recursos de desempenho (acesso bruto a pontos de rastreamento, acesso a eventos de CPU e criação de perfil de kernel) para processos sem os recursos adequados; o patch não altera o padrão. Ele também enviou outro patch que permitiria configurar o kernel para fazer com que 3 fosse o valor perf_event_paranoid padrão.
(Fonte.)
Mas parece que o Ubuntu é ainda mais paranóico do que isso.
Responder1
O nível 4 faz exatamente a mesma coisa que o patch do Debian: ele desativa o uso de processos sem privilégios perf_event_open()
. No entanto, a restrição entra em ação no nível de paranóia 4, em vez do nível de paranóia 3.
Os atuais níveis de paranóia estão documentados em um comentário no código-fonte do kernel, no arquivo 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
*/
O commit que faz esta mudança pode ser encontradoaqui. (Nota: a mensagem de commit e os comentários do kernel se contradizem. Os comentários do kernel parecem corretos para mim.)
Para resumir:
- Níveis -1 a 2: iguais ao kernel principal.
- Nível 3: Igual ao nível 2? Não foi possível confirmar isso 100%. Existe uma constante
PERF_SECURITY_TRACEPOINT
definida como 3 que ainda é usada em alguns lugares. - Nível 4: Desabilite perf_event_open totalmente para usuários sem privilégios.
Responder2
Além de desativá-lo para usuários não privilegiados, como Nick aponta corretamente, o nível 4 de paranóia também parece aplicar as mesmas restrições a arquivos privilegiados.
Por exemplo, no meu sistema Ubuntu 20.04 eu configurei um grupo perf_users de acordo com odocumentação oficial, e dotado perf
dos seguintes recursos
$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep
Executar com paranóia nível 3 funciona conforme o esperado para usuários não privilegiados. No nível de paranóia 4, entretanto, perf
retorna o erro da pergunta, apesar dos recursos do arquivo.