110.3 Criptográfia e SSH
A criptografia é uma forma de garantir que somente o remetente e o destinatário possam ver o conteúdo do que está criptografado. Então a criptografia garanta que caso alguém no meio do caminho obtenha posse do conteúdo, ele não consiga ler.
A criptografia ou meios criptografos garantem ou tentam, nem sempre temos tudo junto:
Autenticidade
Verificação de que a mensagem foi originada pela pessoa alegada.
Confidencialidade
Garante que somente quem possuir a chave possa ver o conteúdo, geralmente somente o destinatário, nem mesmo o remetente poderá ler depois de criptografar (mesmo que ele tenha criado o conteúdo).
Integridade
Garante que a mensagem não poderá ser adulterada no meio do caminho.
Irretratabiliade
A pessoa que gerou a mensagem não pode dizer que não foi ela (graças a Autenticidade), e isso é valido perante o Juiz.
SSH - Secure Shell
Método de acessar um Shell de forma segura, usa criptografia para garantir Autenticidade, Confidencialidade e Integridade. Usa diferentes métodos de criptografia.
O tipo de criptografia depende do tipo de chave que vai ser usada. Cada máquina possui uma chave pública e uma chave privada, essas chaves são trocadas no momento de Handshake das máquinas.
# Veja as chaves trocadas entre os hosts:
$ ls -lh /etc/ssh/ssh_host_*
-rw------- 1 root root 505 Jan 22 19:02 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r-- 1 root root 176 Jan 22 19:02 /etc/ssh/ssh_host_ecdsa_key.pub
-rw------- 1 root root 411 Jan 22 19:02 /etc/ssh/ssh_host_ed25519_key
-rw-r--r-- 1 root root 96 Jan 22 19:02 /etc/ssh/ssh_host_ed25519_key.pub
-rw------- 1 root root 2,6K Jan 22 19:02 /etc/ssh/ssh_host_rsa_key
-rw-r--r-- 1 root root 568 Jan 22 19:02 /etc/ssh/ssh_host_rsa_key.pub
Métodos de usar o ssh:
# Completo, informando nome e host
ssh USER@HOST
# Completo, mas usando argumentos:
ssh -l USER HOST
# Curto, você precisa ter o mesmo username no host remoto:
ssh HOST
# Como voce ja tem o mesmo username no host de destino, ele vai usar o memso username que está logado no momento.
know_hosts
Fica a chave pública de todas as máquinas que já no conectamos, é através dessas chaves que são feita a criptografia dos dados, entre os hosts.
$ cat ~/.ssh/known_hosts
[192.168.0.25]:65531 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNYhn4y6qbV674WaFcinY+hh1/60hvQ2N5Z+4+1ATH2KvSBa0v3TqyUHilBGohG7M4shXCZk7v5BbTDum2GD0uY=
Dentro do arquivo podemos ver qual a chave pública a máquina de destino usa, caso essa chave mude, não vamos mais conseguir nos conectar, vai dar erro, e então vamos ter que remover a chave da máquina desse arquivo, ai vamos poder nos comunicar de novo.
Esse arquivo known_hosts
normalmente é configurado por usuário, cada usuário vai ter o seu. Mas é possível criar um que seja válido para todos os usuários, ele ficam em /etc/known_hosts
.
Uso de chaves
Antes de usar as chaves do SSH, precisamos ver os tipos de chaves que temos disponíveis:
RSA
É um algoritmo de chave pública amplamente utilizado, e suportado por quase todos os clientes e servidores SSH. É uma opção segura e confiável, embora tenha um tamanho de chave mínimo recomendado de 2048 bits.ECDSA
É um algoritmo de chave pública baseado em curvas elípticas. Tem a vantagem de ter chaves menores do que os algoritmos baseados em fatorização, como o RSA e o DSA, sem sacrificar a segurança. No entanto, nem todos os clientes e servidores SSH suportam o ECDSA.Ed25519 (também conhecida como EdDSA).
É um algoritmo de chave pública mais recente, baseado em curvas elípticas, e é recomendado pelo OpenSSH como a melhor opção de chave para uso com o SSH. Tem um tamanho de chave de 256 bits, tornando-o significativamente menor que o RSA e o DSA, mas ainda assim muito seguro.DSA
Não é mai suportado na nova versão do SSH (a partir da versão 7).
Para criar a chave, usamos o comando abaixo:
### ssh-keygen -t CHAVE -b BITS-da-CHAVE
# Criando uma EdDSA:
$ ssh-keygen -t ed25519
Com a chave publica, voce deve enviar ela para o seu ~/.ssh/authorized_keys
. Dessa forma você vai conseguir logar lá. Você pode deixar o passphrase
em branco, assim não será solicitado senha, mas não recomendo usar assim.
Criação de tunel com SSH
Um túnel SSH é uma forma segura de enviar informações através de uma conexão de rede. Basicamente, é como criar um "túnel" entre dois pontos em uma rede, que permite que você envie informações entre eles de forma segura e criptografada.
Você pode precisar criar um túnel SSH em situações em que precisa acessar uma rede ou servidor remoto que não está diretamente acessível pela Internet ou por uma rede pública. Por exemplo, se você trabalha em uma empresa e precisa acessar um servidor remoto que está localizado em outra rede, mas não quer expor seus dados a possíveis ataques maliciosos, você pode criar um túnel SSH para estabelecer uma conexão segura e criptografada entre seu computador e o servidor remoto.
Outra situação em que você pode precisar criar um túnel SSH é quando precisa acessar um serviço em uma rede bloqueada por um firewall. Com um túnel SSH, é possível estabelecer uma conexão segura com um servidor em uma rede externa e, em seguida, usar esse servidor como um "proxy" para acessar serviços em redes internas bloqueadas pelo firewall.
Em resumo, um túnel SSH é uma forma segura de enviar informações através de uma rede e é usado para proteger dados em trânsito e contornar restrições de rede.
Outro situação em que a criação de um túnel é bem binda é quando um serviço não é criptografado, como uma forma de bypass, podemos criar um túnel SSH para usar esses serviço de modo criptografado.
#### Criando um tunel ssh!
## sudo ssh USER@HOST -L <porta do serviço local>:<servidor remoto>:<porta do serviço remota>
# Para acessar basta fazer:
# localhost:<porta do serviço local>
#### Voce pode usar a opção '-f' para rodar o ssh em 2° plano.
#### Voce pode usar a opção '-N' para não executar comandos remotamente.
# Ex:
$ sudo ssh joao@httpsserver -L 85:localhost:80
# Isso informa que tudo que passar pela minha porta 85, vai ser redirecionada para a porta 80 do host remoto,
# mas dessa forma nós fizemos uma conexão no SSH e criamos um tunel, para termos apenas o tunel,
# use a opção '-f'.
# Ex:
$ sudo ssh -N -f joao@httpsserver -L 85:httpsserver:80
# mesma coisa acima, mas não abre o shell remoto, ainda continua local, perceba que coloquei o nome do
# host entre os ':', isso porque voce pode usar o endereço dele ou pode usar o localhost,
# que no caso é do host remoto.
$ ssh -D 2222 -q -C -N joao@httpsserver
# O comando cima cria um túnel SSH que pode ser usado como um proxy SOCKS.
# O parâmetro '-D' indica a porta em que o proxy SOCKS deve escutar,
# que neste caso é a porta '2222'. O parâmetro -q é usado para desativar a exibição de mensagens de depuração.
# O parâmetro '-C' é usado para ativar a compressão de dados no túnel SSH, o que pode ajudar a melhorar o
# desempenho em conexões lentas. O parâmetro '-N' é usado para especificar que não é necessário executar
# um comando remoto após a conexão ser estabelecida.
# Exemplo real, criar uma conexão SSH para acessar um servidor web acessível apenas na rede local:
$ ssh -L 8480:192.168.1.1:80 fulano@exemplo.com
## O comando acima está criando um túnel SSH que vai redirecionar o tráfego da porta 8480 no meu computador local para o IP 192.168.1.1* na porta 80 no servidor remoto.
# Após executar o comando, basta acessar no navegador:
http://localhost:8480/
## Ao acessar 'localhost:8480', o tráfego será redirecionado pelo túnel SSH até o servidor remoto.
## O servidor remoto, por sua vez, encaminhará o tráfego para o IP 192.168.1.1 na porta 80, que está na rede local do servidor remoto.
Para que seja possível fazer o túnel com redirecionamento de porta o servidor SSH precisa estar permitindo (para isso é usado a opção AllowTcpForwarding
).
SCP
Faz transferencia de arquivos via SSH.
# Enviar aquivo:
scp <arquivo> USER@HOST:<CAMINHO>
# Baixar arquivo:
scp USER@HOST:<arquivo> <CAMINHO>
## Ex:
# Enviar aquivo:
scp texto.txt vagrant@httpsserver:~/
# Baixar arquivo:
scp vagrant@httpsserver:~/Documents/teste.txt .
GPG - Gnu Privacy Guard
Enviar a chave para um servidor de chaves:
### Enviar uma chave
# Veja qual chave voce quer enviar:
$ gpgp list-keys
# Enviando:
$ gpg --keyserver <nome-do-server> --send-keys <ID-da-Chave>
# O servidor de chave pode ser anexado no arquivo...
# Revogando a chave:
$ gpg --keyserver <nome-do-server> --gen-revoke <ID-da-Chave>
### Baixar uma chave
# baixando a chave:
$ gpg --keyserver <nome-do-server> --recv-keys <ID-da-Chave>
Assinando as chaves:
# Assinando um arquivo (voce pode assinar a chave publica):
gpg --sign <arquivo>
# Verificando um arquivo assinado:
gpg --verify <arquivo>
gpg-agent
Similiar o SSH-AGENT, é usado para guardar a passphrase em memória, assim você não precisa ficar digitando a senha toda hora.