Meu objetivo principal é permitir que usuários em um grupo específico executem programas que exigem a capacidade cap_sys_admin (por exemplo, perf) após SSH-ing no Ubuntu 22.04. Uma solução simples é modificar perf_event_paranoid, mas essa mudança é global e não desejada. Eu verifiquei o processo bash gerado por sshd — getpcaps gera =, indicando nenhuma capacidade, então perf não pode ser executado sem sudo.
Aprendi que o sshd usa PAM para gerenciamento de privilégios. Modifiquei sshd_config para definir UsePAM como sim (incerto se necessário para autenticação de chave SSH) e adicionei cap_sys_admin @mygroup antes de none * em /etc/security/capability.conf. Após o relogin, o processo do shell ganhou cap_sys_admin=i, mas essa capacidade está apenas no conjunto herdável, impedindo a execução direta do perf. A documentação do capacity.conf confirma que afeta apenas o conjunto herdável via pam_cap.so. Agora estou preso em mais ajustes de configuração para atingir meu objetivo.
Você realmente não quer dar a um usuário regular
CAP_SYS_ADMIN
. Isso os torna root, efetivamente¹. Adicionar o usuário a /etc/sudoers para permitir que eles executemperf record
(nenhum argumento permitido) seria mais seguro.No entanto, você está executando o Ubuntu 22.04, então sua distribuição Linux oferece kernels relativamente modernos (diz
apt-get
). Isso significa que com Kernel > 5.9, você pode dar um processoCAP_PERFMON
.Então, a próxima coisa: Processos têm capacidades que eles obtêm por meio de invocação; os próprios usuários não (você pode definir sinalizadores em um arquivo executável que concede capacidades com base no usuário, no entanto). Então, você definiria as sinalizações apropriadas no
perf
executável para conceder a ele as capacidades certas. A ideia de capacidades é que você não deixe um usuário acidentalmente fazer coisas ruins, mas que você as use pelo menor tempo possível e descarte capacidades assim que não precisar mais delas. Então, iniciar uma sessão SSH completa com o processo de invocação permitindo uma capacidade herdada parece antitético!https://docs.kernel.org/admin-guide/perf-security.html detalha como você lidaria com isso para um único executável (
perf
): Você adiciona um grupo, torna a propriedade do grupo do executável aquele grupo que se torna (além do root) a única parte capaz de executar o executável, e você adiciona o usuário que deseja executar aquele executável com a parte de capacidade daquele grupo. Então, vocêcomo root.
Note que a maioria dos executáveis pode ser simplesmente copiada e ainda funcionar. Você pode deixar o "original"
perf
"incapaz", e ter sua própria cópia, executável somente pelo grupo correto, deperf
algum outro lugar. Certifique-se de que ainda somente o root pode escrever naquele executável!Dessa forma, você pode ter uma versão
perf
que você pode usar paraperf record
,perf stat
eperf top
, e uma versão que qualquer um pode usar paraperf report
.¹ Com
CAP_SYS_ADMIN
, eles podem montar sistemas de arquivos, permitindo assim que eles executem um shell (ou qualquer outro programa) comsuid
bit definido, para que eles tenham acesso completo comoroot
. Há muitas outras coisas que você pode fazer para se tornar root, ou não, porque essa capacidade permite que você faça a maioria das coisas que você poderia fazer como root, de qualquer maneira.