Coloque em cache a senha se as chaves SSH forem proibidas

46

Eu tenho um servidor que eu tenho que acessar freqüentemente via ssh, porque eu computo nele. Agora, o centro de computação proíbe explicitamente as chaves SSH porque elas são "inseguras". Eles acham que digitar minha senha, em um teclado, sempre que possível na frente de outros seres humanos, é uma maneira muito mais segura de fazer login.

Agora; Não posso mudar de idéia (tentei).

Existe uma maneira de, pelo menos, armazenar temporariamente senhas SSH, a maneira como o GIT pode armazenar senhas em um cache por um tempo definido?

user2667180
fonte
55
the computing center explicitly forbids SSH-keys because they are "insecure"- minha opinião sobre o assunto? Encontre um novo host de servidor, porque o seu é obviamente inepto.
Matt Clark
18
@ Matt: sons "centro de computação" mais como um sistema de grade acadêmica, que não têm quase tanta concorrência acho
grawity
27
Eles estão errados. Eles provavelmente se esqueceram de desativar as chaves ssh quando expiram as contas, por isso decidiram que as chaves ssh são o problema.
217 Joshua Joshua
10
Grawity está certo. é um supercomputador nacional, então estou preso a ele. pelo que vale a pena, a máquina é boa. Joshua provavelmente está certo também, mas, bem, esse é o tipo de direito não é bom para qualquer coisa
user2667180
7
@TheHansinator Se houver um keylogger instalado, você já foi comprometido a tal ponto que não importa mais se você está protegendo suas conexões ssh. Mas existem outras vantagens da publickeyautenticação. Se você desabilitar a passwordautenticação no servidor, evita que todos os invasores tentem adivinhar senhas. E se um invasor tentar um ataque mitm contra um cliente que não armazenou anteriormente a chave pública do servidor, você estará muito melhor protegido do publickeyque se estivesse usando passwordautenticação.
kasperd

Respostas:

63

Reutilização de conexão

O SSHv2 permite que a mesma conexão autenticada estabeleça vários 'canais' - shell interativo, comando em lote, SFTP, junto com os secundários, como encaminhamento de agente ou encaminhamento de TCP. Seu servidor provavelmente suporta multiplexação de conexão por padrão. (Se os seus administradores reclamarem, ele não está armazenando sua senha em nenhum lugar - está armazenando toda a conexão.)

Com o OpenSSH, você tem ControlMastere ControlPathopções (-M e -S) para fazer uso disso:

  1. Inicie uma conexão SSH 'master' usando -M. (Como você ainda não possui um ControlPath em sua configuração, é necessário especificá-lo na linha de comando -S. Ele precisa durar muito, então eu adiciono as -fNopções para voltar ao segundo plano; elas são tecnicamente opcionais caso contrário.)

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    Você voltou ao shell local.

  2. Inicie uma nova conexão através do mestre:

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    Você está dentro.

  3. Para tornar isso útil para o Git / rsync / SFTP, você precisa definir ControlPathsua configuração, porque não poderá especificar -So tempo todo:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Você pode automatizar isso - as versões recentes do OpenSSH também possuem o ControlPersistque estabelece automaticamente uma conexão mestre em segundo plano, se ainda não houver uma. Isso permite que você pule a etapa 1 e use o ssh como faria normalmente.

  1. Configuração em ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. A primeira conexão solicita a senha:

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. O segundo não:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

Para controlar o mestre multiplex (pare ou configure os encaminhamentos TCP), use a -Oopção

Um método semelhante é suportado pelas versões recentes do PuTTY .

gravidade
fonte
1
muito obrigado por esta bela resposta. o google não foi útil para esse problema, pois sempre se transformava em ssh-keys e eu não sabia as palavras-chave corretas. me ajudou muito!
User2667180
1
Não é preciso dizer, mas se você usar essa configuração, é essencial que você tenha certeza de que sua conta está protegida e que sua pasta .ssh está bloqueada corretamente, pois qualquer pessoa com acesso aos arquivos de canal nessa máquina pode pegar carona no seu computador. conexão e acesse o servidor como você.
shellster
3
@shellster: Você quer dizer "qualquer pessoa com o mesmo UID", assim como no caso do ssh-agent. Mesmo que você abra deliberadamente as permissões do arquivo de soquete (que são 0600 por padrão), outros usuários receberão "incompatibilidade de uid multiplex".
grawity
3
@shellster Alguém com root pode instalar um keylogger e roubar sua senha no sistema remoto de qualquer maneira, ou fazer várias coisas nefastas. Se estivermos preocupados com a raiz local, isso não é menos seguro do que salvar uma chave privada SSH.
precisa saber é
1
Não considero a raiz local uma ameaça, porque se ela se tornar uma ameaça, você estará brindando, não importa o quê. (Como na espionagem de nível governamental.) Francamente, uma raiz local poderia substituir seu cliente e agente ssh pelo que eles quisessem. Armazenar todas as senhas e chaves privadas em /root/.secret? Certo.
grawity
19

Usar sshpass

O sshpass ( github , página de manual ) é uma ferramenta que alimenta automaticamente a senha do ssh. A maneira segura de usá-lo é esta:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Isso lerá a senha ~/.ssh/compute_password, como um arquivo de chave privada sem senha. Você pode colocar o sshpasscomando em um pequeno script de shell ou um alias de shell para evitar digitar esse comando completo. Infelizmente, não encontrei uma maneira de fazer isso ~/.ssh/config.

(Também é possível especificar a senha diretamente na linha de comando sshpass, mas isso deve ser evitado, pois vaza a senha para qualquer pessoa que possa fazer ps)

Comparação com outros métodos

É claro que essa abordagem é menos segura do que configurar corretamente a autenticação de chave pública, mas você provavelmente já sabe disso.

Também é menos seguro do que a resposta do @ grawity sobre a reutilização da conexão, mas tem a vantagem de não precisar digitar a senha de maneira interativa.

Você pode considerar a resposta do @ grawity como uma alternativa ao auth do pubkey com uma senha e cache de chave privada (ou seja ssh-agent). Então minha resposta seria uma alternativa à autenticação pubkey sem uma senha no arquivo da chave privada.

marcelm
fonte
3
Se a política do centro de computação foi escrita com base em "mas os pares de chaves são armazenados em disco onde alguém pode roubá-los!", Parece que essa política vai sair pela culatra.
grawity
6
@grawity Bem, políticas ruins levam a soluções ainda piores ¯ \ _ (ツ) _ / ¯
marcelm 2/18/18
1
Se você gerar sua senha como um fluxo suficientemente longo de caracteres aleatórios (digamos, head -c 16 /dev/urandom | base64128 bits) e não a usar em outros sistemas, será semelhante à chave em termos de segurança. Tão difícil quanto a força bruta e simples de usar a partir do arquivo, se não criptografado. Isso vale para o bandido também, se eles conseguirem o arquivo. A única diferença é que a senha é enviada para o servidor como está, enquanto as chaves têm melhores cálculos para provar que você possui a chave privada correta sem revelá-la e, quanto à usabilidade, é mais difícil criptografar o arquivo que contém a senha (não ferramentas padrão).
Ilkkachu 03/10/19
1

Use o gerenciador de senhas.

Alguns gerenciadores de senhas (por exemplo, KeePassXC) possuem o recurso 'tipo automático'. Você armazena a senha no gerenciador de senhas, desbloqueia o banco de dados ao executá-lo e sempre que sshsolicita sua senha, pressiona uma combinação de teclas que faz com que o gerenciador de senhas grave sua senha longa no console.

Não é necessário copiar, lembre-se de qualquer coisa (exceto a senha para desbloquear o banco de dados) e você pode ter uma senha forte sem esmagar esses 30 caracteres toda vez que tentar fazer login.

Você pode escolher o seu favorito desta lista: https://en.wikipedia.org/wiki/List_of_password_managers

mosca de isopor
fonte
3
Não tenho certeza se o recurso de tipo automático funciona bem com programas baseados em terminal. A detecção será à procura de um título janela específica, eo próprio autotyping melhor não tem a fantasia "anti-keylogging" características que KeePass2 tinha ...
grawity
1
O @grawity gnome-terminalaltera seu título para ssh somehostquando ssh me pede uma senha para que você possa combinar a janela do título sem problemas. Não sei nada sobre os recursos de 'anti-keylogging' - estou usando o KeePassXC no terminal diariamente e o pior com o qual tenho que lidar é escolher a conta apropriada da lista.
styrofoam fly
2
@grawity Os recursos anti-keylogging precisam ser ativados por entrada de qualquer maneira (exatamente pelo motivo de muitos programas não suportarem colar).
Bob
0

Outra alternativa é usar um cliente ssh da GUI. No Windows, a escolha óbvia seria PuTTY . Há também uma versão Linux do PuTTY, principalmente a maioria das distribuições baseadas no Debian como o Ubuntu normalmente incluem o PuTTY em seu repositório.

Outro cliente realmente bom é o Termius . Ele suporta não apenas Windows e Linux, mas também OSX, iOS e Android. Embora tenha sido projetada principalmente para telefones, a versão para desktop é realmente muito boa.

Se não me engano, o venerável Hyperterminal no Windows também possui / possui um cliente ssh, mas eu não uso o Windows há muito tempo, por isso não tenho certeza.

Todos os clientes da GUI incluem a capacidade de salvar configurações de conexão que incluem seu nome de usuário e senha.

slebetman
fonte
2
"Baseado em GUI" não implica automaticamente que permitirá armazenar sua senha, algo que PuTTY se recusa explicitamente a fazer . A versão do HyperTerminal que acompanha o Windows era apenas do Telnet, focada mais em links seriais. Talvez você esteja pensando no CKermit for Windows, que possui suporte SSH, mas o suporte a cifras é tão desatualizado que não se conecta facilmente a muitos servidores atuais.
grawity