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 e sftp. O ssh é usado para estabelecer uma sessão remota segura. O scp é empregado para copiar arquivos de e para um computador onde o processo SSH está em execução. Já o sftp oferece uma interface segura para clientes FTP.

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. A funcionalidade do cliente geralmente está presente por padrão nas distribuições Linux. Para verificar isso, podemos usar o comando 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 com o endereço do servidor. Por exemplo, no meu caso, o endereço do host é 192.168.0.116:

ssh 192.168.0.116

O endereço IP do computador host pode ser obtido no mesmo com o comando ip. No primeiro contato, cliente e servidor trocam chaves públicas e privadas. Durante a conexão, o servidor cria uma chave com base em sua chave privada (a chamada chave do host) e a utiliza para verificar conexões. Ao se conectar, o servidor envia sua chave pública para o cliente. Se for a primeira vez que o cliente se conecta a esse host, ele receberá uma mensagem como a seguinte:

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 no diretório home do usuário no cliente. Nas conexões subsequentes com o servidor, esse arquivo é verificado para confirmar se o servidor já é conhecido. A verificação baseia-se na impressão digital da chave pública do servidor, que é uma soma de controle única associada à chave pública do servidor. A conexão só é estabelecida se essa verificação corresponder ao nome e à chave pública do servidor ao qual o cliente está se conectando. Se esses dois conjuntos de dados não coincidirem, a conexão será negada.

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, seguido pelo nome da conta de usuário para se conectar a outro host:

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, podemos removê-los. Por exemplo, para limpar o arquivo enquanto fazemos um backup prévio, utilizamos o seguinte comando:

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. Vale destacar que este é um arquivo geral, aplicável a todos os usuários do sistema que se conectam via SSH a um host remoto. No entanto, um usuário específico pode redefinir essas configurações para si criando um arquivo .ssh_config no subdiretório .ssh de seu diretório home. Outra forma de redefinir as configurações é especificá-las diretamente no console ao invocar o comando ssh.

As configurações mais utilizadas de /etc/ssh/ssh_config incluem:

  • Host: 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, como * e ?, para se referir a mais de um nome de host. Por exemplo, a configuração padrão em /etc/ssh/ssh_config pode incluir:

    Host *

    Indicando que as configurações subsequentes se aplicam a todos os hosts.

  • CheckHostIP: 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.

  • Ciphers: Especifica a ordem dos diferentes algoritmos de criptografia a serem usados em uma sessão SSHv2.

  • Compression: Define se a compressão deve ser usada na sessão SSH, com valores "yes" ou "no".

  • ForwardX11: 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.

  • PasswordAuthentication: 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.

Configuração do Servidor

A configuração do servidor está no arquivo /etc/ssh/sshd_config, onde podemos alterar as configurações necessárias. Algumas configurações do servidor são semelhantes às do cliente, mas existem configurações específicas para o servidor, como:

  • AllowTcpForwarding: Indica se a retransmissão de portas TCP pelos clientes é permitida.

  • Port: O porto que o processo SSH escuta, geralmente o porto 22.

  • PermitRootLogin: Define se o login como root é permitido.

  • PermitEmptyPasswords: Define se o login com senha vazia é permitido, geralmente desativado por padrão.

  • X11Forwarding: Define se o encaminhamento X11 é permitido.

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 X11Forwarding no arquivo /etc/ssh/sshd_config deve estar definida como "yes".

  • Ao conectar ao computador host, deve-se usar a opção -X, ou seja, conectar com o comando:

    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, estou iniciando o Visual Studio Code, se estiver instalado no host.

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.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com