Compartilhe que você está se especializando

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:

PerguntaO 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 linhaAltere 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