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.
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.
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.
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:
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.
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].
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 dossh-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.