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ística | RSA | Ed25519 |
---|---|---|
Tipo | Assimétrico | Assimétrico |
Tamanho das Chaves | Geralmente 2048 bits ou mais | 256 bits |
Eficiência Computacional | Mais intensivo computacionalmente | Mais eficiente computacionalmente |
Geração de Chaves | Mais lenta | Mais rápida |
Tamanho dos Dados Assinados | Tende a ser maior | Tende a ser menor |
Resistência a Ataques de Força Bruta | Menos resistente | Mais resistente |
Suporte e Adoção | Ampla adoção e suporte em muitos sistemas e protocolos | Ganha popularidade, ainda em processo de adoção |
Armazenamento de Chaves no Cliente | Necessita armazenar chave privada no cliente | Necessita armazenar chave privada no cliente |
Armazenamento de Chaves no Servidor | Necessita armazenar chave pública no servidor | Necessita armazenar chave pública no servidor |
Uso em Aplicações Atuais | Ainda amplamente utilizado em muitos cenários | Ganha popularidade, especialmente em ambientes onde a eficiência é uma prioridade |
Segurança | RSA | Ed25519 |
---|---|---|
Vulnerabilidades | Vulnerável a ataques de fatoração de inteiros | Mais resistente a vários tipos de ataques |
Base Matemática | Baseado no problema da fatoração de inteiros | Baseado no problema do logaritmo discreto em curvas elípticas |
Resistência a Ataques de Força Bruta | Menos resistente | Mais resistente |
Ataques Conhecidos | Ataques conhecidos, como ataques de fatoração e ataques de comprometimento de chaves privadas | Menos 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]