Em um programa, estou enumerando namespaces de rede procurando /proc/pid/
por ns/net
links (sym). Este programa é executado dentro dos namespaces "raiz" (inicialização original) do próprio host. Normalmente, preciso executar a parte do scanner como root, caso contrário, terei apenas acesso limitado às /proc/pid/
informações de outros processos. Gostaria de evitar executar o scanner como root, se possível, e gostaria de evitar o incômodo de perder privilégios.
Qual recurso do Linux preciso definir para meu programa de scanner para que ele possa ser executado por usuários não raiz e ainda ver a /proc/pid/
árvore completa e ler os links de namespace da rede?
Depois de algumas tentativas e erros, descobri que de fato
CAP_SYS_PTRACE
é necessário.Em contraste,
CAP_DAC_READ_SEARCH
eCAP_DAC_OVERRIDE
não dê o acesso necessário, que incluireadlink()
e operações semelhantes.O que estou vendo pode ser verificado: primeiro, ptrace.c fornece a pista necessária em
__ptrace_may_access()
:E segundo, as funções relacionadas ao nsfs, como proc_ns_readlink() (indiretamente) chamam
__ptrace_may_access()
.E, finalmente, man 7 namespaces menciona:
Para ser preciso: CAP_SYS_PTRACE e CAP_SYS_ADMIN são necessários para entrar no namespace da rede, aqui está um exemplo:
Veja também esta resposta