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: 1.476 ]

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

Instalando Gentoo Linux através da sua distribuição

Instalando o Nagios no Ubuntu Linux

Kazam Screencaster no Debian Wheezy

Slackware - Limpeza automática da pasta /tmp

Como instalar o Linux (Debian) no Libretto 50CT

  
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


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts