Múltiplas chaves ssh

    Este artigo técnico oferece um guia detalhado para usuários de Linux sobre como gerar e gerenciar múltiplas chaves SSH. Abordaremos a criação de chaves distintas, a configuração do cliente SSH para seleção automática de chaves com base no host e o uso do `ssh-agent` para um gerenciamento eficiente e seguro de identidades. Este tutorial é essencial para desenvolvedores, administradores de sistemas e qualquer pessoa que precise interagir com múltiplos serviços e repositórios remotos de forma segura, como em ambientes com contas pessoais e profissionais distintas no GitHub, GitLab ou em diferentes servidores.

Introdução

    O protocolo Secure Shell (SSH) é a principal ferramenta para acesso remoto seguro a sistemas baseados em Unix/Linux. A autenticação baseada em chaves SSH oferece uma alternativa mais segura e conveniente ao uso de senhas. No entanto, em um cenário onde é necessário interagir com diversos serviços — como um servidor de trabalho, um servidor pessoal e múltiplas plataformas de controle de versão (GitHub, GitLab, etc.) — o gerenciamento de uma única chave SSH pode se tornar um risco de segurança ou simplesmente insuficiente.

    Utilizar chaves SSH distintas para cada serviço é uma prática de segurança recomendada, pois isola o acesso. Se uma chave for comprometida, apenas o serviço associado a ela estará vulnerável. Este guia demonstrará o processo de configuração de um ambiente Linux para lidar com múltiplas chaves SSH de maneira transparente e eficaz.

Pré-requisitos

  1.   Um sistema operacional baseado em Linux (como Ubuntu, Debian, Fedora, etc.).
  2.   Acesso a um terminal de linha de comando.
  3.   O pacote OpenSSH Client instalado (geralmente presente por padrão na maioria das distribuições Linux).

Passo a Passo: Geração e Gerenciamento de Múltiplas Chaves SSH

Gerando Novas Chaves SSH

    O primeiro passo é gerar pares de chaves (pública e privada) para cada identidade que você deseja gerenciar. É crucial salvar cada par de chaves com um nome de arquivo único para evitar a sobrescrita da chave padrão (id_rsa ou id_ed25519).

    Vamos criar duas novas chaves: uma para uso pessoal (ex: GitHub pessoal) e outra para trabalho (ex: GitLab da empresa).

    1. Abra o terminal
    2. Gere a chave SSH para a conta pessoal:
        Execute o comando ssh-keygen. Ao ser solicitado o nome do arquivo, forneça um caminho e nome específicos. Recomenda-se o uso do algoritmo Ed25519 por sua segurança e performance

   ssh-keygen -t ed25519 -C "seu_email_pessoal@exemplo.com"

        Quando solicitado, insira o caminho para salvar a chave: Enter file in which to save the key (/home/usuario/.ssh/id_rsa): ~/.ssh/id_ed25519_pessoal
        É altamente recomendável definir uma passphrase (frase de segurança) para proteger sua chave privada.

    3. Gere a chave SSH para a conta de trabalho:
        Repita o processo, mas com um nome de arquivo e comentário diferentes.

   ssh-keygen -t ed25519 -C "seu_email_trabalho@empresa.com"

        Insira um caminho diferente para a chave: Enter file in which to save the key (/home/usuario/.ssh/id_rsa): ~/.ssh/id_ed25519_trabalho
        Defina também uma passphrase segura para esta chave.
        Ao final, você terá dois novos pares de chaves no seu diretório ~/.ssh

        id_ed25519_pessoal (chave privada) e id_ed25519_pessoal.pub (chave pública)
        id_ed25519_trabalho (chave privada) e id_ed25519_trabalho.pub (chave pública)

        A chave pública (.pub) é a que você irá adicionar aos serviços remotos (servidores, contas GitHub/GitLab, etc.).

Configurando o Cliente SSH para Seleção Automática de Chaves

    Para que o cliente SSH saiba qual chave utilizar para cada conexão, sem a necessidade de especificá-la manualmente com a flag -i a cada comando, utilizamos o arquivo de configuração ~/.ssh/config

    1.  Crie ou edite o arquivo de configuração:

  vi ~/.ssh/config

    2.  Adicione as configurações de Host:
        Dentro deste arquivo, você pode criar blocos de configuração para diferentes hosts. Cada bloco define regras para conexões a um host específico.
        Vamos configurar o SSH para usar a chave pessoal ao se conectar ao github.com e a chave de trabalho para uma instância do GitLab da empresa, por exemplo, gitlab.empresa.com

        Adicione o seguinte conteúdo ao arquivo ~/.ssh/config

    # Conta Pessoal - GitHub
    Host github.com-pessoal
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_ed25519_pessoal
        IdentitiesOnly yes

    # Conta de Trabalho - GitLab da Empresa
    Host gitlab.empresa.com
        HostName gitlab.empresa.com
        User git
        IdentityFile ~/.ssh/id_ed25519_trabalho
        IdentitiesOnly yes

    # Configuração Padrão (Opcional)
    Host *
        AddKeysToAgent yes

Análise da Configuração:

  •   Host github.com-pessoal: Este é um alias ou um apelido que você usará em seus comandos. Ele não precisa ser o hostname real.
  •   HostName github.com: Este é o endereço real do servidor ao qual você está se conectando.
  •   User git: O nome de usuário remoto a ser utilizado. Para serviços Git como GitHub e GitLab, o usuário é geralmente git.
  •   IdentityFile ~/.ssh/id_ed25519_pessoal: Aqui especificamos o caminho para a chave privada que deve ser usada para este host.
  •   IdentitiesOnly yes: Esta diretiva força o SSH a usar apenas a identidade especificada no `IdentityFile`, evitando que ele tente outras chaves disponíveis.
  •   Host *: É uma entrada genérica que se aplica a todos os hosts que não possuem uma configuração específica. AddKeysToAgent yes instrui o SSH a adicionar a chave ao ssh-agent na primeira vez que for usada com a passphrase.

Utilizando o ssh-agent para Gerenciar Passphrases

    O ssh-agent é um programa auxiliar que mantém as chaves privadas descriptografadas na memória, evitando a necessidade de digitar a passphrase toda vez que uma chave é utilizada.

    1. Inicie o ssh-agent em sua sessão:
        Para iniciar o agente para a sessão atual do terminal, execute:

   eval "$(ssh-agent -s)"

        Para que o agente inicie automaticamente a cada nova sessão de terminal, você pode adicionar este comando ao seu arquivo de inicialização de shell (como ~/.bashrc, ~/.zshrc, etc.).

    2.  Adicione suas chaves ao ssh-agent:
        Agora, adicione as chaves privadas ao agente. Você precisará digitar a passphrase de cada chave apenas uma vez por sessão.

   ssh-add ~/.ssh/id_ed25519_pessoal
   ssh-add ~/.ssh/id_ed25519_trabalho
   
        Você pode listar as chaves carregadas no agente com o comando ssh-add -l.

    4. Exemplo Prático: Clonando Repositórios de Diferentes Contas Git
        Com a configuração acima, o processo de interação com diferentes serviços se torna transparente.

        Para clonar um repositório da sua conta pessoal do GitHub:
        Use o alias github.com-pessoal que foi definido no arquivo ~/.ssh/config

        Formato: git clone git@<Alias_do_Host>:<usuario>/<repositorio>.git

    
   git clone git@github.com-pessoal:seu-usuario-pessoal/meu-projeto-pessoal.git
   
        O SSH irá ler o arquivo de configuração, encontrar a entrada github.com-pessoal, conectar-se ao github.com e usar a chave id_ed25519_pessoal para autenticação.

      Para clonar um repositório da conta de trabalho no GitLab:
      Use o host gitlab.empresa.com conforme definido no arquivo de configuração.

    git clone git@gitlab.empresa.com:seu-usuario-trabalho/projeto-da-empresa.git

      Neste caso, a chave id_ed25519_trabalho será utilizada automaticamente.

    5. Melhores Práticas de Segurança

        Sempre use passphrases fortes: Uma chave privada sem passphrase é como uma senha em um arquivo de texto. Se o arquivo for roubado, o acesso é imediato.
        Permissões de arquivo restritas: Garanta que suas chaves privadas e o diretório ~/.ssh tenham permissões restritas.
    
   chmod 700 ~/.ssh
   chmod 600 ~/.ssh/id_*
   chmod 644 ~/.ssh/*.pub ~/.ssh/config
   
        Auditoria regular: Revise periodicamente as chaves públicas adicionadas aos seus serviços remotos e remova aquelas que não são mais necessárias ou confiáveis.
        Chaves específicas por dispositivo: Para um nível ainda maior de segurança, considere gerar chaves SSH distintas para cada máquina da qual você se conecta a serviços remotos.

    6. Conclusão

    O gerenciamento de múltiplas chaves SSH no Linux, através da combinação do arquivo `~/.ssh/config` e do `ssh-agent`, proporciona um fluxo de trabalho seguro, organizado e eficiente. Essa abordagem permite a separação clara de identidades digitais, sendo uma habilidade fundamental para profissionais de tecnologia que operam em múltiplos ambientes. Ao seguir os passos e as melhores práticas delineadas neste artigo, você pode garantir que suas conexões remotas sejam tanto seguras quanto fáceis de gerenciar.