Execute um único comando como outro usuário; restrições ao sudo

Execute um único comando como outro usuário; restrições ao sudo

Estou trabalhando em uma máquina onde não tenho root, mas há uma lista de sudocomandos permitidos. Um desses comandos é /bin/su - foouser. Então posso digitar sudo su - foousere recebo um shell interativo como base. Então posso executar algumas coisas como foouser.

O problema é que foouseré um usuário/shell compartilhado usado para gerar certos processos de produção importantes. Não consigo personalizá-lo ou configurá-lo facilmente da maneira que desejo. E eu não deveria trabalhar nisso de forma consistente, o que divide meus terminais e histórico de comandos entre aqueles onde estou logado como eu mesmo e aqueles onde estou foouser.

O que eu realmente gostaria de fazer é ter uma maneira de executar um único comando como foouser, bloqueá-lo, imprimir stdout e stderr em meu shell como um comando normalmente faria e, em seguida, retornar comigo ainda logado como eu mesmo (e não foouser). Isso poderia, por exemplo, ser encapsulado em um script para que as_foo barexecute o comando bar, como foouser, imprima stdout e stderr, retorne o código de retorno de bare, em seguida, me coloque de volta em meu shell.

Posso pedir aos administradores de sistema para alterar as permissões. Por exemplo, eles poderiam adicionar barà lista sudo, e então eu poderia usar (eu acho) su -cpara executar bar da maneira que descrevi. Mas aí, se no dia seguinte eu quiser fugir bar2, tenho que falar com eles novamente.

Existe alguma saída para esse dilema? Parece um tanto bobo porque obviamente posso me tornar foousere executar quantos comandos quiser, então não há diferença em termos de segurança que eu possa ver. Simplesmente não consigo encontrar nenhuma maneira óbvia e conveniente de tornar isso possível.

Responder1

sudo su - foouser <command>requer que você tenha pelo menos acesso root limitado para executar su - foouser <command>como root.

sudo -u foouser <command>pode fazer o que quiser em uma única etapa. Mas requer que o administrador do sistema lhe conceda sudoacesso à foouserconta desta forma:

ignacio ALL=(foouser) ALL

em vez desta forma:

ignacio ALL=(root) su - foouser

Configurar sudodesta forma permitirá que você defina, por exemplo, um alias como você imaginou:

as_foo='sudo -u foouser'

E evitando o su -, você poderá continuar usando suas próprias personalizações: usar sudodesta forma altera apenas a identidade do usuário, mas mantém HOMEseu valor anterior, lendo quaisquer scripts de inicialização do shell e outras personalizações deseudiretório inicial em vez de foouser's.

(É claro que esses scripts também devem ser legíveis por esse outro usuário, e é melhor que qualquer script compartilhado que você possa executar se refira foouserexplicitamente ao diretório inicial de como /home/foouserem vez de apenas $HOME.)

No entanto, existem algumas sudoconfigurações que podem impedir que essa solução funcione: se a always_set_homeopção sudo estiver definida no arquivo sudoers, ou se env_reseta opção for definida sem adicionar HOMEà env_keeplista, HOMEserá redefinida de qualquer maneira. Em tal situação, tente adicionar a -Eopção ao sudocomando para solicitar explicitamente a manutenção do seu ambiente.

E quando você realmente quiser executar algo foousercom o ambiente definido exatamente como está quando conectado como foouser(ou seja, o equivalente a sudo su - foouser), adicione a -iopção para solicitar isso especificamente. O mesmo sudo -i -u foouserocorre com uma substituição 100% precisa de sudo su - foouser.

Se você encontrar algum sistema com uma versão tão antiga sudoque não tenha essa -iopção, use a -Hopção com sudo: não é um substituto perfeito, mas pode ser suficiente. Uma versão tão antiga sudoprovavelmente também terá alguns bugs conhecidos sensíveis à segurança, então valeria a pena atualizá-la de qualquer maneira.

Você pode usar sudo -lcomo você mesmo para ver exatamente como seu acesso ao sudo está definido e quais opções do sudo (também conhecidas como entradas padrão) estão em vigor para você.

Responder2

Passe argumentos adicionais para su.

sudo su - foouser sh -c 'echo $USER'

informação relacionada