Introdução ao SSH - Linux
Quando se trabalha com múltiplos computadores Linux conectados em uma única rede, frequentemente surge a necessidade de estabelecer uma conexão segura com outro computador. Para este propósito, no Linux, utiliza-se uma ferramenta chamada Secure Shell, ou SSH. O Secure Shell é composto por três componentes principais: ssh
scp
sftp
ssh
scp
sftp
A conexão via SSH envolve dois elementos essenciais: o cliente e o servidor ou host. O cliente se conecta ao host e pode interagir com ele através do ssh
ssh
programicio@Programicio:~$ ssh usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command [argument ...]]
O servidor, por outro lado, pode precisar de instalação dependendo do sistema operacional. Em distribuições como Fedora/Red Hat e SUSE, a funcionalidade de servidor pode estar presente por padrão. No Ubuntu, é necessário instalar o pacote openssh-server
sudo apt-get install openssh-server
Se o SSH não estiver instalado por padrão no Fedora/Red Hat, pode-se instalar com o seguinte comando:
sudo yum install openssh-server
Após a instalação, podemos verificar o status do serviço SSH com o comando systemctl
programicio@Programicio:~$ systemctl status ssh ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; disabled; preset: enabled) Drop-In: /etc/systemd/system/ssh.service.d └─00-socket.conf Active: active (running) since Mon 2024-03-18 18:26:39 MSK; 15min ago TriggeredBy: ● ssh.socket Docs: man:sshd(8) man:sshd_config(5) Process: 9626 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) Main PID: 9627 (sshd) Tasks: 1 (limit: 76766) Memory: 1.5M CPU: 98ms
Neste caso, vemos que o serviço está ativo, ou seja, o host está pronto para aceitar conexões via SSH. Se o serviço SSH estiver instalado mas não estiver em execução, ele pode ser iniciado com o seguinte comando:
sudo systemctl start ssh
Assim, quando um servidor SSH está em funcionamento em um computador Linux, podemos conectar-nos a ele de outro computador que desempenhará o papel de cliente. Para isso, no computador cliente, inserimos o comando ssh
ssh 192.168.0.116
O endereço IP do computador host pode ser obtido no mesmo com o comando ip
programicio@Programicio:~$ ssh 192.168.0.116 The authenticity of host '192.168.0.116 (192.168.0.116)' can't be established. ED25519 key fingerprint is SHA256:jQ5S32RBItZifsdRR+NlvofV+Xeo0nWdKRZcRIXRx6Y. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.0.116' (ED25519) to the list of known hosts. programicio@192.168.0.116's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.14.0-1050-oem x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro
Se o cliente estiver seguro de que deseja se conectar ao servidor, deve responder "yes" ao prompt. Neste caso, o servidor é adicionado ao arquivo .ssh/known_hosts
Após uma conexão bem-sucedida entre cliente e servidor, um canal seguro é estabelecido. Esse canal é criado usando uma chave de sessão, que é uma chave de criptografia compartilhada entre cliente e servidor e que criptografa todos os dados transmitidos entre os dois computadores. Cliente e servidor negociam essa chave com base em suas chaves públicas. Eles também concordam sobre o protocolo de criptografia a ser usado. Uma vez estabelecido o canal seguro, as credenciais do usuário são solicitadas e o cliente deve inserir sua senha.
O comando ssh não solicita um nome de usuário porque assume que o cliente deseja se conectar a outro host com o mesmo login, isto é, o login no cliente e no host são os mesmos. Por exemplo, no caso citado anteriormente, o usuário no cliente com login 'programicio' se conectou a um host em outro computador onde a conta também tem o login 'programicio'. No entanto, também é possível especificar explicitamente um login diferente. A primeira maneira é indicar o nome do usuário seguido por '@' ao estabelecer a conexão com o host remoto:
ssh superuser1@192.168.0.116
A segunda maneira é usar o parâmetro -l
ssh -l superuser1 192.168.0.116
Em ambos os casos, ocorre a conexão com a conta de usuário 'superuser1'.
Após estabelecer a conexão, é possível ver as informações do sistema do host. No meu caso, é o Ubuntu 22.04:
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.14.0-1050-oem x86_64)
Uma breve descrição básica também é exibida. No final, você pode notar que o nome completo do usuário atual muda. Por exemplo, no meu caso, o nome 'programicio@Programicio' mudou para 'programicio@programicio-linux' (nome no host):
programicio@Programicio:~$ ssh 192.168.0.116 The authenticity of host '192.168.0.116 (192.168.0.116)' can't be established. ED25519 key fingerprint is SHA256:jQ5S32RBItZifsdRR+NlvofV+Xeo0nWdKRZcRIXRx6Y. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.0.116' (ED25519) to the list of known hosts. programicio@192.168.0.116's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.14.0-1050-oem x86_64) ...
Agora estou na máquina do host 'programicio@programicio-linux' e posso inserir comandos padrão para gerenciar o host. Por exemplo, para ver o conteúdo do diretório atual no host usando o comando ls -l
programicio@programicio-linux:~$ ls -l total 48 drwxrwxr-x 3 programicio programicio 4096 Feb 18 16:47 Android drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Desktop drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Documents drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Downloads drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Music drwxrwxr-x 3 programicio programicio 4096 Dec 6 2022 Pictures drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Public drwx------ 8 programicio programicio 4096 Feb 19 22:49 snap drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Templates drwxr-xr-x 2 programicio programicio 4096 Mar 20 13:33 Videos
Outros comandos padrão podem ser executados de forma semelhante. Ao concluir o trabalho, para desconectar do host, basta executar o comando exit
programicio@programicio-linux:~$ exit logout Connection to 192.168.0.116 closed.
Assim, a console exibe a mensagem de fechamento da conexão e retorna ao computador cliente (no meu caso, de 'programicio@programicio-linux' para 'programicio@Programicio').
Se não precisarmos mais dos dados de conexões aos hosts no arquivo .ssh/known_hosts
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak && echo > ~/.ssh/known_hosts
Configurações do SSH
No SSH, um computador pode atuar simultaneamente como cliente e servidor. No entanto, cada um possui seu próprio arquivo de configuração. Cada arquivo de configuração contém várias definições, a maioria das quais pode assumir um dos dois valores: "yes" (configuração ativada) ou "no" (configuração desativada).
Configuração do Cliente
A configuração do cliente está localizada no arquivo /etc/ssh/ssh_config
.ssh_config
.ssh
ssh
As configurações mais utilizadas de /etc/ssh/ssh_config
: Aplica-se ao host ao qual o usuário se conecta, limitando as declarações subsequentes a esse host específico. Pode-se usar caracteres curinga, comoHost
e*
, para se referir a mais de um nome de host. Por exemplo, a configuração padrão em?
pode incluir:/etc/ssh/ssh_config
Host *
Indicando que as configurações subsequentes se aplicam a todos os hosts.
: Se definido como "yes", o SSH verifica o endereço IP do host no arquivo known_hosts, geralmente usado para proteção contra falsificação de DNS ou IP.CheckHostIP
: Especifica a ordem dos diferentes algoritmos de criptografia a serem usados em uma sessão SSHv2.Ciphers
: Define se a compressão deve ser usada na sessão SSH, com valores "yes" ou "no".Compression
: Determina se as conexões X11 serão encaminhadas. Se "yes", as interfaces gráficas de um sessão SSH podem ser transmitidas através de um túnel seguro.ForwardX11
: Indica se a autenticação por senha deve ser usada (valor padrão é "yes"). Em ambientes seguros onde a autenticação por chave é usada, este valor pode ser definido como "no" para desativar completamente a autenticação por senha.PasswordAuthentication
Configuração do Servidor
A configuração do servidor está no arquivo /etc/ssh/sshd_config
: Indica se a retransmissão de portas TCP pelos clientes é permitida.AllowTcpForwarding
: O porto que o processo SSH escuta, geralmente o porto 22.Port
: Define se o login como root é permitido.PermitRootLogin
: Define se o login com senha vazia é permitido, geralmente desativado por padrão.PermitEmptyPasswords
: Define se o encaminhamento X11 é permitido.X11Forwarding
Funcionalidade X11Forwarding
Ao trabalhar com SSH, a funcionalidade X11Forwarding permite gerenciar aplicações no host. Por exemplo, podemos iniciar uma aplicação gráfica no cliente que opera no host. Para que o X11Forwarding funcione, são necessárias duas condições:
No computador host, a configuração
no arquivoX11Forwarding
deve estar definida como "yes"./etc/ssh/sshd_config
Ao conectar ao computador host, deve-se usar a opção
, ou seja, conectar com o comando:-X
ssh -X 192.168.0.116
Após conectar-se ao host com esse comando, é possível executar várias aplicações, incluindo gráficas, que operam diretamente no host. Por exemplo:
programicio@Programicio:~$ ssh -X 192.168.0.116 programicio@192.168.0.116's password: Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.14.0-1050-oem x86_64) Last login: Wed Mar 20 13:36:49 2024 from 192.168.0.108 programicio@programicio-linux:~$ code
Neste caso, estou conectando ao host "192.168.0.116". Após a conexão, com o comando code
Da mesma forma, outras aplicações podem ser iniciadas, como:
Este comando inicia o explorador de arquivos Nautilus no Ubuntu, e a janela do explorador exibe o conteúdo da pasta atual no host remoto.