open core »

Usar VNC de modo mais seguro

VNC (Virtual Network Computing) é um protocolo criado para se poder aceder remotamente a um computador e utilizar a sua interface gráfica como se estivéssemos a utilizar esse mesmo computador.

Existem inúmeras razões para não usarem VNC principalmente se for extendido a acesso exterior. Mas se mesmo assim os motivos pelo qual precisam são mais fortes aqui fica a dica.

O VNC não utiliza comunicações cifradas pelo que todas as teclas premidas e outras informações são enviadas pela rede em texto legível. Algo que não é de todo do nosso interesse se estivermos numa rede onde não haja confiança. O truque para colmatar esta falha do protocolo é criar um túnel SSH desde o porto do VNC no computador remoto até um porto no computador local, indicando depois ao cliente VNC para se ligar ao localhost nesse porto e não ao host remoto.

Para criar esse túnel apenas precisamos de estabelecer uma ligação SSH no terminal do seguinte modo:

ssh -L 5901:localhost:5900 username@x.x.x.x -N

O parâmetro -L faz o túnel, no primeiro extremo coloca-se a porta computador local onde a ligação começa, pode ser qualquer uma porta acima de 1024, a seguir leva o endereço local (localhost) e depois o segundo extremo será o porto do serviço VNC na máquina remota. Os parâmetros seguintes são os normais para ligação SSH, o username e endereço ou nome do servidor. O último parâmetro -N serve para o SSH não abrir nenhum porto no computador remoto (dado que não vamos usar nenhuma shell). Se quiserem também que o SSH execute em background para não ocupar o terminal podem acrescentar o parâmetro -f. Se utilizam um porto diferente para o serviço SSH na máquina remota (o que eu acho obrigatório, como já falei num post anterior) terão de indicar isso com o parâmetro -p.

Agora basta usarem o vosso cliente VNC favorito e ligarem-se não à máquina remota, mas sim ao localhost no porto que definiram, em linux seria:

vncviewer localhost::5901

Num outro cliente gráfico teriam de colocar o endereço localhost ou 127.0.0.1 e no display: 1. Não é zero porque o nosso túnel agora mapeia o display 0 da máquina remota para o display 1 na nossa máquina local.