encaminhamento ssh-agent e sudo para outro usuário

153

Se eu tiver um servidor A no qual posso fazer login com minha chave ssh e tiver a capacidade de "sudo su - otheruser", perco o encaminhamento de chave, porque as variáveis ​​env são removidas e o soquete é legível apenas pelo meu usuário original. Existe uma maneira de conectar o encaminhamento de chave através do "sudo su - otheruser", para que eu possa fazer coisas em um servidor B com a minha chave encaminhada (git clone e rsync no meu caso)?

A única maneira em que consigo pensar é em adicionar minha chave às chaves_autorizadas_de_usuário e ao "ssh otheruser @ localhost", mas isso é complicado de fazer em todas as combinações de usuários e servidores que eu possa ter.

Em resumo:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 
Kolypto
fonte

Respostas:

182

Como você mencionou, as variáveis ​​de ambiente são removidas por sudo, por razões de segurança.

Mas, felizmente, sudoé bastante configurável: você pode dizer com precisão em quais variáveis ​​de ambiente deseja manter, graças à env_keepopção de configuração /etc/sudoers.

Para encaminhamento de agente, você precisa manter a SSH_AUTH_SOCKvariável de ambiente. Para fazer isso, basta editar seu /etc/sudoersarquivo de configuração (sempre usando visudo) e defina a env_keepopção para os usuários apropriados. Se você deseja que esta opção seja definida para todos os usuários, use a Defaultslinha como esta:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers para mais detalhes.

Agora você deve conseguir fazer algo assim ( user1a chave pública fornecida está presente em ~/.ssh/authorized_keysin user1@serverAe user2@serverB, e serverAo /etc/sudoersarquivo está configurado conforme indicado acima):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works
MiniQuark
fonte
1
Esta é a resposta correta, deve ser marcada.
Xealot 02/01
41
Isso funciona, se user2acima estiver root! Caso contrário, user2o SSH_AUTH_SOCK será configurado corretamente, mas user2não será possível acessar, por exemplo, / tmp / ssh-GjglIJ9337 /. roottem esse acesso. Portanto, isso pode resolver parte do problema, mas não os OPs: " e o soquete é legível apenas pelo meu usuário original"
Peter V. Mørch 04/11/11
6
Defaults>root env_keep+=SSH_AUTH_SOCKDeve se certificar de que somente encaminha quando estiver fazendo o root para fazer root. Você não deseja fazer isso de qualquer maneira com outros usuários por motivos de segurança. Melhor executar um ssh-agent separado para outro e adicionar as chaves apropriadas.
Paul Schyska
1
sudo su -não funciona para mim, presumivelmente não pode preservar o ambiente porque não é sudono momento da inicialização do shell. sudo suparece funcionar.
Alex Fortuna
3
Eu nunca entendi por que as pessoas usam de sudo suqualquer maneira. Se você precisa de um shell de root, que é o que sudo -sou sudo -ié para.
ai pessoal
68
sudo -E -s
  • -E preservará o meio ambiente
  • -s executa um comando, o padrão é um shell

Isso fornecerá um shell raiz com as chaves originais ainda carregadas.

João Costa
fonte
2
Como no comentário acima, isso só aborda a questão se você estiver se tornando root, porque nesse caso o root pode contornar as permissões de acesso usuais no $ SSH_AUTH_SOCK.
Doshea
35

Permita que outro usuário acesse o $SSH_AUTH_SOCKarquivo e seu diretório, por exemplo, pela ACL correta, antes de mudar para eles. O exemplo assume Defaults:user env_keep += SSH_AUTH_SOCKna /etc/sudoersmáquina host:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

Mais seguro e funciona também para usuários não root ;-)

Viliam Pucik
fonte
6
Lembre-se, ao usar esse método, outras pessoas que efetuaram login, como otherusertambém podem usar sua autenticação ssh.
Gitaarik
Isso funciona para mim, exceto que eu tive que alterar "sudo su - otheruser" para "sudo su otheruser" (removendo o -).
Charles Finkel
1
Por que rwxe não rw(ou de rtodo)?
Anatoly techtonik
3
@anatolytechtonik De man 7 unix- no Linux, conectar-se ao soquete requer permissões de leitura e gravação nesse soquete. Além disso, você precisa de permissão de pesquisa (execução) e gravação no diretório em que cria o soquete ou apenas permissão de pesquisa (execução) quando se conecta a esse soquete. Portanto, na resposta acima, a permissão de execução no soquete é redundante.
mixel
em vez de precisar editar o / etc / sudoers, você pode usarsudo -u otheruser --preserve-env=HOME -s
Sec
14

Eu descobri que isso também funciona.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Como outros observaram, isso não funcionará se o usuário para o qual você está mudando não tiver permissões de leitura em $ SSH_AUTH_SOCK (que é praticamente qualquer usuário além do root). Você pode contornar isso definindo $ SSH_AUTH_SOCK e o diretório em que está para ter as permissões 777.

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Isso é bastante arriscado. Você basicamente concede permissão a todos os outros usuários do sistema para usar o seu Agente SSH (até você sair). Você também pode definir o grupo e alterar as permissões para 770, o que poderia ser mais seguro. No entanto, quando tentei mudar de grupo, recebi "Operação não permitida".

filos
fonte
6
Isso é extremamente arriscado. Dar a todos os outros usuários permissão para usar seu agente SSH equivale a conceder a eles todas as suas credenciais (e, se você usar sudo ou su, fornecer a eles o poder de raiz sobre todos os outros usuários do sistema, bem como todos os outros sistemas para os quais você deve usar o SSH!) . NUNCA deve ser feito NUNCA!
Matija Nalis 6/03/2014
4
Não concordo com a afirmação de que "NUNCA deve ser feito NUNCA!" Existem muitos casos em que esse risco é aceitável. Por exemplo, uma equipe pequena em que todos têm as mesmas permissões e você confia em todos os outros usuários. Isso nunca deve ser feito sem entender os riscos que isso envolve. Mas uma vez que esses riscos são entendidos, há momentos em que esse risco é aceitável.
Phylae #
6

Se você estiver autorizado sudo su - $USER, provavelmente terá um bom argumento para ter permissão para fazer isso ssh -AY $USER@localhost, com sua chave pública válida no diretório inicial do $ USER. Em seguida, seu encaminhamento de autenticação será realizado com você.

David Mackintosh
fonte
Ele mencionou isso no final de sua pergunta e disse que seria difícil de fazer.
Fahad Sadah
Esta é provavelmente a melhor solução, mas fica peludo se $ usuário é uma pessoa real (tm) - eles podem excluir a chave do SA de authorized_keys ou alterar sua senha ...
voretaq7
Você pode remover o acesso de gravação para authorized_keys (embora se eles realmente são definidas em negar o acesso Florian, eles podem excluir e recriá-lo, sendo em um diretório que eles próprios)
Fahad Sadah
4

Você sempre pode apenas ssh no localhost com encaminhamento de agente, em vez de usar o sudo:

ssh -A otheruser@localhost

A desvantagem é que você precisa fazer login novamente, mas se você o estiver usando na guia screen / tmux, isso é apenas um esforço de uma vez; no entanto, se você se desconectar do servidor, o soquete (é claro) será quebrado novamente . Portanto, não é o ideal se você não pode manter sua sessão screen / tmux aberta o tempo todo (no entanto, você pode atualizar manualmente seu SSH_AUTH_SOCKenv var se você for legal).

Observe também que, ao usar o encaminhamento ssh, o root sempre pode acessar seu soquete e usar sua autenticação ssh (desde que você esteja logado com o encaminhamento ssh). Portanto, verifique se você pode confiar no root.

gitaarik
fonte
Isso não funciona se você tiver acesso apenas otheruservia, em sudovez de SSH (por exemplo, você quer SCP como www-data)
Gert van den Berg
3

Não use sudo su - USER, mas sim sudo -i -u USER. Funciona para mim!

Fahad Sadah
fonte
Qual versão do sudo você possui? O meu (1.6.7p5, CentOS 4.8) não tem -i em sua página de manual.
David Mackintosh
Sudo version 1.6.9p17rodando no Debian Lenny. Tentar sudo -s?
Fahad Sadah
6
Não funciona para mim.
No Ubuntu, usando 1.8.9p5 Sudo, nem sudo -snem sudo -itrabalho para mim ...
Jon L.
2

Combinando informações das outras respostas, vim com isso:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

Eu gosto disso porque não preciso editar o sudoersarquivo.

Testado no Ubuntu 14.04 (tive que instalar o aclpacote).

warvariuc
fonte
1

Eu acho que há um problema com a -opção (traço) depois suem seu comando:

sudo su - otheruser

Se você ler a página de manual do su , poderá achar que a opção -, -l, --logininicia o ambiente do shell como shell de login. Este será o ambiente, otheruserindependentemente das variáveis ​​env em que você executa su.

Simplificando, o traço prejudicará tudo o que você passou sudo.

Em vez disso, você deve tentar este comando:

sudo -E su otheruser

Como o @ joao-costa apontou, -Epreservará todas as variáveis ​​no ambiente em que você executou sudo. Então, sem o traço, suusará esse ambiente diretamente.

Koala Yeung
fonte
0

Infelizmente, quando você faz o su para outro usuário (ou mesmo usa o sudo), perde a capacidade de usar suas chaves encaminhadas. Este é um recurso de segurança: você não deseja que usuários aleatórios se conectem ao seu ssh-agent e usem suas chaves :)

O método "ssh -Ay $ {USER} @localhost" é um pouco complicado (e conforme observado no meu comentário sobre a resposta de David propenso a falhas), mas é provavelmente o melhor que você pode fazer.

voretaq7
fonte
1
Hmm, mas se eu fizer isso com o ssh, meu agente estará acessível por esse usuário de qualquer maneira, ou estou errado?
Se você fizer o SSH no usuário de destino com o encaminhamento do agente, suas solicitações de agente retornarão da cadeia para onde quer que o agente "real" esteja. Quando você suja ou suja o usuário original, seu soquete do agente SSH não pode (ou não deveria) ser acessado - o diretório em que ele vive é o modo 700 e pertence ao usuário original. (Ressalva óbvia: se você está mudando para enraizar e redefinir o ambiente SSH_AUTH_SOCK ele poderia funcionar, mas eu não iria contar com ele)
voretaq7
1
No meu servidor (Ubuntu 12.04, versão ssh OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 de março de 2012), ssh has -aand -Aargument. -afaz exatamente o oposto do que se destina, desativa o encaminhamento de agentes! Portanto, na versão recente (e possivelmente toda) do Ubuntu, use -Apara ativar o encaminhamento de agentes.
knite
@ knite Você está correto - esse é um erro de digitação (de 3 anos!) na minha resposta. Corrigido agora :-)
voretaq7