Em muitos ambientes corporativos, equipamentos ficam expostos para acesso remoto (acessos por RDP ou SSH), deixando uma grave falha para diversos tipos ataques. Vamos propor uma abordagem mais segura, centralizando os acessos remotos por meio de um gateway web controlado: O Apache Guacamole é uma plataforma Open Source que permite acesso remoto via navegador web para os usuários. Ela possuí módulo que permitem desde a integração com o Active Directory, OTP (One-Time Password) para autenticação multifator, segurança reforçada com Fail2ban (para mitigação de ataques de força bruta), entre outras.
Neste Post, mostraremos como:
- Instalar o Guacamole;
- Centralizar acessos RDP e SSH em um único ponto de entrada HTTPS;
- Integrar autenticação ao Active Directory;
- Bloquear tentativas de força bruta automaticamente;
- Personalizar a interface, para o padrão da sua empresa.
Não iremos usar uma solução OTP aqui, pois nossa sugestão é um ambiente interno, restrito para administradores de rede. Mas é um excelente módulo a agregar segurança ao ambiente.
Para esse post, sugerimos que a seja feita a Instalação do Rocky Linux 10 para ambientes corporativos que usamos, a fim de seja instalado sobre o mesmo padrão e evite possíveis erros
Guacamole Server
Para instalar o Guacamole Server (que faz a conexão nos servidores RDP e SSH), execute os passos abaixo:
Pré-requisitos
Atualize o ambiente:
yum update -y
Faça a liberação no Firewall:
firewall-cmd --permanent --add-port=4822/tcp
firewall-cmd --reload
Para habilitar o suporte ao RDP. Execute:
yum config-manager --set-enabled crb
yum install freerdp-devel libssh-devel libpng libvorbis-devel libwebp-devel pulseaudio-libs-devel uuid-devel -y
yum install cairo-devel curl freerdp gcc gcc-c++ libjpeg-turbo-devel libssh-devel libtool libpng-devel libuuid-devel libwebp-devel make nano pango-devel pulseaudio-libs-devel tar uuid wget -y
Para habilitar o suporte ao avcodec, telnet, websockets e para conexões SSH, execute:
yum install epel-release -y
yum install ffmpeg-free-devel libtelnet-devel libvncserver-devel libwebsockets-devel -y
yum install libssh2-devel -y
yum clean all
Instalando o serviço
Os procedimentos abaixo foram baseados na versão 1.6.0 do Guacamole. Caso a versão que você for instalar seja diferente, adapte estes procedimentos.
cd /usr/src
wget https://archive.apache.org/dist/guacamole/1.6.0/source/guacamole-server-1.6.0.tar.gz
tar -xzf guacamole-server-*.tar.gz
cd guacamole-server-1.6.0
rm -rf /usr/src/guacamole-server-*.tar.gz
./configure --with-systemd-dir=/usr/local/lib/systemd/system
Verifique se não houve erros e se há suporte a todos os protocolos necessários para as conexões remotas (como RDP, SSH). Estando correto, execute:
make
make install
ldconfig
systemctl enable guacd
systemctl start guacd
Instalação do Guacamole Web Client
Para instalar a parte de visualização Web (para os usuários utilizarem o serviço do Guacamole Server), execute os tópicos abaixo:
Pre requisitos: Java e Tomcat
Para instalar o java e o Tomcat, execute:
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
Instale os pacotes e configure:
yum install java-21-openjdk-headless tomcat9 tomcat-jakartaee-migration -y
sed -i "s/suffix=\".txt\"/suffix=\".txt\" rotatable=\"false\"/g" /etc/tomcat/server.xml
systemctl enable --now tomcat
systemctl restart tomcat
tee /etc/logrotate.d/tomcat > /dev/null <<'EOF'
/var/log/tomcat/localhost_access_log.txt {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
EOF
logrotate -d /etc/logrotate.d/tomcat
Guacamole Client (java)
Para fazer download do aplicativo cliente (web) do guacamole, execute:
cd /tmp
wget https://archive.apache.org/dist/guacamole/1.6.0/binary/guacamole-1.6.0.war
mv guacamole-1.6.0.war /var/lib/tomcat/webapps/guacamole.war
systemctl restart tomcat
Banco de dados (MariaDB)
Utilizando banco de dados no Guacamole (MySQL/PostgreSQL/MSSQL) você permite ao guacamole armazenar configurações, perfils, histórico, entre outras coisas. A instalação do conector (plugin) no guacamole será feita no tópico futuro, mas para instalar e configurar o banco de dados MariaDB, execute os seguintes comandos:
yum install mariadb-server -y
systemctl enable --now mariadb
mysql_secure_installation
Aparecerá uma tela para confirmar algumas informações, responda da seguinte forma:
| Pergunta | O que deverá ser respondido |
| Enter current password for root (enter for none): | Deixe em branco e pressione ENTER |
| Switch to unix_socket authentication [Y/n] | N e pressione ENTER |
| Change the root password? [Y/n] | Y e pressione ENTER |
| New password: | Insira a senha (veja qual é) e pressione ENTER |
| Re-enter new password: | Repita a senha e pressione ENTER |
| Remove anonymous users? [Y/n] | Y e pressione ENTER |
| Disallow root login remotely? [Y/n] | Y e pressione ENTER |
| Remove test database and access to it? [Y/n] | Y e pressione ENTER |
| Reload privilege tables now? [Y/n] | Y e pressione ENTER |
Conecte no MySQL:
mysql -uroot -p
Informe a senha do root, dentro do MySQL execute (altere as partes em cinza, conforme sua realidade):
CREATE DATABASE guacamole_db;
CREATE USER 'guacuser'@'localhost' IDENTIFIED BY 'SenhaForteAqui';
GRANT ALL PRIVILEGES ON guacamole_db.* TO 'guacuser'@'localhost';
FLUSH PRIVILEGES;
Exit
Agora, execute:
tee /etc/logrotate.d/mariadb > /dev/null <<'EOF'
/var/log/mariadb/mariadb.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
EOF
logrotate -d /etc/logrotate.d/mariadb
Instale os pacotes para conexão ao banco:
yum install mariadb-java-client -y
Extensões do Guacamole Web
Explicar o que é, como funciona (estrutura de pastas e do arquivo )
Extensão JDBC do Guacamole
Para executar o script nesse banco criado, execute:
cd /tmp
wget https://archive.apache.org/dist/guacamole/1.6.0/binary/guacamole-auth-jdbc-1.6.0.tar.gz
tar -xzf guacamole-auth-jdbc-1.6.0.tar.gz
cat /tmp/guacamole-auth-jdbc-1.6.0/mysql/schema/*.sql | mysql -u root -p guacamole_db
Será solicitada a senha do root do MySQL, insira essa senha e ao final execute:
mkdir -p /etc/guacamole/extensions
mkdir -p /etc/guacamole/lib
echo "GUACAMOLE_HOME=/etc/guacamole" >> /etc/default/tomcat
ln -s /etc/guacamole /usr/share/tomcat/.guacamole
touch /etc/guacamole/guacamole.properties
chmod 600 /etc/guacamole/guacamole.properties
chown tomcat:tomcat /etc/guacamole/guacamole.properties
ln -sf /etc/guacamole /var/lib/tomcat/.guacamole
mv /tmp/guacamole-auth-jdbc-1.6.0/mysql/guacamole-auth-jdbc-mysql-1.6.0.jar /etc/guacamole/extensions/
Para configurar guacamole.properties, execute:
echo "guacd-hostname: localhost" > /etc/guacamole/guacamole.properties
echo "guacd-port: 4822" >> /etc/guacamole/guacamole.properties
echo "" >> /etc/guacamole/guacamole.properties
echo "mysql-hostname: localhost" >> /etc/guacamole/guacamole.properties
echo "mysql-port: 3306" >> /etc/guacamole/guacamole.properties
echo "mysql-database: guacamole_db" >> /etc/guacamole/guacamole.properties
echo "mysql-username: guacuser" >> /etc/guacamole/guacamole.properties
echo "mysql-password: SenhaForteAqui" >> /etc/guacamole/guacamole.properties
echo "mysql-driver: mysql" >> /etc/guacamole/guacamole.properties
cd /tmp
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-9.7.0.tar.gz
tar -xzf mysql-connector-j-9.7.0.tar.gz
mv /tmp/mysql-connector-j-9.7.0/mysql-connector-j-9.7.0.jar /etc/guacamole/lib/
Agora reinicie o serviço:
systemctl restart guacd
systemctl restart tomcat
Agora, acesse http://IP_DO_SERVIDOR:8080/guacamole (usuário e senha guacadmin)
Autenticação LDAP (Active Directory)
Para executar a configuração da integração com o Active Directory, será necessário ter informações do seu AD (credenciais, grupo de acesso) e um entendimento sobre a estrutura LDAP (distinguished names, por exemplo).
Deixaremos algumas partes abaixo em cinza, para que você altere conforme a realidade do seu ambiente. Também sugerimos que a conta de serviço (no AD) seja de um grupo “No Logon” (crie) e retirado do grupo “Domain Users”, evitando acessos desnecessários para essa conta. Para habilitar a autenticação do LDAP/Active Directory no Apache Guacamole, execute os seguintes comandos:
cd /tmp
wget https://archive.apache.org/dist/guacamole/1.6.0/binary/guacamole-auth-ldap-1.6.0.tar.gz
tar -xzf guacamole-auth-ldap-1.6.0.tar.gz
mv /tmp/guacamole-auth-ldap-1.6.0/guacamole-auth-ldap-1.6.0.jar /etc/guacamole/extensions
Para configurar o grupo do LDAP/Active Directory, execute os seguintes comandos:
echo "" >> /etc/guacamole/guacamole.properties
echo "ldap-hostname: 192.168.1.2" >> /etc/guacamole/guacamole.properties
echo "ldap-user-base-dn: DC=seudominio,DC=com,DC=br" >> /etc/guacamole/guacamole.properties
echo "ldap-username-attribute: sAMAccountName" >> /etc/guacamole/guacamole.properties
echo "ldap-group-base-dn: DC=seudominio,DC=com,DC=br" >> /etc/guacamole/guacamole.properties
echo "ldap-member-attribute: member" >> /etc/guacamole/guacamole.properties
echo "ldap-search-bind-dn: CN=conta de serviço,OU=NOME DA OU,DC=seudominio,DC=com,DC=br" >> /etc/guacamole/guacamole.properties
echo "ldap-search-bind-password: seu_da_conta_de_serviço" >> /etc/guacamole/guacamole.properties
echo "ldap-user-search-filter: (&(objectClass=user)(memberOf=CN=Nome do Grupo,OU=NOME DA OU,DC=seudominio,DC=com,DC=br))" >> /etc/guacamole/guacamole.properties
echo "ldap-max-search-results:200" >> /etc/guacamole/guacamole.properties
echo "mysql-auto-create-accounts: true" >> /etc/guacamole/guacamole.properties
Agora reinicie o Tomcat
systemctl restart tomcat
Acesse o guacamole como administrador, e para criar uma conexão RDP:
- Clique no menu do usuário no canto superior direito e escolha a opção Settings, acesse a aba Connections e clique em New Connection. Configure da seguinte forma:
- Name: PRESI-241-RDPProtocol: RDP
- Em Parameters
- Hostname: CN=100.0.8.200
- Security Mode: NLA
- Marque a opção Ignorar certificado do servidor
- Marque a opção Trust host certificate on first use
- Salve
- Clique sobre o usuário, vá em Settings, clique no menu Groups e clique em New Group. Coloque o nome do grupo (o mesmo nome do grupo que existe no AD) e adicione a(s) permissão(ões) desejada(s) e salve.
Atenção, depois que o usuário fizer logon com a conta de rede, acesse o guacamole como admin e dê acesso às conexões que você desejar.
Bloqueio de Força Bruta
O Guacamole possuí uma extensão que detecta e bloqueia tentativas de força bruta de logins. Rastreando e bloqueando por 5 minutos os IP’s após 5 tentativas de login com falhas. Para instalar esse módulo, execute:
cd /tmp
wget https://archive.apache.org/dist/guacamole/1.6.0/binary/guacamole-auth-ban-1.6.0.tar.gz
tar -xzf guacamole-auth-ban-1.6.0.tar.gz
mv /tmp/guacamole-auth-ban-1.6.0/guacamole-auth-ban-1.6.0.jar /etc/guacamole/extensions
Insira no arquivo guacamole.properties as seguintes configurações (alterando os valores que desejar):
echo "" >> /etc/guacamole/guacamole.properties
echo "# Banning Extension Configuration" >> /etc/guacamole/guacamole.properties
echo "ban-max-invalid-attempts: 3" >> /etc/guacamole/guacamole.properties
echo "ban-address-duration: 600" >> /etc/guacamole/guacamole.properties
echo "ban-max-addresses: 500000" >> /etc/guacamole/guacamole.properties
Apague o conteúdo baixado e reinicie o Guacamole
rm -rf /tmp/guacamole-auth-ban-1.6.0
systemctl restart tomcat
systemctl restart guacd
Customizando o layout
Baseado na extensão Branding, iremos aqui criar uma extensão, aplicá-la e alterar algumas características da interface atual, como logo, mensagem de login e cores. Para isso, execute:
cd /tmp
mkdir -p guac-branding/{images,translations}
Coloque o logo da empresa (em formato .png) na pasta guac-branding/images/logo.png, em seguida execute:
tee /tmp/guac-branding/guac-manifest.json > /dev/null <<'EOF'
{
"guacamoleVersion": "*",
"name": "Nome da sua Empresa",
"namespace": "company-branding",
"translations" : [
"translations/en.json"
],
"css": [
"theme.css"
],
"resources" : {
"images/logo.png" : "image/png"
}
}
EOF
tee /tmp/guac-branding/theme.css > /dev/null <<'EOF'
.login-ui .login-dialog .logo {
background-image: url('app/ext/company-branding/images/logo.png');
width: 9em;
-webkit-background-size: 9em auto;
}
div.login-ui {
background: #666;
background-color: #666;
}
.login-ui .login-dialog {
background-color: white;
}
EOF
tee /tmp/guac-branding/translations/en.json > /dev/null <<'EOF'
{
"NAME" : "English",
"APP":{
"NAME" : "Remote Access Portal"
}
}
EOF
cd guac-branding
zip -r company-branding.jar .
Para colocar esse plugin para funcionar, execute:
cd /tmp
cp -f /tmp/guac-branding/company-branding.jar /etc/guacamole/extensions/
rm -rf /tmp/guac-branding
systemctl restart tomcat
systemctl restart guacd
Proxy reverso
É uma boa prática que o Guacamole seja executado atrás de um proxy reverso. Permitindo o uso de criptografia SSL e um acesso mais simples e transparente para o usuário.
Para isso, no servidor guacamole, execute:
vim /etc/tomcat/server.xml
Dentro, pressione a tecla INSERT de seu teclado para entrar em modo de inserção e altere a linha abaixo:
| Localize a linha | Altere para (altere a parte em cinza): |
| <Connector port=”8080″ protocol=”HTTP/1.1″ URIEncoding=”UTF-8″ connectionTimeout=”20000″ redirectPort=”8443″ maxParameterCount=”1000″ /> | <Connector port=”80″ protocol=”HTTP/1.1″ URIEncoding=”UTF-8″ connectionTimeout=”20000″ redirectPort=”8443″ maxParameterCount=”1000″ maxHttpHeaderSize=”65536″ /> |
Ao final do arquivo (antes </Host>), adicione o também o seguinte seguinte:
| <Valve className=”org.apache.catalina.valves.RemoteIpValve” remoteIpHeader=”x-forwarded-for” remoteIpProxiesHeader=”x-forwarded-by” protocolHeader=”x-forwarded-proto” /> |
Após editar, pressione a tecla ESC e digite :wq! para salvar e sair. Em seguida, execute:
setcap 'cap_net_bind_service=+ep' /usr/lib/jvm/jre/bin/java
echo "/usr/lib/jvm/java-21-openjdk/lib" > /etc/ld.so.conf.d/java.conf
ldconfig
Para liberar a porta 80 para o tomcat:
semanage port -a -t http_port_t -p tcp 80 2>/dev/null || sudo semanage port -m -t http_port_t -p tcp 80
echo "/usr/lib/jvm/java-21-openjdk/lib" > /etc/ld.so.conf.d/java.conf
ldconfig
Configure o Firewalld para liberar a porta 80:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
Reinicie o Tomcat:
systemctl restart tomcat
Já no proxy reverso, crie o redirecionamento para esse servidor (sugestão é um redirecionamento do host para /guacamole e do /guacamole para a aplicação tomcat)
Troca de senha do guacadmin
Por fim, com todo o ambiente funcionando corretamente, acesse como guacadmin, clique no menu do usuário no canto superior direito e escolha a opção Settings,clique na aba Preferences. Vá até CHANGE PASSWORD, coloque a senha atual, a nova senha, confirme a nova senha e clique em Update Password.
Vamos começar pela arquitetura da solução e pelos pré-requisitos necessários para a implantação.Aqui faremos um POST rápido sobre um assunto que acreditamos que pode acrescentar a vários profissionais, tentaremos ser breve e abordaremos de uma maneira também bem simples com o objetivo de agregar o máximo da forma mais rápida.
Fontes/Referências
NVLAN – Instalação do Rocky Linux 10 para ambientes corporativos
https://bobcares.com/blog/apache-guacamole-reset-guacadmin-password/
https://computingforgeeks.com/install-guacamole-rocky-almalinux/
https://enterprise.glyptodon.com/doc/latest/authenticating-users-with-ldap-12812314.html
https://github.com/itiligent/Easy-Guacamole-Installer/blob/main/ACTIVE-DIRECTORY-HOW-TO.md
https://github.com/Zer0CoolX/guacamole-customize-loginscreen-extension
https://guacamole.apache.org
https://i12bretro.github.io/tutorials/0140.html
https://kifarunix.com/install-apache-guacamole-on-rocky-linux-8
https://youtube.com/watch?v=AKhgSLjQk38