Skip to main content

SSH ( Secure Shell)

o SSH (Secure Shell) é um protocolo de rede criptografado usado para comunicação segura entre dispositivos. Permite acessar remotamente o terminal de outro computador ou servidor como se estivesse fisicamente presente. É amplamente utilizado por administradores de sistemas, desenvolvedores e usuários que precisam de acesso remoto seguro.

Uma característica chave do SSH é sua capacidade de criptografar todos os dados transmitidos, garantindo a segurança de senhas e comandos. Ele suporta autenticação por chaves assimétricas, aumentando ainda mais a segurança das conexões.

O serviço SSH geralmente é executado na porta 22 por padrão, e para acessar um servidor via SSH, você usa o comando ssh seguido do nome de usuário e do endereço IP ou nome de domínio do servidor.

Vamos imaginar que temos o usuário david na máquina que queremos acessar e o ip da máquina é 192.168.0.10. Desde que você consiga alcançar a máquina destino podemos executar

ssh [email protected]

# Apontando uma porta específica em que serviço de ssh da máquina esteja rodando.
ssh -p 2222 [email protected]

Os comando acima pedirão a senha de david ao tentar logar como david.

A prática recomendada é desativar o acesso SSH via senha e, em vez disso, usar autenticação por chave pública. Isso significa que, em vez de digitar uma senha ao se conectar, você autentica sua identidade com uma chave privada correspondente a uma chave pública armazenada no servidor.

Isso que dizer que temos precisamos de duas chaves uma pública e uma privada. Tudo que for encriptado com a chave privada somente será desencriptado com a chave pública. Nem a própria chave privada conseguiria desencriptar o que ela mesmo encriptou. Da mesma forma, tudo que é encriptado com a chave pública somente será desencriptado com a chave privada. Essas chaves trabalham em pares. Essa método de criptografia é conhecida como criptografia assimétrica.

Vale ressaltar que mesmo utilizando senha para se autenticação a comunicação será criptografada pelo protocolo SSH. No caso de uso do par de chaves publica e privada, estas somente são utilizadas para autenticação.

Uma vez autenticado o protocolo SSH negociará um uma chave simétrica gerada por ele e comum para o cliente e o servidor para criptografar os dados.

O uso de chaves para autenticação oferece várias vantagens significativas em comparação com a autenticação baseada em senhas:

  • Segurança aprimorada: As chaves SSH são muito mais seguras do que senhas, pois são mais difíceis de serem adivinhadas por ataques de força bruta.

  • Eliminação de senhas: Com o uso de chaves SSH, você pode eliminar a necessidade de inserir senhas ao se conectar a servidores remotos. Isso simplifica o processo de login e elimina o risco de senhas serem interceptadas ou comprometidas.

  • Auditoria e gerenciamento centralizado: As chaves SSH podem ser gerenciadas centralmente e auditadas de forma mais eficaz do que senhas. Os administradores podem controlar quais chaves têm acesso a quais servidores e revogar chaves comprometidas de forma rápida e fácil.

  • Capacidade de usar autenticação de dois fatores (2FA): As chaves SSH podem ser combinadas com autenticação de dois fatores (como senhas ou autenticação baseada em token) para fornecer uma camada adicional de segurança. Isso requer que os usuários forneçam não apenas a chave SSH, mas também outro fator de autenticação para acessar o servidor.

Criando chaves SSH

Para configurar a autenticação por chave pública, você precisa gerar um par de chaves SSH (uma pública e uma privada) em sua máquina local e depois adicionar o conteúdo da chave pública ao arquivo ~/.ssh/authorized_keys no servidor remoto para o usuário que deseja acessar. Se temos o usuário david no servidor e é com ele que queremos autenticar será em /home/david/.ssh/authorized_keys.

Se servidor contém a chave pública e ela só consegue desencriptar somente o que veio do seu par, a chave privada, então garantimos que quem tem a chave privada é quem diz ser.

Primeiro vamos gerar uma um par de chaves para uso com o SSH. Temos vários algoritmos de criptografia que podemos utilizar, mas vou abordar somente os dois mais considerados seguros.

O par de chaves SSH não tem um tempo de validade como um certificado. A chave privada não deve ser compartilhada.

O algoritmo RSA é de 1977 e mais utilizado do que o Ed25519 que é de 2011, apesar deste último ser melhor. Vamos ver as diferenças.

CaracterísticaRSAEd25519
TipoAssimétricoAssimétrico
Tamanho das ChavesGeralmente 2048 bits ou mais256 bits
Eficiência ComputacionalMais intensivo computacionalmenteMais eficiente computacionalmente
Geração de ChavesMais lentaMais rápida
Tamanho dos Dados AssinadosTende a ser maiorTende a ser menor
Resistência a Ataques de Força BrutaMenos resistenteMais resistente
Suporte e AdoçãoAmpla adoção e suporte em muitos sistemas e protocolosGanha popularidade, ainda em processo de adoção
Armazenamento de Chaves no ClienteNecessita armazenar chave privada no clienteNecessita armazenar chave privada no cliente
Armazenamento de Chaves no ServidorNecessita armazenar chave pública no servidorNecessita armazenar chave pública no servidor
Uso em Aplicações AtuaisAinda amplamente utilizado em muitos cenáriosGanha popularidade, especialmente em ambientes onde a eficiência é uma prioridade
SegurançaRSAEd25519
VulnerabilidadesVulnerável a ataques de fatoração de inteirosMais resistente a vários tipos de ataques
Base MatemáticaBaseado no problema da fatoração de inteirosBaseado no problema do logaritmo discreto em curvas elípticas
Resistência a Ataques de Força BrutaMenos resistenteMais resistente
Ataques ConhecidosAtaques conhecidos, como ataques de fatoração e ataques de comprometimento de chaves privadasMenos ataques conhecidos devido à sua natureza mais recente

Para criar um par de chaves.

# O comando abaixo utilizar o algoritmo RSA como default
# Utiliza 2048 bits e gera os arquivos id_rsa para a chave privada e id_rsa.pub em ~/.ssh
ssh-keygen
# Podemos aumentar a quantidade de bits para fortalecer a segurança do algoritmo.
# -N "" é para não passar uma senha para essa chave.
# -f é o nome que vamos dar para a chave. Já podemos passar o caminho para onde o arquivo minha_chave_rsa estará.
ssh-keygen -t rsa -b 4096 -f ~/Desktop/minha_chave_rsa -N ""

# Utilizando o algoritmo Ed25519 e usando uma senha (não é obrigatório) para a chave privada.
# O tamanho de ed25519 é sempre 256 então se passarmos o comando -b 4096 ele será ignorado
ssh-keygen -t ed25519 -f ~/Desktop/minha_chave_ed25519 -N "minha!senha"

Agora temos o par de chaves coloque o conteúdo da chave pública dentro de .ssh/authorized_keys do usuário que queremos logar. Tenho uma máquina que o usuário é ubuntu e tenho a chave pública no lugar certo.

# Na máquina local
cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDXZQyz0KI35+Cay+p13+9DQs5R2twRojHIj3DHSC1DcRm9HEw0HpTQLunM181mtv6ElZXU5zKCrKRkXJUHTTAN5t7l7YVHTCJ3CoHbaDdZBTncZbXNBYRniRS+NV4uXuYVqzaDOK8mnytgQwKhbrwnA77vyHsDT4DZQM4FA3EiOpzHSKz7/uvgojOASEd6TTRHtLdLwXemqww9C060Gwg2wFTk9HbZI9kzJYVSBhK4Z4Fd5RsBiFsmz1GqSXTunncDLHgz1EtC+ShoRJ/ckEmfqZaGjBE2TiK4YGikXKul1RceSjsk9nROcxWt6uJdRAi0m/XsYat6E5UHP0IRwYcQt6Mcjj/3nPpGqSXjR6oNlondI+Pg7CffrKU+WhtVC5mwfLxg960B1PeSDsbnYJhg+vSGsXmmrgKZb6Xz8Qgl3o72d6gW1+2Lpnwtm6Q7lP5kzGpWCPMHjpzzTb41JHzAqM7vBFvfPw7YIUVgdbkMyjN/ap/BWApe1acbYMVNSTrE02HzdPtmI2FvJU8cy93PayEC9/SntNV1m9WcgxFZCoJQamDwOME4hfRMF/efgZ8haEJGXM2TqnBO3bsZI+m2nPwV85TpYU+uKZeNAEbxq7JoKMV6JInX+6+VBK4GfFXwElhFqG+6gzRXLB3Cvuv+I4BHFiuOXKmUq2k6ik3PLQ== david@david

# -i para passar a chave privada que queremos logar
ssh -i id_rsa [email protected]

# Já dentro do sistema podemos ver a chave publica equivalente.
ubuntu@master1:~$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDXZQyz0KI35+Cay+p13+9DQs5R2twRojHIj3DHSC1DcRm9HEw0HpTQLunM181mtv6ElZXU5zKCrKRkXJUHTTAN5t7l7YVHTCJ3CoHbaDdZBTncZbXNBYRniRS+NV4uXuYVqzaDOK8mnytgQwKhbrwnA77vyHsDT4DZQM4FA3EiOpzHSKz7/uvgojOASEd6TTRHtLdLwXemqww9C060Gwg2wFTk9HbZI9kzJYVSBhK4Z4Fd5RsBiFsmz1GqSXTunncDLHgz1EtC+ShoRJ/ckEmfqZaGjBE2TiK4YGikXKul1RceSjsk9nROcxWt6uJdRAi0m/XsYat6E5UHP0IRwYcQt6Mcjj/3nPpGqSXjR6oNlondI+Pg7CffrKU+WhtVC5mwfLxg960B1PeSDsbnYJhg+vSGsXmmrgKZb6Xz8Qgl3o72d6gW1+2Lpnwtm6Q7lP5kzGpWCPMHjpzzTb41JHzAqM7vBFvfPw7YIUVgdbkMyjN/ap/BWApe1acbYMVNSTrE02HzdPtmI2FvJU8cy93PayEC9/SntNV1m9WcgxFZCoJQamDwOME4hfRMF/efgZ8haEJGXM2TqnBO3bsZI+m2nPwV85TpYU+uKZeNAEbxq7JoKMV6JInX+6+VBK4GfFXwElhFqG+6gzRXLB3Cvuv+I4BHFiuOXKmUq2k6ik3PLQ== david@david
ubuntu@master1:~$

Ao invés de passar qual a chave temos que utilizar todas as vezes usando o -i.

Como Gerenciar Multiplas Chaves SSH?

As vezes é necessário utilizar diferentes chaves privadas ssh para fazer logins em diferentes servidores. O par de chaves A é usado nos servidores na empresa A e o par de chaves B usados no servidor da empresa B ou até mesmo teremos nossa chave pessoal para fazer interagir com os nossos próprios repositórios e uma outra chave para interagir com os repositórios da empresa.

Podemos usar o ssh-agent que é um programa que gerencia as chaves privadas SSH usadas para autenticação. Ele funciona como um intermediário que armazena as chaves privadas na memória e as utiliza conforme necessário. Para saber se ele esta funcionando.

eval $(ssh-agent)  
# Se o pid for retornado então esta disponível
Agent pid 35526

Se você tem uma chave privada que precisa de uma senha para desbloqueio, carregá-la usando o ssh-agent é interessante pois ele guarda em memória a chaves desbloqueada evitando ter que digitar a senha toda hora. Ao adicionar uma chave ele pede a senha e depois administra sozinho.

# Para adicionar
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa2

# Para Listar
ssh-add -l

# Remove uma chave específica da lista
ssh-add -d ~/.ssh/id_rsa2

# Remove tudo
ssh-add -D

O arquivo em ~/.ssh/config é necessário para saber que chave usar. A configuração mais simples para uma única chave é.

Host *
ForwardAgent yes

Mas podemos definir com qual chaves diferentes para hosts diferentes. Abaixo teremos um exemplo mais concreto com o Gitlab.

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github

Multi Gitlab Account com SSH e Git

No Gitlab não é possível adicionar a mesma chave pública em contas diferentes. Certamente precisaremos criar mais de uma chave. A dica é criar uma configuração para que a chave seja selecionada baseado no host.

Em ~/.ssh vamos imaginar que temos 2 chaves; uma para seu Gitlab pessoal e outra para Gitlab do trabalho.

Então vamos criar uma configuração em ~/.ssh/config.

Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/personal_key
Host gitlab.com-work
HostName gitlab.com
User git
IdentityFile ~/.ssh/work_key

Quando for identificado que o host é gitlab.com vai usar a chave privada personal_key e quando for identificado como gitlab.com-work usará a chave work_key.

Ao executar o comando git clone [email protected]... troque o gitlab.com por gitlab.com-work quando for para um clone do repositório da empresa.

Se um repositório já esta definido somente mude o remote dele setando uma url nova se necessário.

#Exemplo para um repositório do Gitlab do trabalho
git remote set-url origin [email protected]:work/repository.git

Neste caso um detalhe interessante para fazer também é criar uma pasta (work no exemplo abaixo) que irá ter todos os projetos da empresa e alterar a configuração do git para mudar o usuário e email somente naquela pasta e manter o global.


[user]
name = David Puziol
email = [email protected]
[includeIf "gitdir:~/Desktop/work/"]
path = ~/.gitconfig-work

E criar um arquivo .gitconfig-work para sobreescrever o user

[user]
name = David Puziol
email = [email protected]