Sobre o SSH Agent

Introdução


O agente SSH faz parte do OpenSSH. Neste post, explicarei o que é um agente, como usá-lo e como funciona para manter suas chaves seguras. Também descreverei o encaminhamento de agentes e como ele funciona. Ajudarei você a reduzir o risco de usar o encaminhamento de agente e compartilharei uma alternativa ao encaminhamento de agente que você pode usar ao acessar seus hosts internos por meio de bastiões.

O que é um agente SSH


ssh-agentÉ um gerenciador de chaves para SSH. Ele armazena suas chaves e certificados na memória, não criptografados e prontos para uso ssh. Isso elimina a necessidade de inserir uma senha sempre que você se conectar ao servidor. Ele é executado em segundo plano no seu sistema, separado sshe geralmente inicia na primeira inicialização ssh.

O agente SSH mantém as chaves secretas em segurança porque não :

  • Ele não grava nenhuma informação importante no disco.
  • Não permite que você exporte suas chaves privadas.

As chaves secretas armazenadas no agente podem ser usadas apenas para uma finalidade: assinar uma mensagem.

Mas se um agente pode apenas assinar mensagens, como o SSH criptografa e descriptografa o tráfego?

No primeiro estudo de chaves públicas e privadas de SSH, é natural supor que o SSH use esses pares de chaves para criptografar e descriptografar o tráfego. Isso é exatamente o que eu pensei. Mas esse não é o caso. O par de chaves SSH é usado apenas para autenticação durante a conexão inicial.

Por exemplo, veja como verificar uma chave de usuário durante uma conexão SSH, da perspectiva do servidor:

  • O cliente fornece ao servidor uma chave pública.
  • O servidor gera e envia uma mensagem aleatória curta solicitando que o cliente assine usando uma chave privada.
  • O cliente pede ao agente SSH para assinar a mensagem e envia o resultado de volta ao servidor.
  • O servidor verifica a assinatura usando a chave pública do cliente.
  • Agora o servidor tem prova de que o cliente possui a chave privada.

Posteriormente, durante o processo de conexão, é gerado um conjunto de novas chaves efêmeras e simétricas, usadas para criptografar o tráfego da sessão SSH. Essas chaves podem nem durar uma sessão inteira; O evento rekey ocorre em intervalos regulares.

Protocolo do agente


O SSH usa um soquete de domínio Unix para se comunicar com o agente pelo protocolo do agente SSH . A maioria das pessoas usa o ssh-agentque vem com o OpenSSH, mas existem muitas alternativas de código aberto.

O protocolo do agente é tão simples que você pode escrever um agente SSH básico em um dia ou dois. Possui apenas algumas operações básicas:

  • Adicionar um par de chaves comum (chaves privadas públicas e descriptografadas)
  • Adicionar um par de chaves limitado (chaves privadas públicas e descriptografadas)
  • Adicionar chave (regular ou limitada) do cartão inteligente (apenas chave pública)
  • Tecla Delete
  • Listando chaves armazenadas no agente
  • Assinando uma mensagem com uma chave armazenada no agente
  • Bloquear ou desbloquear um agente inteiro com uma senha

O que é uma chave limitada? Geralmente, é uma chave que tem vida útil limitada ou requer confirmação explícita do usuário ao usá-la.

O comando ssh-addé seu gateway para o agente SSH. Ele executa todas essas operações, exceto a assinatura. Quando você executa o ssh-add sem nenhum parâmetro, ele verifica o diretório inicial em busca de algumas chaves padrão e as adiciona ao seu agente. Por padrão, ele procura por:

  • ~/.ssh/id_rsa
  • ~/.ssh/id_ed25519
  • ~/.ssh/id_dsa
  • ~/.ssh/id_ecdsa

Assim que você adicionar as chaves ao chaveiro, elas serão usadas automaticamente ssh.

ssh-e o macOS Keychain
ssh-agent , fornecido com o macOS, pode armazenar a senha para chaves no macOS Keychain, o que facilita ainda mais a adição de chaves ao agente após uma reinicialização. Dependendo das configurações de chaveiro, você ainda pode precisar desbloqueá-lo após uma reinicialização. Para salvar passphrases-chave para chaveiro, execute o comando ssh-add -K [ ]. As frases secretas são geralmente armazenadas em "Itens Locais". ssh-agentusará essas senhas salvas automaticamente, conforme necessário.

O que é encaminhamento de agente


O recurso de encaminhamento de agente permite que o agente SSH local se comunique através de uma conexão SSH existente e autentique de forma transparente em um servidor mais remoto. Por exemplo, suponha que você efetue login no EC2 através do SSH e queira clonar um repositório GitHub privado a partir daí. Sem o encaminhamento do agente, você precisará armazenar uma cópia da sua chave privada do GitHub no host do EC2. Quando o agente está sendo redirecionado, o cliente SSH no EC2 pode usar as chaves no computador local para autenticação no GitHub.

Como o encaminhamento de agente funciona


Em primeiro lugar, um pouco de fundo. As conexões SSH podem ter vários canais. Aqui está um exemplo comum: uma conexão interativa com o bastião-host (caixa de salto) é realizada em um canal. Quando o encaminhamento do agente é ativado para a conexão (geralmente em uso ssh -A), um segundo canal é aberto em segundo plano para encaminhar as solicitações do agente de volta ao seu computador local.

Em termos de ssh, não há diferença entre remoto e local ssh-agent. O SSH sempre analisa a variável de ambiente $SSH_AUTH_SOCKpara encontrar o soquete de domínio Unix para o agente. Ao conectar-se a um host remoto com o encaminhamento de agente ativado, o SSHD criará um soquete de domínio Unix remoto associado ao canal de encaminhamento do agente e exportará os $SSH_AUTH_SOCKpontos que apontam para ele.

imagem

O encaminhamento de agente está associado a um certo risco


Quando você redireciona um soquete de domínio ssh-agentUnix para um host remoto, isso representa um risco de segurança: qualquer pessoa com acesso root no host remoto pode acessar discretamente seu agente SSH local através do soquete. Eles podem usar suas chaves para se passar por outras máquinas na rede.

Aqui está um exemplo de como isso pode parecer:

imagem

Como reduzir seu risco com encaminhamento de agente


Aqui estão algumas maneiras de tornar o redirecionamento de agente mais seguro:

  • Não ative ForwardAgentpor padrão.


Bloqueie seu agente ssh ao usar o encaminhamento de agente. ssh-add -xbloqueia o agente com uma senha e a ssh-add -Xdesbloqueia. Quando você está conectado a um host remoto com encaminhamento de agente, ninguém pode inserir seu agente sem uma senha.

Ou use um agente SSH alternativo que pergunte quando estiver em uso. Sekey usa o Touch ID no macOS para armazenar chaves no enclave de segurança do MacBook Pro.

Ou não use o encaminhamento de agente. Se você está tentando acessar hosts internos por meio do bastião, há ProxyJumpuma alternativa muito mais segura para esse caso de uso. (ver abaixo)

Uso ProxyJump: uma alternativa mais segura


Quando você quer passar pelo bastião-host (jumpbox), realmente não precisa de um encaminhamento de agente. A melhor abordagem é usar a diretiva ProxyJump.

Em vez de redirecionar o agente por um canal separado, ele ProxyJumpredireciona a entrada e a saída padrão do seu cliente SSH local através do bastião e depois para o host remoto. Veja como funciona:

  1. Execute ssh -J bastion.example.com cloud.computer.internalpara conectar-se cloud.computer.internalatravés do seu host bastião bastion.example.com. cloud.computer.internalÉ o nome do host que pode ser encontrado pesquisando o DNS bastion.example.com.
  2. Seu cliente SSH usa as chaves do seu agente para se conectar bastion.example.com.
  3. Depois de conectar o SSHD ao bastião, ele se conecta cloud.computer.internale transfere essa conexão para o seu cliente SSH local.
  4. Seu cliente SSH local passa pela conexão novamente, desta vez com cloud.computer.internal

Você pode pensar nisso como SSH em uma sessão SSH; exceto que o ssh nunca roda no bastião. Em vez disso, ele se sshdconecta cloud.computer.internale fornece o controle dessa conexão (entrada e saída padrão) de volta ao SSH local, que faz uma segunda conexão.

Configurando o ProxyJump

Digamos que bastion-host isso bastion.example.com. Eu posso configurar o meu ~/.ssh/configassim:

Host bastion.example.com
	User carl

Host *.computer.internal
	ProxyJump bastion.example.com
	User carl

Depois, corro ssh cloud.computer.internalpara me conectar ao destino interno via bastião - sem encaminhamento de agente.

Se o ProxyJump não funcionar ...

As versões mais antigas do SSH e SSHD (anteriores à versão 7.2, lançadas em 2016) não suportam ProxyJump. Mas você pode executar uma operação equivalente usando ProxyCommande netcat . Aqui está um exemplo:

ssh -o ProxyCommand="ssh bastion.example.com nc %h %p" cloud.computer.internal

A mágica aqui é que o próprio SSH é o servidor proxy que você usa para o SSH. A peça nc %h %psimplesmente abre a conexão de soquete bruto cloud.computer.internalna porta 22. A entrada / saída padrão do comando pai ssh é passada diretamente para, ProxyCommandpara que o pai ssh possa se autenticar no host interno por meio de uma conexão proxy.



imagem
Aprenda os detalhes de como obter uma profissão procurada desde o início ou suba de nível em habilidades e salário fazendo cursos on-line SkillFactory:



Consulte Mais informação



All Articles