Acesso SSH

O acesso remoto no DINF se dá através de uma conexão SSH. SSH é acrônimo de Secure Shell, e é um protocolo de rede que roda na porta 22 via TCP. Ele permite que um terminal possa ser criado em um outro computador com criptografia de ponta-a-ponta. Essa criptografia permite que pacotes interceptados contendo os seus comandos não possam ser lidos.

O servidor de SSH do DINF canonicamente fica no endereço ssh.inf.ufpr.br. Ele aceita ao menos dois modos de conexão:

  • Acesso por senha

    Aqui é utilizada a senha do DINF, que é a mesma senha do acesso do seu email via Webmail.

  • Acesso via chave privada

    Feita utilizando um par de chaves assimétricas.

O jeito de se conectar depende do seu cliente de SSH.

  • No Linux, existe o programa ssh.

  • No Windows é recomendado configurar o Windows Subsystem for Linux e usar o programa ssh (uma alternativa é o PuTTY).

Acesso remoto via ssh

Usando o programa do Linux ssh é possível iniciar uma conexão SSH dando os seguintes argumentos:

$ ssh usr99@ssh.inf.ufpr.br

Onde o seu usuário deverá substituir o usr99. O seu nome de usuário é o mesmo encontrado antes do @ no seu email do DINF.

Na autenticação via senha, a sua senha será requisitada. Na autenticação via chave privada, sua frase-senha será requisitada.

Se você estiver atrás de um firewall que bloqueia a porta padrão 22 que é padrão do SSH, o servidor SSH do departamento também suporta a conexão via porta 80:

$ ssh -p 80 usr99@ssh.inf.ufpr.br

Cópia de arquivos via scp

Usando o programa do Linux scp, é possível fazer uma cópia de arquivos utilizando uma conexão SSH:

$ scp usr99@ssh.inf.ufpr.br:~/relatório.pdf .
$ scp relatório.pdf usr99@ssh.inf.ufpr.br:~/relatório-novo.pdf

O primeiro argumento seleciona a origem, e o segundo o destino. No primeiro comando por exemplo, copiamos o arquivo relatório.pdf do diretório home remoto para o diretório atual local. No segundo, copiamos o arquivo local relatório.pdf para um arquivo chamado relatório-novo.pdf no diretório home remoto.

Para identificar um recurso remoto, é utilizado a sintaxe [usuário]@[máquina]:[caminho], enquanto que recursos locais são identificados apenas utilizando [caminho].

Utilizando acesso via chave privada

O acesso via chave privada é mais simples e permite que você não precise ficar digitando toda hora a senha para fazer uma conexão SSH.

Ele se baseia em um esquema de chave assimétrica. Isso significa que o acesso é feito usando um par de chaves. Uma é chamada de chave pública (geralmente um arquivo chamado id_ed25519.pub), e outra de chave privada (geralmente um arquivo chamado id_ed25519).

Com uma certa chave privada, é possível acessar qualquer servidor que reconheça a chave pública vinculada. Para fazer com que o servidor SSH reconheça uma certa chave pública, é necessário que seja incluída mais uma linha no arquivo ~/.ssh/authorized_keys, contendo a sua chave pública.

O comando ssh e derivados, procuram a sua chave privada para acesso no diretório ~/.ssh/id_ed25519. Geralmente, o arquivo da chave privada é protegido com uma senha, chamada de frase-senha, que o ssh também irá perguntar na hora de se conectar utilizando aquela chave privada.

Vamos então aos passos de como se obter um par de chaves assimétricas para acesso SSH.

  1. O primeiro passo é gerar um par de chaves assimétricas. Nós vamos utilizar o padrão ED25519:

    $ ssh-keygen -t ed25519 -C 'usr99@inf.ufpr.br'
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/home/usr99/.ssh/id_ed25519):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in id_ed25519
    Your public key has been saved in id_ed25519.pub
    The key fingerprint is:
    SHA256:YPO1upNw6v8nksw8Z+6zgducWQUyiEBQ7pJ+5njvEZA usr99@inf.ufpr.br
    The key's randomart image is:
    +--[ED25519 256]--+
    |  .++            |
    |   . o . .       |
    |    E = . + .    |
    |   o o + . + .   |
    |  o . . S .   .  |
    | . .  ...o   .   |
    |  . o .Boo. .    |
    |   =. ..X===.    |
    |  ...++.+XX=     |
    +----[SHA256]-----+
    

    Esse programa irá perguntar uma frase-senha que é uma senha para proteger a sua chave privada (que preferencialmente deve ser longa, por isso o nome).

    Serão gerados os dois arquivos com as chaves assimétricas no diretório ~/.ssh: id_ed25519 e id_ed25519.pub.

  2. Copie utilizando scp o arquivo ~/.ssh/id_ed25519.pub para o arquivo ~/.ssh/authorized_keys. O arquivo ~/.ssh/authorized_keys pode aceitar mais de uma chave pública, uma por linha, mas como queremos por enquanto apenas utilizarmos uma, sobrescrever o arquivo será suficiente.

Depois disso, o acesso utilizando o comando ssh consultará o diretório ~/.ssh por chaves e preferencialmente irá tentar utilizar uma das suas chaves para iniciar uma conexão. Será pedido a frase-senha em cada nova sessão de SSH.

Lembre de mim: Como não precisar ficar digitando a frase-senha

Muitas distribuições Linux vem com um agente gestor de chaves privadas chamado ssh-agent. Ele permite que programas possam utilizar as chaves privadas sem ter acesso direto a elas, e sem necessidade de pedir a frase-senha para você.

Para adicionar uma chave-pública ao ssh-agent basta dar o seguinte comando:

$ ssh-add ~/.ssh/id_ed25519

Onde o argumento é o arquivo de chave privada. Sem esse argumento, por padrão, o ssh-add pega o arquivo ~/.ssh/id_ed25519, então na maioria das vezes, só ssh-add é suficiente.

O ssh-add requisitará a frase-senha da chave privada, e guardará a chave privada de forma desencriptada na memória até o fim da sua sessão no Linux.

Feito isso, não será mais requisitado a sua frase-senha para conexões SSH.

Uma das coisas que agora vai funcionar será o autocomplete do bash nos comandos de scp ou de sshfs.

Além disso, é possível encaminhar a conexão ao agente em uma conexão SSH. Ao passar o argumento -A ao comando ssh, a conexão ao agente é “encaminhada”, e será possível por exemplo acessar outros computadores do DINF sem precisar redigitar a senha.

sshfs: Sistema de arquivos remoto “virtual”

Nas distribuições de Linux, é possível encontrar um programa chamado sshfs nos repositórios de programas. Ele é capaz de criar um diretório “virtual” no seu sistema de arquivos que permite que você manipule o sistema de arquivos remoto como se você estivesse mexendo no seu próprio sistema de arquivos. É uma espécie de diretório sincronizado.

Para fazer tal feito, ele utiliza do FUSE que é acrônimo para Filesystem in Userspace, ou sistema de arquivos em espaço de usuário. Isso permite, por exemplo, que não seja necessário que o programa sshfs seja executado com privilégios de root, sendo só necessário que o sistema operacional suporte essa extensão.

Vamos aos passos para utilizá-lo:

  1. Primeiro, é necessário criar um diretório vazio no seu sistema de arquivos onde será criado o diretório virtual do sshfs. Utilizaremos no exemplo, um diretório chamado ~/dinf.

  2. Em seguida, inicie o sistema de arquivos remoto usando o seguinte comando:

    $ sshfs usr99@ssh.inf.ufpr.br: ~/dinf
    

    Isso irá inicializar o diretório remoto padrão (o home) no diretório local ~/dinf. Você pode utilizar outro diretório, seguindo a mesma sintaxe do scp: [usuário]@[máquina]:[caminho].

  3. Para certificar que todas as alterações foram feitas e para desmontar o diretório, utilize o seguinte comando:

    $ fusermount -u ~/dinf
    

Esboço para o seu arquivo ~/.ssh/config (Linux ou WSL)

Uma configuração útil para poupar o tempo de digitar uma linha inteira como:

$ ssh usr99@ssh.inf.ufpr.br

toda hora é criar um arquivo ~/.ssh/config e colocar nele:

Compression yes

Host dinf
  HostName ssh.inf.ufpr.br
  User usr99
  ForwardAgent yes

Host dinf+orval
  HostName orval
  User usr99
  ForwardAgent yes
  ProxyJump dinf

Daí por exemplo você por exemplo pode acessar o DINF digitando simplesmente:

$ ssh dinf

, ou acessar a orval (uma máquina está dentro do DINF que deve ser usada para processamentos mais pesados) usando:

$ ssh dinf+orval

diretamente.

  • ForwardAgent permite que a sua chave SSH do ssh-agent que foi desbloqueada pelo ssh-add seja encaminhada, para que evitar que seja necessário digitar a senha de novo ao acessar outros computadores através da máquina de SSH.

  • ProxyJump é pra instruir que a conexão até a orval é feita “intermediada” pela máquina de SSH do DINF.

  • Compression ativa a compressão para todas as conexões, o que acelera bastante as coisas, mas principalmente as conexões com X11 Forwarding.