However, I remembered belatedly that you can't spawn an interactive session from within a shell script.
Sim, você pode, mas tem que passar -t
para o comando ssh
(aquele que estabelece a conexão para o host de salto, não o de o salto jost). O motivo é que, se você especificar um comando ao executar ssh
, por padrão, ele não alocará um tty, que é necessário para uma sessão interativa. -t
corrige isso.
Algumas alternativas possíveis:
- Faça com que o script em seu host de salto permita que seus usuários selecionem um nome de host de forma interativa, possivelmente usando algo como
dialog
. Desvantagem desse método: você dificulta a execução de uma sessão não-interativa. - Crie um usuário no host de salto por máquina de destino, nomeado após a máquina de destino. Desvantagem deste método: você precisa manter as chaves ssh dos seus usuários em muitos arquivos. Pode ser melhor usar algum sistema de gerenciamento de configuração para isso; por exemplo, o fantoche tem suporte para lidar com
authorized_keys
arquivos e chaves ssh diretamente. A vantagem é que você pode definir com mais facilidade qual usuário recebe acesso a qual host.
Observe que, se você não quiser que seus usuários consigam a chave privada ssh, certifique-se de que eles também não possam usar scp
ou sftp
em seu host de salto. Isso pode dificultar o trabalho deles.
No geral, pessoalmente, não tenho certeza se o que você está tentando fazer é uma boa ideia. Seu host de salto não resolve o problema de 'muitas chaves ssh', ele apenas o move e apresenta vários problemas (sem scp / sftp; você adiciona um host que é um grande alvo para um invasor tentando obtenha acesso a todos os hosts em sua rede e, portanto, um SPOF, em termos de segurança; o problema com sessões interativas e comandos especificados).
Em vez disso, sugiro o seguinte:
- Use um sistema de gerenciamento de configuração nos hosts da AWS e verifique se ele é executado na inicialização antes de
sshd
ter sido iniciado. Esta é uma boa ideia, por várias razões. Conheço fantoches melhor que as alternativas, mas há outras opções. -
se estiver usando puppet, crie um arquivo com as chaves ssh dos seus usuários, assim:
$user_wouter_sshkey = 'ssh public key data' $user_john_sshkey = 'ssh public key data'
Etc.
-
Para cada grupo de usuários que você deseja conceder acesso a um recurso, crie um tipo definido:
define dbassh ($username = $title) { ssh_authorized_key {"wouter_dba_$username": key => $user_wouter_sshkey, type => 'ssh-rsa', user => $username, } ssh_authorized_key {"john_dba_$username": key => $user_john_sshkey, type => 'ssh-rsa', user => $username, } }
Etc.
-
agora, em outro lugar na sua configuração de marionetes, você pode fazer coisas como:
user {"postgres": ensure => present, purge_ssh_keys => true, } dbassh {"postgres":}