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.

[ Hits: 2.718 ]

Por: Kyetoy em 02/09/2024


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.

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/sh ao 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 comando set-property do systemctl(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 .service faça parte da fatia especificada, em vez de user.slice.
  • --slice-inherit - Faça com que a nova unidade .service faça parte do slice no qual o próprio run0 foi invocado. Esta opção pode ser combinada com --slice=, nesse caso o slice especificado via --slice= é colocado dentro do slice no qual o comando run0 é invocado. Exemplo: considere run0 sendo invocado no slice foo.slice, e o argumento --slice=bar. A unidade será então colocada sob foo-bar.slice.
  • --user=, -u, --group=, -g - Troca para o usuário/grupo definido, em vez de usar root.
  • --nice=VALOR - Define um nível de gentileza para a tarefa. Esse é um valor numérico e pode ser dependente da definição de nice da 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ário root, ou o diretório home do 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 "=" e VALUE sã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 comando Run0 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:

   

Páginas do artigo
   1. Run0 - Elevação de privilégios com systemd
Outros artigos deste autor

Por que os romanos não fizeram computadores?

Funtoo Linux: A necrópsia de um Pinguim

Leitura recomendada

Instalar e configurar um servidor FTP no CentOS

Eu cavo, tu cavas, ele cava... tutorial de DIG

Facilidades com Debian 4.0 Etch

FTP com autenticação LDAP

Configuração de servidor DNS no Linux

  
Comentários
[1] Comentário enviado por maurixnovatrento em 07/09/2024 - 17:35h


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

[2] Comentário enviado por nettux em 14/02/2025 - 11:55h

Nesse caso basta uma senha forte, porque - nesse exemplo - ainda depende da senha, correto?!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts