Quero me comunicar entre vários computadores na minha rede (Ethernet estática), através do SSH. Para fazer isso, eu preciso executar o ssh-add toda vez que fizer login em uma máquina específica, como posso fazê-lo para que seja configurado uma vez e não solicite a senha sempre que eu fizer login ou reinicializar minha maquina?
Sei que existe uma maneira de adicionar algumas linhas ao bash_profile
arquivo, mas ainda preciso digitar a senha toda vez que reinicializo / efetuo login em uma máquina específica.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Respostas:
Este é um exemplo típico de uma troca entre segurança e conveniência. Felizmente, existem várias opções. A solução mais apropriada depende do cenário de uso e do nível de segurança desejado.
chave ssh com senha, não
ssh-agent
Agora a senha deve ser inserida toda vez que a chave é usada para autenticação. Embora essa seja a melhor opção do ponto de vista de segurança, ela oferece a pior usabilidade. Isso também pode levar à escolha de uma frase secreta fraca para diminuir o fardo de inseri-la repetidamente.
chave ssh com senha, com
ssh-agent
Adicionar o seguinte a
~/.bash_profile
iniciará automaticamentessh-agent
e carregará as teclas ssh no login:Agora, a senha deve ser inserida em cada login. Embora um pouco melhor do ponto de vista da usabilidade, isso tem a desvantagem que
ssh-agent
solicita a senha, independentemente de a chave ser usada ou não durante a sessão de login. Cada novo login também gera umassh-agent
instância distinta que permanece sendo executada com as chaves adicionadas na memória, mesmo após o logout, a menos que seja explicitamente eliminado.Para interromper o
ssh_agent
logout, adicione o seguinte a~/.bash_logout
ou o seguinte para
~/.bash_profile
É
ssh-agent
possível evitar a criação de várias instâncias criando um soquete de comunicação persistente para o agente em um local fixo no sistema de arquivos, como na resposta de Collin Anderson . Essa é uma melhoria em relação à criação de várias instâncias de agentes, no entanto, a menos que a chave descriptografada seja eliminada explicitamente e ainda permaneça na memória após o logout.Nas áreas de trabalho, os ssh-agents incluídos no ambiente da área de trabalho, como o Agente SSH do Gnome Keyring , podem ser uma abordagem melhor, pois normalmente podem ser feitos para solicitar a senha na primeira vez que a chave ssh é usada durante uma sessão de login e armazene a chave privada descriptografada na memória até o final da sessão.
chave ssh com senha, com
ssh-ident
ssh-ident
é um utilitário que pode gerenciarssh-agent
em seu nome e carregar identidades conforme necessário. Ele adiciona chaves apenas uma vez, conforme necessário, independentemente de quantos terminais, ssh ou sessões de login que requerem acesso a umssh-agent
. Também pode adicionar e usar um agente diferente e um conjunto diferente de chaves, dependendo do host ao qual está conectado ou do diretório em que o ssh é chamado. Isso permite isolar chaves ao usar o encaminhamento de agente com hosts diferentes. Também permite usar várias contas em sites como o GitHub.Para habilitar
ssh-ident
, instale-o e adicione o seguinte alias ao seu~/bash_profile
:chave ssh com senha, com
keychain
keychain
é um pequeno utilitário que gerenciassh-agent
em seu nome e permitessh-agent
que permaneça em execução quando a sessão de login terminar. Nos logins subsequentes,keychain
será conectado àssh-agent
instância existente . Na prática, isso significa que a senha deve ser inserida apenas durante o primeiro login após uma reinicialização. Nos logons subseqüentes, a chave não criptografada dassh-agent
instância existente é usada. Isso também pode ser útil para permitir a autenticação RSA / DSAcron
sem senha em trabalhos sem chaves ssh sem senha.Para habilitar
keychain
, instale-o e adicione algo como o seguinte a~/.bash_profile
:Do ponto de vista da segurança,
ssh-ident
ekeychain
são piores do quessh-agent
casos limitados ao tempo de vida de uma sessão particular, mas eles oferecem um alto nível de conveniência. Para melhorar a segurança dekeychain
, algumas pessoas adicionam a--clear
opção à sua~/.bash_profile
chamada de chaveiro. Ao fazer isso, as frases de acesso devem ser digitadas novamente no login, conforme descrito acima, mas oscron
trabalhos ainda terão acesso às chaves não criptografadas após o logout do usuário. Akeychain
página wiki tem mais informações e exemplos.chave ssh sem senha
Do ponto de vista da segurança, essa é a pior opção, pois a chave privada é totalmente desprotegida caso seja exposta. Essa é, no entanto, a única maneira de garantir que a senha não precise ser digitada novamente após uma reinicialização.
ssh-key com senha, com
ssh-agent
, passando senha para assh-add
partir do scriptEmbora possa parecer uma idéia simples passar a senha
ssh-add
de um script, por exemploecho "passphrase\n" | ssh-add
, isso não é tão direto quanto parecessh-add
não ler a senhastdin
, mas é aberto/dev/tty
diretamente para leitura .Isso pode ser contornado com
expect
uma ferramenta para automatizar aplicativos interativos. Abaixo está um exemplo de script que adiciona uma chave ssh usando uma frase secreta armazenada no script:Observe que, como a senha é armazenada em texto sem formatação no script, do ponto de vista da segurança, isso não é melhor do que ter uma chave ssh sem senha. Se essa abordagem for usada, é importante garantir que o
expect
script que contém a frase secreta tenha permissões adequadas definidas, tornando-a legível, gravável e executável apenas pelo proprietário da chave.fonte
ssh-agent
snippet~/.bash_profile
se comporta, conforme explicado na resposta. Você pode querer olhar para okeychain
utilitário. Comkeychain
a necessidade de digitar a senha no primeiro login após a reinicialização, os logins subseqüenteskeychain
serão conectados a umassh-agent
instância existente com a chave descriptografada na memória. Além disso, há a opção de gerar uma chave ssh sem uma senha, mas isso não é recomendado.ssh-add
um script. O motivoecho "pass\n" | ssh-add
não funciona é quessh-add
não lê a senhastdin
, mas abre/dev/tty
diretamente para leitura. Atualizada a resposta para incluir uma solução alternativa para isso, usando um utilitário chamadoexpect
.gssapi-with-mic
. Isso geralmente é usado em redes maiores, mas é claro que se você tiver interesse, vale a pena investigar.Adicione isso ao seu e
~/.bashrc
, em seguida, efetue logout e entre novamente para entrar em vigor.Isso deve solicitar apenas uma senha na primeira vez que você fizer login após cada reinicialização. Ele continuará reutilizando o mesmo
ssh-agent
enquanto permanecer em execução.fonte
ssh-add -l
retorna um código de saída de 0 quando o agente tem identidades e 1 quando ele não para que você pode cortar grep para fora do último comando e usossh-add -l > '/dev/null' || ssh-add
Não está intimamente relacionado à pergunta do OP, mas pode ser útil para outros: já que 7.2.0 ssh (1) tem uma opção que permite adicionar uma chave ao ssh-agent na primeira autenticação; a opção é
AddKeysToAgent
e pode ser definida comoyes
,no
,ask
, ouconfirm
, em todo o sistema ou em seu pessoal.ssh/config
de arquivo.Referência: https://www.openssh.com/txt/release-7.2
fonte
.ssh/config
arquivo: isso se aplica assh
qualquer coisa que usessh
por trás dele, por exemploscp
, e pode ser feito por host.ssh-agent
armazena em cache várias chaves ssh desbloqueadas, para que você possa protegê-las com senhas, mas sem precisar digitá-las todas as vezes.Para armazenar em cache as chaves desbloqueadas, obviamente é necessário desbloqueá-las. Para desbloquear chaves bloqueadas com uma senha, obviamente é necessário conhecê-las.
Qualquer método que não exija autorização de um ser humano (por exemplo, "digitando uma senha") não apenas tornará seu sistema inseguro; também tornará sem sentido todo o propósito do agente ssh.
Dito tudo isso, você pode simplesmente usar chaves ssh que não são protegidas por senha (pressione Enterquando solicitado por uma senha durante a geração de chaves). Como não há senha,
ssh-agent
não é necessário solicitar uma para (não) armazená-la em cache.fonte
Aqui está uma solução alternativa para automatizar sua senha SSH.
Crie um script de uma linha que imprima sua senha na saída padrão, por exemplo:
Importante: Certifique-se de copiar o espaço inicial para impedir o armazenamento de sua senha no seu histórico .
E use um dos métodos abaixo.
usando uma abordagem de entrada padrão:
ou abordagem de pipe nomeado :
Crie um canal nomeado (você também pode tentar uma substituição de processo ):
Execute
ssh-add
especificando o programa usado para a autenticação:Veja:
man ssh-add
para ler mais sobreSSH_ASKPASS
.fonte
echo my_passphrase
é um grande buraco de segurança. Primeiro, depois de digitar, a senha está em texto não criptografado no arquivo de histórico de qualquer shell que você usar. E os argumentos da segunda linha de comando são legíveis mundialmente no Unix (ps -ef
). Nunca coloque senhas nos argumentos da linha de comando!ps
saída. De qualquer forma, o arquivo de histórico geralmente é legível apenas pelo usuário proprietário, mas as linhas de comando são legíveis por todos os usuários em um sistema.Não vou recomendar o ssh-add (que precisa abrir um ssh-agent) no login. Isso ocorre porque você não pode controlar quando a seção ssh-agent termina e pode criar risco de segurança quando não precisar usar os arquivos de chave em uma seção de login.
Em vez disso, recomendo escrever um script que abra o sub-shell da seção do ssh-agent, com todos os arquivos-chave adicionados automaticamente e seja chamado quando necessário para usar o ssh. Se você pode adotar isso, continue a ler.
Você teria duas opções:
Remova todas as frases secretas de suas chaves, que possuem segurança fraca se seus arquivos de chave forem roubados. (portanto, não recomendado )
Use a mesma senha para suas chaves. Quando você
ssh-add keyfile1 keyfile2 ...
precisar digitar a senha apenas uma vez, por seção.Nos dois casos, você pode escrever o arquivo de script "ssh_keys_section.sh" como abaixo:
Observações:
ssh-keygen -p -f keyfile
/path/to/yourterminal &
(depende do SO)fonte
/path/to/yourterminal &
==>mintty &
fonte
Eu costumava usar o script mencionado por steampowered, fiz o abaixo agora, porque ele não deixa os arquivos por aí.
Trabalhando
zsh
apenas no shell.fonte
Dando crédito aqui: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
Esta solução também é recomendada aqui: http://mah.everybody.org/docs/ssh
fonte
A solução de logon único para SSH poderia me levar a
pam_ssh
.De acordo com este artigo , o conceito é:
Não verifiquei se isso realmente funcionaria.
fonte
Adicione isso ao seu
~/.bashrc
arquivo:fonte
Para adicionar uma chave (possivelmente sem senha) e garantir que
ssh-add
ela não solicite uma senha, independentemente do que seja, mesmo quando executada no X :O status de saída indica sucesso ou falha.
fonte
Se você estiver executando o cavalo-marinho como seu gerenciador de senhas ... Qual você provavelmente é; D
Outra solução que atinge o objetivo que você está procurando é simplesmente adicionar as chaves ssh ao cavalo-marinho para desbloqueio automático no login. O principal benefício disso é que você nunca precisará digitar uma senha para as chaves depois de fazer login no gdm, ou qualquer que seja o seu login, mesmo que as chaves tenham uma senha. Isso requer a chave privada e a chave pública. Eles também DEVEM seguir uma convenção de nomenclatura para cavalos-marinhos. O padrão é aceitável (id_rsa para chave privada e id_rsa.pub para chave pública ... Realmente qualquer coisa que seja privatekeyname e privatekeyname.pub )
Para adicionar sua chave ssh ao cavalo-marinho para desbloqueio automático no login; (no fedora25, não tenho certeza de onde o caminho está em outras distros, embora seja provavelmente muito parecido)
Pra mim foi
(o cavalo marinho assumirá automaticamente que a chave pública no meu caso era id_rsa.pub)
Após executar o comando, o cavalo-marinho abrirá um pequeno e bonito campo de senha gtk para inserir a senha da chave privada. ou deixe em branco se você gerou a chave sem uma senha.
O cavalo marinho não avisa se tudo correu bem. Você precisará tentar ssh na máquina de destino. Então o cavalo-marinho solicitará que você desbloqueie a chave com uma senha graficamente (ISSO SÓ ACONTECERÁ UMA VEZ) novamente, mas desta vez deve parecer um pouco diferente; P (essa também é a parte em que o cavalo-marinho faz um cavalo-marinho para adicionar ssh à magia, acredito ) e ofereça a OPÇÃO para desbloquear a chave no login, você deve marcar esta opção para atingir seu objetivo.
Só porque eu não li todas as respostas, eu recomendaria desfazer o que todos lhe disseram para fazer com o ssh-add antes de tentar esta resposta. Fazer isso de outra forma pode resultar em algo ruim acontecendo com suas chaves, idk.
fonte
Aqui está o script definitivo.
Atualize $ PASSW e copie e cole no seu Terminal
fonte
A melhor maneira de saber é usar um script de login do PAM que adaptei do trabalho anterior, porque não encontrei uma resposta satisfatória nesta pergunta.
Sua senha é armazenada criptografada com a senha do sistema e uma função de derivação pesada. No login, sua senha do sistema é usada para descriptografar sua senha e adicioná-la ao agente.
https://github.com/capocasa/systemd-user-pam-ssh
A vantagem sobre todas as outras soluções apresentadas é que ela combina segurança equivalente à execução manual do ssh-add na inicialização, sem nenhum esforço. Ele não requer ferramentas extras e possui uma dependência extra que já está instalada por padrão na maioria dos sistemas (OpenSSL).
fonte
Minha configuração no macOS é a seguinte (no
.zshrc
ou.bash_profile
para o pessoal do bash):A
|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]
parte é necessária no MacOS porque o valor padrão é/private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners
. Caso contrário, a resposta abrangente do @Thomas Nyman falha porque$SSH_AUTH_SOCK
é sempre definida como algo.Em seguida, em
.zlogout
(ou.bash_logout
para pessoas do bash):Testado no macOS Mojave 10.14.5
fonte