Secure Shell para Devs

Rafael Gumieri
Geekie Educação
Published in
9 min readApr 2, 2024

Introdução

O Secure Shell (SSH) é um protocolo de rede utilizado para acesso remoto a sistemas operacionais e transferência segura de dados. Sua história remonta ao final da década de 1990, quando Tatu Ylönen, um pesquisador finlandês, desenvolveu o SSH como uma alternativa segura ao Telnet e ao FTP, que transmitiam dados de forma não criptografada pela internet. Ylönen estava preocupado com a segurança dos dados transmitidos pela rede e desenvolveu o SSH para garantir a privacidade e a integridade das comunicações.

O SSH rapidamente ganhou popularidade devido à sua capacidade de fornecer autenticação forte, criptografia robusta e proteção contra ataques de “man-in-the-middle”. Em 1995, Tatu Ylönen fundou a SSH Communications Security para comercializar o software SSH. No entanto, o código-fonte do SSH original era proprietário e custava dinheiro para licenciar, o que limitava sua adoção em alguns ambientes.

A importância do SSH para a segurança da informação cresceu à medida que mais organizações reconheceram a necessidade de proteger suas comunicações de rede. Em resposta a isso, o OpenSSH foi lançado em 1999 como uma versão de código aberto do SSH original. Desenvolvido por uma comunidade de programadores voluntários, o OpenSSH era gratuito para uso e distribuição, o que aumentava significativamente sua acessibilidade e adoção em todo o mundo.

O OpenSSH não apenas se tornou a implementação padrão do protocolo SSH em muitos sistemas Unix-like, como também foi adotado em sistemas Windows através de ferramentas e portas para uso em ambientes heterogêneos. Sua importância para a segurança cibernética é inegável, fornecendo uma base sólida para a comunicação segura em redes públicas e privadas, incluindo a administração remota de servidores e a transferência de arquivos sensíveis.

Atualmente, uma ampla variedade de ferramentas e aplicativos implementam o Secure Shell (SSH) para oferecer comunicação segura e acesso remoto a sistemas e dispositivos. Desde gerenciadores de servidores remotos e clientes de transferência de arquivos seguros até soluções de automação e orquestração, como Ansible e SaltStack, o SSH está integrado em muitas ferramentas essenciais para administração de sistemas e segurança cibernética. Sua ubiquidade como protocolo padrão para comunicações seguras garante que seja amplamente adotado em diversas áreas, desde a gestão de servidores até a computação em nuvem e o desenvolvimento de software.

  • Gerenciadores de servidores remotos, como PuTTY e MobaXterm;
  • Clientes de transferência de arquivos seguros, como WinSCP e FileZilla (com suporte SFTP);
  • Ferramentas de automação e orquestração, como Ansible e SaltStack;
  • Aplicativos de administração de servidores, como Webmin e cPanel;
  • Soluções de túneis VPN, como o OpenVPN;
  • Plataformas de computação em nuvem, como AWS, Google Cloud Platform e Microsoft Azure, que oferecem acesso SSH para gerenciamento de instâncias de máquinas virtuais.

Neste artigo, não abordaremos as configurações de servidores ou o gerenciamento de chaves por linha de comando (CLI). Nosso foco estará nos comandos ssh e scp, que são fundamentais para operações de login remoto e transferência segura de arquivos. Exploraremos como essas ferramentas essenciais do OpenSSH podem ser utilizadas para estabelecer conexões seguras entre sistemas, permitindo a execução de comandos remotos e a transferência eficiente de dados de forma protegida. Vamos mergulhar nas funcionalidades e na sintaxe destes comandos, destacando suas capacidades e melhores práticas para garantir a segurança e eficácia das operações em ambientes de rede.

O OpenSSH é a principal ferramenta de conectividade para login remoto com o protocolo SSH. Ele criptografa todo o tráfego para eliminar a espionagem, sequestro de conexão e outros ataques. Além disso, o OpenSSH fornece um grande conjunto de capacidades de tunelamento seguro, diversos métodos de autenticação e opções de configuração sofisticadas. A suíte OpenSSH consiste nos seguintes tools:

- Operações remotas são feitas usando ssh, scp e sftp;

- Gerenciamento de chaves com ssh-add, ssh-keysign, ssh-keyscan e ssh-keygen;

- O server-side consiste em sshd, sftp-server e ssh-agent.

OpenSSH (https://www.openssh.com)

ssh — Cliente SSH OpenSSH (programa de login remoto)

Para aqueles que estão habituados a utilizar a linha de comando em sistemas operacionais Linux e MacOS, o comando ssh é uma ferramenta fundamental e cotidiana para acessar servidores remotos, como os disponíveis na AWS (Amazon Web Services) ou em outros provedores de nuvem. Sua simplicidade e eficácia tornam-no a escolha preferida para administradores de sistemas e desenvolvedores.

O ssh (cliente SSH) é um programa para fazer login em uma máquina remota e para executar comandos em uma máquina remota. Ele é destinado a substituir o rlogin e o rsh, e fornecer comunicações criptografadas seguras entre dois hosts não confiáveis em uma rede insegura. Conexões X11 e portas TCP arbitrárias também podem ser encaminhadas pelo canal seguro. O ssh conecta e faz login no nome do host especificado (com nome de usuário opcional). O usuário deve provar sua identidade à máquina remota usando um dos vários métodos, dependendo da versão do protocolo utilizada.

man page ssh(1)

Exemplo de comando ssh:

ssh -i ~/.ssh/chave_privada.pem usuario@servidor 

No diretório ~/.ssh, onde estão armazenadas as chaves de autenticação e configurações do OpenSSH, as permissões dos arquivos desempenham um papel crítico na segurança do sistema. O OpenSSH requer que os arquivos nesse diretório tenham permissões restritas para garantir que apenas o usuário proprietário tenha acesso a eles e caso mal-configurados, a execução do programa irá falhar.

As permissões devem ser configuradas para que:

  • O diretório ~/.ssh tenha permissões 700, o que significa que apenas o proprietário pode ler, escrever e acessar o diretório;
  • As chaves privadas, como id_rsa, devem ter permissões 600, assim como os arquivos de configuração, em que somente o proprietário pode ler e escrever sobre estes arquivos;
  • Enquanto as chaves públicas, como id_rsa.pub, podem ter permissões mais relaxadas, como 644, podendo outros usuários lerem suas chaves públicas.

Essas medidas ajudam a proteger as chaves de acesso remoto contra acesso não autorizado, garantindo a segurança das conexões SSH.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/known_hosts
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

Mais adiante iremos explorar com calma os arquivos authorized_keys, config e known_hosts.

Observe que no comando estamos informando o endereço de uma chave privada para ser utilizada na conexão, isso através da flag de linha de comando -i:

Seleciona um arquivo do qual a identidade (chave privada) para autenticação de chave pública é lida. Você também pode especificar um arquivo de chave pública para usar a chave privada correspondente que está carregada no ssh-agent(1) quando o arquivo de chave privada não está presente localmente. O padrão é ~/.ssh/id_rsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk e ~/.ssh/id_dsa. Arquivos de identidade também podem ser especificados em uma base por host no arquivo de configuração. É possível ter várias opções -i (e várias identidades especificadas em arquivos de configuração). Se nenhum certificado tiver sido especificado explicitamente pela diretiva CertificateFile, o ssh também tentará carregar informações do certificado do nome de arquivo obtido ao anexar -cert.pub aos nomes de arquivo de identidade.

man page ssh(1)

Gostaria, também, de destacar outra funcionalidade do ssh que foi adicionada em 2017 (versão 7.5) que é a possibilidade túnel/ponte SSH por este comando, isso através da flag -J (ProxyJump). Mas mostraremos a sua configuração pelo arquivo config.

Arquivos authorized_keys, config e known_hosts

Os arquivos de configuração do OpenSSH desempenham um papel fundamental na personalização e na configuração dos aspectos de segurança e conectividade dessa poderosa ferramenta de rede.

  • authorized_keys: essencial para a autenticação baseada em chave pública, permitindo que os usuários autentiquem-se em servidores remotos sem a necessidade de inserir uma senha;
  • config: oferece uma maneira conveniente de centralizar todas as configurações personalizadas do cliente SSH em um único local, permitindo ao usuário definir opções específicas para diferentes hosts, usuários ou grupos de hosts. Isso possibilita uma gestão mais eficiente das conexões SSH, eliminando a necessidade de inserir manualmente opções de linha de comando repetidamente. Além disso, ao utilizar o arquivo config, os usuários podem definir aliases para hosts remotos, configurar opções de encaminhamento de portas, especificar chaves de autenticação, entre outras configurações, facilitando o processo de conexão e garantindo a consistência nas configurações em múltiplos ambientes de rede;
  • known_hosts: é utilizado para armazenar as chaves públicas de hosts remotos aos quais o usuário já se conectou, garantindo que futuras conexões possam ser verificadas e autenticadas, protegendo contra possíveis ataques de “man-in-the-middle”.

Esses arquivos desempenham um papel crucial na segurança e na eficiência das operações realizadas com o OpenSSH, oferecendo controle granular sobre as conexões e a autenticação em ambientes de rede.

# Definindo opções globais para todos os hosts
Host *
User ec2-user # Nome do usuário a ser utilizado para conexão
Compression yes # Pede pela compressão de todos os dados
ServerAliveInterval 240 # Tempo em segundos do pacote para manter conexão viva
ServerAliveCountMax 2 # Limite de tentativas permitindo o servidor sem resposta

# Configurações específicas para um host
Host exemplo
User meu_usuario
HostName 254.243.210.92
IdentityFile ~/.ssh/chave_privada # Chave de autenticação a ser utilizada

# Configurações específicas para outro host
Host outro_host
User outro_usuario
HostName 18.108.211.173
Port 2222 # Porta personalizada

# Configurações específicas para acesso ao host de túnel SSH
Host servidor-tunel
HostName 32.206.57.145
Port 2929

# Configurações específicas para acesso ao host em rede privada usando o túnel SSH
Host servidor-privado
HostName 10.0.0.99
ProxyJump servidor-tunel

# Qualquer outro host com IP privado
Host 10.0.*
ProxyJump aws-tunnel

Este é um exemplo básico e comentado de um arquivo de configuração do OpenSSH. Ele define opções globais que se aplicam a todos os hosts, ativar compressão, usuário padrão de máquinas Amazon Linux e otimização para instabilidade de conexão. Em seguida, há configurações específicas para hosts individuais, incluindo o nome de usuário, chave de autenticação, porta personalizada e outras opções. Assim como o previamente citado ProxyJump para túnel/ponte SSH. Essas configurações podem ser personalizadas conforme necessário para atender às exigências específicas de conectividade e segurança.

scp — cópia de arquivos segura OpenSSH

O scp copia arquivos entre hosts através da rede de forma segura através do protocolo SSH. Com sua sintaxe simples e versátil, o scp permite que os usuários copiem arquivos e diretórios de forma eficiente entre sistemas locais e remotos, simplificando significativamente tarefas de gerenciamento e compartilhamento de dados em ambientes distribuídos.

Também através do arquivo config apresentado anteriormente é possível simplificar e facilitar muito o dia a dia também para o este comando. Ao invés de termos um comando:

scp -i ~/.ssh/chave_privada.pem /caminho/do/arquivo/local/arquivo.txt usuario@servidor.com:/diretorio/destino/

Podemos ter:

scp /caminho/do/arquivo/local/arquivo.txt servidor:/diretorio/destino/

Implementações do Agente SSH (ssh-agent)

Existem diversas implementações do ssh-agent, cada uma oferecendo diferentes funcionalidades e integrações para atender às necessidades dos usuários. Uma dessas implementações é o gnome-keyring, que é um gerenciador de chaves para o ambiente desktop GNOME. O gnome-keyring integra-se ao ssh-agent para armazenar e gerenciar chaves SSH, proporcionando uma experiência integrada aos usuários do GNOME. Ao usar o gnome-keyring, os usuários podem armazenar suas chaves SSH de forma segura e desbloqueá-las automaticamente quando necessário, simplificando o processo de autenticação em conexões SSH.

Outra implementação popular é o 1Password, um gerenciador de senhas que oferece suporte à integração com o ssh-agent. Com o 1Password, os usuários podem armazenar suas chaves SSH de forma segura junto com suas senhas, garantindo que todas as informações sensíveis estejam protegidas em um único local.

Enquanto o ambiente desktop GNOME irá automaticamente definir a variável de ambiente SSH_AUTH_SOCK por já ter a integração com o sistema operacional, por padrão outras implementações podem seguir uma abordagem mais simples de definir a propriedade IdentityAgent no arquivo config que vimos anteriormente.

Além dessas implementações específicas, o ssh-agent padrão do OpenSSH também é amplamente utilizado e pode ser configurado para atender às necessidades dos usuários. O ssh-agent do OpenSSH permite que os usuários carreguem suas chaves SSH na memória e as usem para autenticar conexões SSH sem a necessidade de inserir suas senhas repetidamente. Essa implementação é comumente usada em ambientes Unix-like e oferece uma maneira simples e eficaz de gerenciar chaves SSH para conexões seguras.

Conclusão

Em suma, o OpenSSH é uma ferramenta poderosa para os desenvolvedores em seu dia a dia, oferecendo uma gama de recursos que simplificam e fortalecem suas práticas de trabalho. Desde a segurança proporcionada pela autenticação baseada em chave até a facilidade de acesso remoto e transferência de arquivos através do SSH, o OpenSSH se destaca como um aliado confiável em ambientes de desenvolvimento. Além disso, ao configurar túneis SSH em redes privadas, os desenvolvedores podem estender ainda mais o poder do OpenSSH, garantindo conexões seguras entre diferentes sistemas e serviços, mesmo em ambientes altamente restritos. Essa capacidade de estabelecer conexões seguras e confiáveis, aliada à sua facilidade de uso e ampla adoção na comunidade de desenvolvimento, torna o OpenSSH uma ferramenta essencial para os desenvolvedores, proporcionando eficiência, segurança e tranquilidade em seu trabalho diário.

--

--