Onde trabalho usamos
Team Viewer para suporte remoto a clientes. O problema é que não deveria ser permitido o acesso externo a máquinas da LAN que usam o Team Viewer.
Bem, primeiro, o funcionário não deve passar seu ID, certo? Mas e se ele quiser acessar seu computador do trabalho de qualquer outro lugar? E isso não for permitido pela política da empresa?
Tentei encontrar uma solução para esse caso e pesquisei muito na Internet, aqui no VOL também, e todas as soluções encontradas não funcionaram para mim.
Cheguei a uma que funcionou perfeitamente e vou demonstrar como implementá-la.
Como funciona o Team Viewer
Primeiro, entenda que a conexão com Team Viewer é de três pontas.
As máquinas de conexão sainte e entrante precisam se conectar com os servidores do Team Viewer, pois são estes que mantém a conexão aberta e permitem o tráfego de rede.
Essa comunicação funciona na camada de aplicação (layer 7) do modelo OSI (Open Systems Interconnect), portanto não conseguimos bloqueá-la usando um firewall comum, já que ele atua nas camadas 4 (transporte) e 5 (sessão).
Usando muito do que aprendi lendo informações na Internet decidi tentar bloquear o Team Viewer usando Squid, já que o utilizamos para bloqueio de acessos indevidos.
Pensei nisso, também, por que não consegui usar com eficiência o módulo string do IPTables.
Algo como:
iptables -A OUTPUT -p tcp -m string --algo bm --string "teamviewer" -j DROP
não funcionou. E o FORWARD é aberto por conta de particularidades da rede que não cabe aqui mencionar.
Configurando Squid e IPTables
O Squid é autenticado, então o firewall direciona todas as conexões da LAN nas portas 80 e 443 para a 3128.
Adicionei a essa regra a porta 5938, pois são essas três que o Team Viewer utiliza.
A regra ficou assim:
# iptables -t nat -A PREROUTING -s $LAN -p tcp -m multiport --dports 80,443,5938 -j REDIRECT --to-port 3128
$LAN é uma variável que pode ser definida anteriormente como LAN="192.168.0.0/24" ou LAN="192.168.0.10,192.168.0.20,192.168.0.30" etc. Também é possível simplesmente declarar o IP ou intervalo de IPs desejados no lugar da variável.
Quando o funcionário inicia o Team Viewer, o programa tenta acessar os servidores usando as portas 5938, 443 e 80, nessa ordem.
Se o programa não contiver os dados para autenticação no proxy, não vai funcionar. Ele não se conecta, portanto não há como ser acessado externamente.
Para configurar os usuários que poderiam acessar o Team Viewer, configurei o
squid.conf desta maneira:
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 5938
acl port_80 port 80
acl port_443 port 443
acl port_5938 port 5938
acl CONNECT method CONNECT
acl tvusers proxy_auth "/xxx/squid/acls/tvusers.acl"
acl tvservers dstdomain "/xxx//squid/acls/tvservers.acl"
acl teamvtime time MTWHF 08:00-18:00
http_access allow tvusers tvservers teamvtime
http_access deny tvusers tvservers !teamvtime
http_access allow http port_80 authenticated_users
http_access allow CONNECT port_443 authenticated_users
http_access allow CONNECT port_5938 tvusers
Claro, há muito mais linhas no arquivo, mas essas são as responsáveis por autenticar os usuários e autorizar o CONNECT nas portas 443 e 5938. A conexão na porta 80 é do tipo http.
O arquivo tvservers.acl contém os domínios usados pelo Team Viewer: .teamviewer.com e .dyngate.com. ATENÇÃO: é importante o ponto no início de cada linha, pois ele significa que qualquer coisa antes do FQDN (Full Qualified Domain Name) será permitido como, por exemplo, ping1.teamviewer.com.
O arquivo tvusers.acl contém os usuários com autorização para usar o Team Viewer e aí vai de cada cenário.
Eu também quis limitar o horário de uso então usei a seguinte linha:
acl teamvtime time MTWHF 08:00-18:00
Esclarecendo: M=Monday (segunda), T=Tuesday (terça), W=Wednesday (quarta), H=Thursday (quinta), F=Friday (sexta). O horário utilizado tem que seguir o do servidor e o que usei está com o TimeZone America/Sao_Paulo, portanto preciso usar o formato 24 horas.
Primeiro, você permite o acesso dos usuários (teamvusers) para os domínios permitidos (tvservers) nos horários permitidos (teamvtime). Em seguida você nega essa mesma condição adicionando o ! antes da ACL que delimita o horário permitido.
Conclusão
Bem, com isso consegui limitar o uso do Team Viewer para determinadas pessoas em determinado horário mas isso também significa que o acesso externo é possível nas máquinas dessas pessoas nesse determinado horário.
Meu monitoramento de acessos com Squid e de rede com NTop poderá me mostrar essas conexões e eu, como administrador da rede, tenho como saber se os IPs são de clientes mas meu objetivo é só permitir que a conexão se inicie na minha LAN nunca externamente.
Imagino que conseguiria isso usando Firewall (conntrack, talvez) mas não posso usar uma POLICY para o FORWARD como DROP então ainda não consegui chegar à regras que funcionem. Se alguém tiver sugestões, agradeço.
Bom, é isso.
Espero que, se alguém, tiver alguma discordância e/ou sugestão, por favor, comente.
Abraço.