28 de maio de 2013

Ligação VNC segura

Olá, hoje o tema é VNC.

Antes de mais quero agradecer ao nosso colega Samuel Almeida por ter montado este post (texto e imagens) para o ArdePi. O crédito é todo dele e apreciamos muito a sua contribuição para o blog.

O que é o VNC?
Virtual Network Computing é um protocolo para acesso remoto com ambiente gráfico, por outras palavras, possibilita a utilização do ambiente de trabalho do RPi remotamente, assim como o SSH permite o acesso remoto ao terminal do RPi.



Nota: Como o protocolo VNC é aberto, ou seja, os dados transmitidos não são encriptados (com excepção da autenticação) este pequeno tutorial irá unicamente abordar a transmissão deste protocolo por um túnel SSH, contornando assim esta vulnerabilidade.

Como configurar um acesso VNC no RPI?

2 - Instalar o servidor de VNC, neste caso optou-se pelo TightVNC
No terminal introduzir o seguinte código

sudo apt-get update
sudo apt-get install tightvncserver

3 - Criar uma password

            tightvncserver



4 - Criar um script para começar o serviço no arranque do sistema (opcional)

            sudo nano /etc/init.d/tightvncserver

Copiar o seguinte script

#!/bin/sh
### BEGIN INIT INFO
# Provides:          tightvncserver
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop tightvncserver
### END INIT INFO


### Customizethisentry
# Set the USER variable to thenameoftheuser to starttightvncserverunder
export USER='pi'
### Endcustomizationrequired

eval cd ~$USER

case "$1" in
start)
su $USER -c '/usr/bin/tightvncserver -geometry 1366x768 -localhost :1'
echo "StartingTightVNC server for $USER "
;;
stop)
pkillXtightvnc
echo "Tightvncserverstopped"
;;
  *)
echo "Usage: /etc/init.d/tightvncserver {start|stop}"
exit 1
;;
esac
exit 0

Ter em atenção nas linhas:

                export USER='pi'
    Se o teu username não for o definido por defeito alterar esta linha

                su $USER -c '/usr/bin/tightvncserver -geometry 1366x768 -localhost :1'
    1366x768 é a resolução do ambiente gerado pelo VNC que pode ser alterada livremente;
    -localhost indica que o serviço será unicamente acessível localmente, neste caso pelo servidor SSH
    :1 é o número do ambiente gráfico. Este parâmetro pode ser alterado, mas mais à frente temos de ter esta mudança em conta.

Para mudar a propriedade do ficheiro para o root

sudo chown root:root /etc/init.d/tightvncserver

Para o ficheiro ficar executável

sudo chmod 755 /etc/init.d/tightvncserver

Para adicionar o script aos runlevelsdefaults

sudo update-rc.d tightvncserver defaults

Neste ponto convém reiniciar o RPi para confirmar que o script funciona

            sudo reboot

5 - Se não optaste pelo script para começar o serviço no arranque do sistema, o código para iniciar o serviço é

            vncserver -geometry 1366x768 -localhost :1

E o comando para terminar o serviço é

            vncserver -kill :1

Para aceder ao RPi via VNC por um túnel SSH

Em ambiente Windows:

1 - Configurar o túnel SSH. Com o Putty, a ligação é feita da mesma forma que em Aceder ao RPi por SSH com uma pequena mudança


    Em que 5901 = 5900 + 1, neste caso é o número do ambiente gráfico escolhido ou no script ou no comando para activar o serviço VNC.


2 - Abrir a ligação, clicando em “Open”

3 - Com o TightVNC ou outro cliente VNC ligar a 127.0.0.1:1 ou localhost:1


    Em que 127.0.0.1 ou localhost é o endereço no cliente onde o serviço VNC está acessível.
    É :1 é novamente o número do ambiente de gráfico.

Em linux:

1 - No terminal introduzir o seguinte comando

            ssh pi@xxx.xxx.x.xx -L 5902:localhost:5901

    Em que -L indica um túnel SSH, 5902 é o porto em que o serviço VNC estará disponível no cliente (pode ser um outro porto ou até mesmo 5901) e 5901 é o porto em que o RPi (servidor) está a difundir o serviço VNC(5901 = 5900 + 1, neste exemplo foi o número do ambiente gráfico escolhido ou no script ou no comando para activar o serviço VNC no RPi).

2 - Noutra janela/tab do terminal introduzir

                  vncviewer localhost:2

    Como no comando anterior escolheu-se o 5902 então neste comando temos que indicar ao vncviewer que o ambiente gráfico está num túnel SSH (localhost) no porto (5902-5900=2).

NOTA: O serviço VNC só estará disponível se a ligação SSH estiver aberta.

Até uma próxima,
Autor: Samuel Almeida,
Editor: Rúben Marques

Sem comentários: