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.303 ]
Por: Kyetoy em 02/09/2024
Run0
para elevação de privilégios ou execução de comandos locais ou virtuais com outro perfil de usuário.
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.
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:
polkit
, isolando assim o prompt de autenticação do terminal (se possível). Recomendamos a leitura do manual polkit para maior entendimento.SetUID/SetGID
é usada para a implementação.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.
--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=
.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.--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.Run0
incluem:
# run0 --user=username /usr/bin/top
top
como o usuário especificado.
# run0 --machine=mycontainer --user=root /bin/bash
root
dentro de um container chamado mycontainer
.
# run0 --slice-inherit --nice=10 /usr/bin/backup
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
/var
e então executa o comando pwd
para exibir o diretório atual.
run0 --nice=19 tarefa-com-baixa-prioridade ...
--nice=19
.
run0 --setenv=SECRET=true bash -c 'export'
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'
/var/log/write-test
e, em seguida, grava o texto "test" nesse arquivo.
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 sudo
em
muitos cenários, especialmente em sistemas onde a segurança é uma prioridade.
Por que os romanos não fizeram computadores?
Funtoo Linux: A necrópsia de um Pinguim
Utilizando o Debian Squeeze em Desktop
Instalando e configurando um Webserver
Configurando o CACIC (parte 5)
Configurando placas wireless baseadas no chip Realtek RTL8180 no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Problemas ao instalar o PHP (9)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (0)
Não tô conseguindo baixar nada pelo terminal (5)
Wifi parou de funcionar no Inspirion N4050 com Debian 12 (1)