Gateway acesso remoto

De Wiki BPF
Revisão de 17h59min de 15 de julho de 2020 por Henri.godoy (discussão | contribs)
Ir para navegação Ir para pesquisar

Introdução

Com a pandemia do COVID-19 nossa rotina diária de trabalho de ir a empresa todos os dias foi alterado bruscamente e a necessidade de acesso aos recursos computacionais da empresa de maneira remota causou uma correria na busca de soluções de TI para suportar a demanda. O Home Office que muito se ouvia falar foi finalmente instituído na maioria das empresas ao redor do mundo.

No cenário das Universidades não foi diferente. A necessidade de acesso equipamentos de pesquisa em laboratórios, aos desktops dos laboratórios de informática, sistemas internos e servidores exigiu de todos os profissionais de TI a busca por soluções que envolva um acesso de forma segura, fácil para o usuário e que demonstre um bom desempenho no acesso de um grande conjunto de dispositivos computacionais de maneira orquestrada.

Segundo o levantamento da empresa Kaspersky houve um aumento em 330% de ataques a sistemas de acesso remoto no Brasil. A adesão “forçada” pelo home office fez disparar os ciberataques direcionados ao “Remote Desktop Protocol (RDP)” e em menor quantidade também ao VNC (Virtual Network Computing). Devido a necessidade de transferir a maioria dos seus colaboradores para o trabalho a distância em seus lares, muitas empresas deixaram as medidas de segurança ou com pouca proteção, fazendo liberações indiscriminadas de portas de acesso remoto no firewall corporativo, muitas vezes sem criptografia, senhas fortes ou habilitando a autenticação em dois fatores.

Este breve artigo tem como objetivo demonstrar uma configuração básica inicial de forma oferecer um gateway de acesso a desktops de forma remota, clientless, utilizando o software livre e de código aberto chamado Apache Guacamole.

Projeto Apache Guacamole

O Apache Guacamole é uma infraestrutura que possibilita o acesso remoto a desktops utilizando apenas o navegador Web, sem a instalação de nenhum plug-in ou software cliente. Uma vez conectado ao servidor Guacamole ele age com um intermediário (proxy) até um desktop específico localizado na rede local da empresa, utilizando um dos protocolos suportados mais utilizados como: RDP, VNC, SSH. Na Figura 1 podemos compreender a infraestrutura e os seus componentes durante uma conexão fora do perímetro corporativo.


Todo o projeto é separado em guacamole-server, que fornece o proxy guacd e as bibliotecas relacionadas e o guacamole-client, que fornece o cliente para ser atendido pelo contêiner do servlet do Tomcat. Portanto precisamos que o ambiente a ser instalado ja contemple o Tomcat maior que a versao 8.5. O guacamole-client está disponível em formato binário, mas o guacamole-server deve ser construído a partir do código fonte. Ambas as partes serão descritas com detalhes nos tópicos seguintes.

Ambas as partes serão descritas com detalhes nos tópicos seguintes.

Apache Guacamole Server

O guacamole-server contém em seu código fonte todos os componentes básicos do lado do servidor exigidos pelo para conectar-se a áreas de trabalho remotas. Mesmo assim algumas dependências são necessárias como: cairo, libjpeg, libpng e da biblioteca OSSP UUID. Elas devem estar presentes e instaladas de acordo com a distribuição Linux utilizada. No caso deste artigo, será utilizado o CentOS.

Algumas dependências são absolutamente necessárias, enquanto outras são opcionais. A presença de dependências opcionais permite recursos adicionais como por exemplo:

  • Suporte ao VNC: depende da biblioteca libvncclient
  • Suporte ao RDP depende do FreeRDP (utilizar a versão 2.0 mais atualizada devido a evitar problemas de segurança)
  • Suporte a SSH depende de libssh2, OpenSSL e Pango
  • Ssuporte ao Kubernetes depende de libwebsockets, OpenSSL e Pango.

A compilação do guacamole-server cria um executável chamado guacd que pode ser executado manualmente ou de forma automática como serviço. É desejável e recomendado sempre fazer o download do código fonte mais recente clonando o repositório git da guacamole no GitHub:

git clone git://github.com/apache/guacamole-server.git

Depois que o código fonte do guacamole-server foi baixado e extraído você precisará construir o arquivo configure, que no caso do download pelo GitHub ele não é incluído.

$ cd guacamole-server/
$ autoreconf -fi

Em seguida agora podemos executar o configure para instalar um script de inicialização do guacd no diretório /etc/init.d/ para que seja inicializado de forma automática a cada reboot.

$ ./configure --with-init-dir=/etc/init.d
$ make
$ make install


Apache Guacamole Client

A parte do guacamole-client é compactada em um arquivo .war totalmente independente, chamado guacamole.war e pode ser feito seu download no site do apache guacamole. Novamente sempre é recomendado a última versão estável. A sua instalação envolve copiá-lo para o diretório do contêiner do servlet CATALINA_HOME/webapps/. O diretório varia de acordo com a sua instalação e normalmente o diretório padrão é /usr/share/tomcat/webapps

# cp guacamole.war /usr/share/tomcat/webapps

Depois que o arquivo guacamole.war estiver copiado é necessário reiniciar o Tomcat para implantar o novo aplicativo da web.

# systemctl restart tomcat

Verificar possíveis mensagem de erro e caso esteja sendo executado com sucesso mesmo assim ele está desconfigurado e devemos realizar algumas etapas adicionais no arquivo de configuração principal guacamole.properties.


Configurando o guacamole.properties

Para que o guacamole server funcione você deve configurá-lo com um ou mais método de autenticação. O método padrão lê todos os usuários de um único arquivo chamado user-mapping.xml. Um exemplo de como configurar um usuário pode ser realizado da seguinte forma:

<user-mapping>
<authorize username="username"
           password="hash-password"
           encoding="md5">
</authorize>
</user-mapping>

Todos os arquivos de configurações se encontram no diretório padrão /etc/guacamole, onde são divididos em:

  • guacamole.properties: principal arquivo de configuração
  • logback.xml sistema de registro chamado Logback para todas as mensagens
  • extensions/ O local de todas as extensões do Guacamole que carregará automaticamente os .war
  • lib/ O diretório de bibliotecas requeridas por quaisquer extensões do Guacamole como drivers de banco de dados.

Porém, a configuração do Guacamole começa a ficar interessante quando você tem uma base de dados de usuários e queira utilizar, como por exemplo, LDAP. Existem muitos tutoriais na Internet com exemplos de configuração do arquivo guacamole.properties para integrar as bases de dados. Muitos são de versões antigas e parâmetros que não são mais necessários na versão atual. Depois de muitas tentativas e interagindo com a comunidade de usuários do Guacamole, foi possível uma configuração funcional de uma consulta em uma base de dados LDAP (Active Directory Server) em conjunto com a base de dados MySQL/MariaDB, no qual é necessário para o gerenciamento dos usuários, grupos e atribuição dos desktops a serem conectados.

Para o suporte a autenticação MySQL/MariaDB e LDAP é necessário fazer o download das extensões das versões instaladas no site

(releases)

O arquivo guacamole-auth-jdbc-mysql-1.2.0.jar deve ser copiado para o diretório /etc/guacamole/extensions

O driver MySQL JDBC não vem incluído com a extensão .jar e deve ser feito o seu download no site do MySQL. O driver também é conhecido como Connector/J e o seu arquivo .jar deve ser copiado para o diretório /etc/guacamole/libs

Na sequência devemos importar para o base de dados do servidor MySQL/MariaDB, chamado de guacamole, o schema:

$ ls schema/
001-create-schema.sql  002-create-admin-user.sql  upgrade
$ cat schema/*.sql | mysql -u root -p guacamole_db
Enter password: password

Da mesma forma como foi feita no cópia da extensão para MySQL/MariaDB, devemos realizar para o arquivo guacamole-auth-ldap-1.2.0.jar e copia-lo para o diretório /etc/guacamole/extensions


Guacamole através de um Proxy

É altamente recomendável que o guacamole-server esteja, no caso de um servidor em produção, atrás de um proxy reverso, isolando assim operações privilegiadas, fornecendo flexibilidade e segurança utilizando ainda certificados digitais e criptografia SSL.

Para isso foi configurado no Apache Web Server a função de proxy reverso utilizando as diretivas ProxyPass e ProxyPassReverse. Um exemplo de configuração pode ser realizado de acordo com a linhas abaixo:

<VirtualHost *:80>
    ServerName hostname
    ErrorLog /var/log/httpd/error.log
    CustomLog /var/log/httpd/requests.log combined
    RewriteEngine on
    RewriteRule "^/$" "https://hostname/" [R]

<Location /guacamole>
    Order allow,deny
    Allow from all
    ProxyPass http://hostname:8080/guacamole/ flushpackets=on
    ProxyPassReverse http://hostname:8080/guacamole/
</Location>

</VirtualHost>

Habilitando Certificados Digitais no Guacamole

É recomendado o uso de certificados digitais em todos os componentes da infraestrutura do Guacamole para garantirmos uma conexão segura no tráfego das informações e no acesso remoto. É uma configuração trabalhosa que envolve desde a criação das chaves até a importação dos certificados a autoridade certificadora. As seguintes etapas foram configuradas

Criptografia entre o Tomcat e o servidor Guacamole através do connector tag no arquivo server.xml

Importando o certificado raiz e intermediário da autoridade certificadora:

keytool -import -trustcacerts -alias root -file ac-raiz.pem -keystore .keystore
keytool -import -trustcacerts -alias intermediate -file cadeia-intermediaria.pem -keystore .keystore

Importando o certificado recebido da autoridade certificadora:

keytool -import -trustcacerts -alias tomcat -file certificado.pem -keystore .keystore

Listando os certificados importados:

keytool -list -keystore .keystore

Configurando o Conector Tomcat:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               keystoreFile=".keystore" keystorePass="password"
               clientAuth="false" sslProtocol="TLS" />


Habilitando o servidor Web e Proxy Reverso com os Certificados Digitais

Para configurar o servidor Web Apache temos que editar as linhas abaixo e incluir o caminho do certificado recebido pela autoridade certificadora e a chave privada do certificado:


==== Criptografia entre a comunicação do guacd-client e o guacd-server ==== 

Devemos adicionar a linha abaixo no arquivo de configuração principal guacamole.properties
<pre>
guacd-ssl: true

Importar o certificado digital da autoridade certificado no armazenamento de chaves do Java

keytool -importcert -alias "guacd" -keystore /etc/pki/java/cacerts -file /etc/pki/tls/certs/certificado.pem

Alterar o arquivo de serviços guacd.service do systemctl o caminho do certificado e da chave:

ExecStart=/usr/local/sbin/guacd -f $OPTS -C /etc/pki/tls/certs/certificado.pem -K /etc/pki/tls/certs/key.pem

Após a alteração do arquivo devemos executar o reload:

systemctl daemon-reload

Devemos obter no arquivo /var/log/messages um registro semelhante a este:

guacd[6393]: Guacamole proxy daemon (guacd) version 1.2.0 started
guacd[6393]: Using PEM keyfile /etc/pki/tls/certs/key.pem
guacd[6393]: Using certificate file /etc/pki/tls/certs/certificado.pem
guacd[6393]: Listening on host 127.0.0.1, port 4822

Criptografia na consulta na base dos usuários do Active Directory Server utilizando LDAPS

Devemos primeiro exportar o certificado do AD Server:

openssl s_client -showcerts -connect hostname:636 </dev/null 2>/dev/null | openssl x509 -outform PEM > cert-ad.pem

Depois importar na base de chaves do Java:

 
keytool -importcert -alias "ldaps" -keystore /etc/pki/java/cacerts   -file cert-ad.pem

Interface de Administração do Guacamole

Após vencer todas as etapas de configuração com sucesso vamos acessar a interface de administração digitando no navegador o hostname configurado. Deverá aparecer uma tela solicitando o usuário e a senha. O usuário padrão do Guacamole é guacadmin e a senha é a que foi definida na base de dados do MySQL/MariaDB ou LDAP. Se não foi criado ainda esse usuário deve ser realizado previamente antes de acessar o painel de administração.

Ao entrar com o usuário escolha a opção Settings. Devemos encontrar um menu de configurações conforme ilustra a Figura 2.


  • Active Sessions: lista as conexões ativas no momento podendo encerrar a sessão do usuário caso seja necessário.
  • History: mostra um histórico de todos os usuários que realizaram as conexões remotas, os horários, duração e os desktops acessados.
  • Users: todos os usuários encontrados no LDAP ou MySQL/MariaDB. Aqui ao selecionar os usuários, você poderá configurar quais desktops serão atribuídos, junto com o perfil de acesso de cada um.
  • Groups: criação de grupos de desktops, para facilitar a administração dos acessos remotos
  • Connections: nesta seção é que adicionaremos as máquinas remotas a serem acessadas, escolhendo o tipo de conexão, informando o IP e a forma de autenticação no caso de um RDP, conforme Figura 3.
  • Preferences: altera as opções de teclado e mouse. Se o acesso vier de um dispositivo móvel, as opções aqui devem ser alteradas para que funcione em telas touch,


Conclusão

Neste artigo foi mostrado uma configuração básica do Guacamole com certificados digitais para que fosse implementado em todas as camadas de acesso da aplicação um nível se segurança no trânsito das informações. Na versão atual existem outros tipos de autenticação, inclusive com dois fatores (2FA) que não foi coberto neste documento, mas que podem ser encontrados no Manual do Guacamole, como por exemplo: DUO, TOPT, CAS, OpenID, SAML e RADIUS.

Como em qualquer sistema, devemos sempre estar atento com as vulnerabilidades divulgadas nos protocolos de RDP, SSH e suas bibliotecas, assim como o Tomcat, Java e Apache Web Server, instalando e atualizando sempre para as últimas versões estáveis. https://guacamole.apache.org/security/

O Apache Guacamole demonstrou ser uma alternativa viável de acesso remoto aos desktops, sistemas e servidores, podendo ser acessado inclusive por tablets e smartphones, através de um navegador, sem a instalação de clientes ou plug-ins. Facilita e centraliza, através de um gateway, o gerenciamento das conexões remotas em vez de ter que configurar tuneis SSH, liberação de portas RDP e VNC nos firewalls e ainda fornece um relatório de conexões realizadas pelos usuários.


Referencia