Run0 - Elevação de privilégios com systemd
A partir da versão 256 do systemd está disponível o comando Run0 para elevação de privilégios ou execução de comandos locais ou virtuais com outro perfil de usuário.
Run0 - Elevação de privilégios com systemd
A partir da versão 256 do systemd, está disponível o comandoRun0 para elevação de privilégios ou execução de comandos locais ou virtuais com outro perfil de usuário.
Aviso: observe que o uso dessas ferramentas está diretamente relacionado à segurança do sistema. Para evitar desastres, saiba o que está fazendo antes de usar e faça por sua conta e risco. Este artigo foi baseado na versão 256 do systemd presente no Arch Linux. O pacote
polkit é necessário para executar Run0. Sudo(8) não precisa ser instalado! Run0 faz parte do pacote systemd e já está instalado por padrão.
Descrição
De acordo com [1],run0 pode ser usado para adquirir privilégios elevados ou diferentes, de forma temporária e interativa. Observe que este artigo foi escrito em
um contexto de linha de comando. Quando uma interface gráfica for utilizada, é certo que haverá mudanças que não foram avaliadas neste cenário de laboratório.
Run0 tem um propósito semelhante ao sudo(8), mas opera de forma diferente em algumas áreas principais, o que pode torná-lo preferível em casos específicos de uso:
- Nenhuma credencial de execução ou de contexto de segurança é herdada do chamador para os comandos invocados, pois são invocados a partir de um serviço novo e isolado, bifurcado pelo gerenciador de serviços.
- A autenticação ocorre via
polkit, isolando assim o prompt de autenticação do terminal (se possível). Recomendamos a leitura do manual polkit para maior entendimento. - Um pseudo-tty independente é alocado para o comando invocado, desvinculando seu ciclo de vida e isolando-o por segurança.
- Nenhuma funcionalidade de bit de acesso ao arquivo
SetUID/SetGIDé usada para a implementação.
No geral, isso deve fornecer uma alternativa mais segura e robusta ao mecanismo
sudo, especialmente em ambientes de SO onde o suporte SetUID/SetGID não está disponível (por exemplo, definindo a variável NoNewPrivileges=em
systemd-system.conf(5)). Qualquer sessão invocada via run0 será executada pela pilha PAM systemd-run0. Observe que run0 é implementado como uma invocação multi-chamada alternativa de
systemd-run(1), cujo manual em [2] recomendamos a leitura para maior entendimento.
Antes de usar, saiba:
- Todos os argumentos de linha de comando, após o primeiro argumento não opcional, tornam-se parte da linha de comando do processo iniciado. Se nenhuma linha de comando for especificada, um shell interativo será invocado. O shell a ser invocado pode
ser controlado através da variável
--setenv=SHELL=…e atualmente assume como padrão o shell do usuário de origem (ou seja, não o do usuário de destino!) se estiver operando localmente, ou alternativamente/bin/shao operar com--machine=. - Em caso de sucesso na execução, o estado de saída é zero (0). No caso de falha na execução, um valor não-zero é retornado.
- Assim como
systemd-run[2], a sessão herdará o ambiente do sistema do gerenciador de serviços. Além disso, as seguintes variáveis de ambiente também serão definidas:$TERM,$SUDO_USER,$SUDO_UID,$SUDO_GID, caso elas estejam definidas.
Opções de uso
--no-ask-password- Não consulta o usuário por autenticação.--unit=NOME- Define um nome de unidade para a execução, um nome aleatório é gerado se não fornecido.--property=NOME=VALOR- Define uma propriedade na unidade de serviço que é criada. Esta opção recebe uma atribuição no mesmo formato que o comandoset-propertydosystemctl(1). Como por exemplo:# systemctl set-property foobar.service CPUWeight=200 MemoryMax=2G IPAccounting=yes--description="TEXTO"- Fornece uma descrição para a unidade que é invocada. Se não for definida, o próprio comando é utilizado como uma descrição. A sintaxe é similar à encontrada em [5]systemd.unit(5). Uma descrição é um título curto e legível da unidade, apenas para humanos.--slice=- Faça com que a nova unidade.servicefaça parte da fatia especificada, em vez deuser.slice.--slice-inherit- Faça com que a nova unidade.servicefaça parte dosliceno qual o própriorun0foi invocado. Esta opção pode ser combinada com--slice=, nesse caso osliceespecificado via--slice=é colocado dentro dosliceno qual o comandorun0é invocado. Exemplo: considererun0sendo invocado noslicefoo.slice, e o argumento--slice=bar. A unidade será então colocada sobfoo-bar.slice.--user=,-u,--group=,-g- Troca para o usuário/grupo definido, em vez de usarroot.--nice=VALOR- Define um nível de gentileza para a tarefa. Esse é um valor numérico e pode ser dependente da definição deniceda sua distribuição.--chdir=CAMINHO,-D- Executa a sessão invocada com o diretório de trabalho especificado. Se não for especificado, o padrão é o diretório de trabalho atual do cliente se alternar para o usuárioroot, ou o diretóriohomedo usuário de destino, caso contrário.--setenv=ENV[=VALUE]- Executa a sessão invocada com a variável de ambiente especificada definida. Este parâmetro pode ser usado mais de uma vez para definir várias variáveis. Quando"="eVALUEsão omitidos, o valor da variável com o mesmo nome no ambiente de invocação será usado.--background=[COR]- Define cores no padrão ANSI para o background do terminal. Uma string vazia desativa essa opção. Para detalhes das cores ANSI consulte [6]. Por exemplo:"--background=44"para um azul no background.--machine=CONTAINER- Executa a operação em um container local. Defina o nome do container.--help,-h- Exibe uma ajuda básica.--version- Exibe a versão do programa e encerra.
Casos de uso
Alguns exemplos de uso prático do comandoRun0 incluem:
# run0 --user=username /usr/bin/top
Executa o comando
top como o usuário especificado.
# run0 --machine=mycontainer --user=root /bin/bash
Inicia uma shell Bash como
root dentro de um container chamado mycontainer.
# run0 --slice-inherit --nice=10 /usr/bin/backup
Executa o comando de backup dentro do slice atual, com uma prioridade de nice mais baixa.
Atenção: observe que invocando
Run0 sem qualquer parâmetro seu usuário comum se torna o root!
[kyetoy@vbox ~]$ run0 ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ==== Authentication is required to manage system services or other units. Authenticating as: kyetoy Password: ==== AUTHENTICATION COMPLETE ==== [root@vbox kyetoy]#
run0 --chdir=/var pwd
Este comando altera o diretório para
/var e então executa o comando pwd para exibir o diretório atual.
run0 --nice=19 tarefa-com-baixa-prioridade ...
Este comando executa uma tarefa com uma prioridade baixa, definida pelo valor
--nice=19.
run0 --setenv=SECRET=true bash -c 'export'
Este comando define a variável de ambiente
SECRET=true e então executa bash com o comando export para exibir as variáveis de ambiente.
run0 --property=ProtectSystem=strict --property=ReadWritePaths=/var/log/write-test bash -c 'echo test > /var/log/write-test'
Este comando protege o sistema de alterações não autorizadas, permitindo escrita apenas no caminho
/var/log/write-test e, em seguida, grava o texto "test" nesse arquivo.
Conclusão
Run0 é uma ferramenta poderosa e flexível para gerenciamento de privilégios e execução de comandos em ambientes seguros e isolados. Sua integração com o systemd e o polkit o torna uma alternativa segura ao sudoem
muitos cenários, especialmente em sistemas onde a segurança é uma prioridade.
Agradecimentos
Todas as traduções deste artigo foram feitas com o auxílio do Google Tradutor. Obrigado, Google.Esse artigo foi escrito seguindo as diretrizes da ONG American Humane e nenhum usuário comum foi ferido ou maltratado enquanto esse artigo foi feito. :)
Referências:
- [1] Run0 Manual - Documentação oficial do run0
- [2] systemd-run Manual - Documentação oficial do systemd-run
- [3] Polkit Documentation - Documentação oficial do Polkit
- [4] systemctl Manual - Documentação oficial do systemctl
- [5] ANSI Escape Code Parameters - Parâmetros de código de escape ANSI
- [6] Linux Audit - run0 Introduction and Usage - Introdução e uso do run0
interessante.
______________________________________________________________________
Inscreva-se no meu Canal: https://www.youtube.com/@LinuxDicasPro
Repositório GitHub do Canal: https://github.com/LinuxDicasPro
Grupo do Telegram: https://t.me/LinuxDicasPro
Meu GitHub Pessoal: https://github.com/mxnt10