Skip to content

Repository files navigation

Instituto Superior Técnico, Universidade de Lisboa

Segurança Informática em Redes e Sistemas

Guia de Laboratório - Virtual Private Network

Objectivo

O objectivo do guia consiste em aprender como funciona e como pode ser implementada uma VPN usando o software OpenVPN, que usa o protocolo TLS (Transport Layer Security) para proteger as comunicações. Neste guia iremos ainda revisitar as ferramentas nmap e iptables (firewall).


Exercício 1 - Restrição de acesso à rede

Obtenha o laboratório Kathará que servirá de base aos exercícios a desenvolver durante a aula. A topologia é a apresentada na figura abaixo. O lado esquerdo da rede (equipamentos ligados ao router 1) representa a rede de uma organização; o lado direito representa a Internet.

  1. Use o comando traceroute para verificar a que redes da organização consegue chegar a partir do PC1. A quais não é possível?

  2. Controlando o router 2 (mas não o router 1) é possível fazer com o que PC1 tenha acesso a todas as redes. Faça essa alteração.

  3. Usando o comando iptables coloque regras de firewall no router 1 que impeçam o acesso de e à rede 192.168.0.0/24 a partir da Internet (que tem mais endereços do que os mostrados no diagrama).

  4. No PC1, use o comando nmap para detetar as máquinas presentes na rede 200.200.200.128/25. Quantas máquinas foram encontradas e quais os serviços? (NB: o nmap vai percorrer cerca de 128 endereços, logo demora algum tempo)

nmap 200.200.200.128/25
  1. Crie regras de firewall (iptables) no router 1 que impeçam o acesso aos protocolos HTTP (80) e SSH (22) a partir da Internet, mas que permitam o acesso de dentro para fora (apenas para a rede 200.200.200.128/25 pois a 192.168.0.0/24 já se encontra bloqueada de e para a Internet).

  2. Repita o comando nmap a partir do PC1 e do servidor 3 e verifique as diferenças. Porque é que continuamos a conseguir aceder por ssh ao router 1 usando o IP 200.200.200.254?


Exercício 2 - Criação de uma VPN

Uma Virtual Private Network (VPN), ou rede privada virtual, permite o acesso a partir do exterior a uma rede interna de uma organização. Adicionalmente permite proteger criptograficamente o tráfego que circula nas redes públicas.

Neste exercício vamos configurar o PC1 para aceder à rede interna (redes ligadas ao router 1), apesar do router 1 não permitir acessos do exterior. Portanto, o PC1 vai usar uma VPN para fazer esse acesso. Em concreto, vamos ter um cliente e um servidor OpenVPN:

  • Servidor OpenVPN: o servidor designado simplesmente VPN (lado esquerdo, em baixo) vai ser o servidor OpenVPN, ou seja, o computador ao qual os computadores que queiram usar a VPN se terão de ligar.
  • Cliente OpenVPN: o PC1 vai ser o cliente OpenVPN.

image2

  1. O OpenVPN usa chaves assimétricas e certificados para autenticar os utilizadores, logo precisa de uma Public Key Infrastructure (PKI) para fazer a criação, distribuição e revogação de certificados. Para o efeito vamos usar uma PKI mínima, que inclui apenas uma Certification Authority (CA) muito simples. Aliás, a CA devia estar num ambiente com elevado grau de segurança, p.ex., num computador desligado da Internet, mas não vamos considerar esse aspecto.

O OpenVPN fornece um conjunto de scripts para gerar a CA e certificados: easy-rsa.

Na máquina VPN mude para a directoria /etc/openvpn/ e execute:

cp -r /usr/share/easy-rsa /etc/openvpn/
cp /etc/openvpn/easy-rsa/vars.example /etc/openvpn/easy-rsa/vars

Edite o ficheiro /etc/openvpn/easy-rsa/vars. Altere as últimas linhas para incluir o seguinte:

set_var KEY_COUNTRY "PORTUGAL"
set_var KEY_CITY "Lisbon"
set_var KEY_ORG "sirssec"
set_var KEY_EMAIL "admin@example.com"
set_var KEY_OU "OpenVPN"

Emita o seguinte comando na directoria easy-rsa para inicializar a PKI:

./easyrsa init-pki

Emita o seguinte comando para inicializar a CA, criando o seu par de chaves e um certificado com a sua chave pública:

./easyrsa build-ca nopass
  1. Temos agora as chaves da CA. Vamos gerar chaves e certificados para o servidor e para o cliente continuando a usar os scripts easy-rsa (não defina password).
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-req client nopass
./easyrsa sign-req client client
  1. Vamos gerar parâmetros Diffie-Hellman para o servidor usar quando clientes se tentarem ligar a ele:
./easyrsa gen-dh
  1. O OpenVPN fornece um conjunto de mechanismos de security hardening. Um desses mecanismos é chamado tls-auth e permite verificar a integridade das mensagens trocadas durante o handshake do TLS. Convém notar que o TLS verifica a integridade dessas mensagens, mas faz essa verificação depois do handshake, não durante o handshake. No standard, depois do handshake, o cliente e servidor enviam um ao outro um MAC das mensagens trocadas e verificam se estão de acordo com o que esperavam.
    O mecanismo tls-auth do OpenVPN usa um "truque" que não funciona no caso geral: ter à partida uma chave secreta (simétrica) partilhada entre cliente e servidor para verificar a integridade das mensagens trocadas durante o handshake do TLS através da colocação de um MAC em cada uma das mensagem. Este mecanismo serve para proteger de ataques de negação de serviço ou de tentativas de injecção de pacotes (p.ex. para tentar fazer buffer overflow).

Gere a chave secreta que será partilhada entre o servidor e o(s) cliente(s) executando:

openvpn --genkey --secret ta.key
cp ta.key /etc/openvpn
  1. No PC1 copie o ficheiro exemplo de configuração para a área de root:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~

Repare que tem de dar a esse ficheiro o mesmo nome que usou em cima no comando ./easyrsa gen-req, seguido da extensão .conf. Neste caso por acaso o nome é o mesmo - cliente - mas podia ser diferente.

  1. Copie os seguintes ficheiros que foram gerados no servidor VPN (que estão na pasta /etc/openvpn/easy-rsa/ e suas subpastas) para a área do root do PC1:
  • ca.crt - certificado da CA
  • client.crt - certificado do cliente
  • client.key - chaves do cliente
  • ta.key - a chave do mecanismo tls-auth

Sugestão: use o comando scp ou a pasta shared.

O ficheiro client.key contém a chave privada do cliente, logo tem de ser apagado do servidor. Esse ficheiro e o que contém a chave privada do servidor (server.key) têm de ser mantidos secretos. Escusado será dizer que seria muito errado copiar o ficheiro server.key para o cliente!

  1. No PC1, edite o ficheiro client.conf no cliente e defina o endereço do servidor VPN (campo remote) e os nomes dos ficheiros com as chaves

  2. No servidor de VPN, copie os ficheiros ca.crt, dh.pem, server.key, server.crt e ta.key para a pasta /etc/openvpn/.

  3. Analise o ficheiro server.conf que já está na mesma pasta. Altere o seguinte:

  • Mude dh1024.pem para dh.pem.
  • Descomente a linha tls-auth ta.key 0 (tire o ;).
  1. Repare que o mesmo ficheiro contém a linha:
server 200.200.200.0 255.255.255.128

Esta linha indica que a subrede da VPN é a 200.200.200.0/25, ou seja, que um computador externo (no nosso caso, o PC1) vai aparecer para a rede interna com um endereço IP dessa subrede. Muito provavelmente, na sua configuração a comunicação entre essa subrede e a subrede 200.200.200.128/25 (que é parecida mas diferente) está barrada na firewall do router1. Remova essa restrição, reconfigurando a firewall.

  1. Execute o servidor de VPN no servidor, em modo debug, a partir da pasta /etc/openvpn:
openvpn server.conf

Caso o openvpn falhe, poderá ser necessário correr o seguinte comando antes:

mkdir -p /dev/net
mknod /dev/net/tun c 10 200
chmod 600 /dev/net/tun

(No futuro, para lançar normalmente use o script /etc/init.d/openvpn)

  1. Descomente a seguinte linha ao ficheiro client.conf para activar a compressão das comunicações: comp-lzo.

  2. Execute o cliente no PC1, em modo debug:

openvpn client.conf
  1. Observe as mensagens no cliente e servidor. Verifique que já estão ligados.

  2. Verifique as rotas presentes no router 1 executando ip route. Repare que existe já uma rota para a rede 200.200.200.0/25 através do servidor de VPN. Esta é a rede com os IPs atribuídos aos clientes de VPN.

  3. Coloque o cliente e o servidor OpenVPN em background com Ctrl + z seguido do comando bg.


Exercício 3 - Teste da VPN

  1. Tente agora aceder do PC1 à rede que está bloqueada (192.168.0.0/24) usando o comando ping. É possível? Porquê?

  2. Faça traceroute do PC1 para o servidor 4. O router 2 está presente no caminho? Porquê?

  3. Execute no router 2 o comando tcpdump para observar informação sobre os pacotes trocados. Faça novamente traceroute do PC1 para o servidor 4 e tome nota dos endereços IP de origem e de destino enviados pelo cliente e servidor OpenVPN. O que conclui daí sobre aquilo que uma VPN protege de quem está na Internet?

  4. Faça agora traceroute do servidor 4 para o PC1 e tome também nota dos endereços IP de origem e de destino enviados pelo cliente e servidor OpenVPN. Novemente, o que conclui?


Referências:

About

Kathará VPN laboratory guide

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Generated from tecnico-sec/Template