Moles Moles Guacamoles
================================
Veja como instalar e configurar um gateway de acesso utilizando o software `Guacamole `_.
.. note:: Para utilizá-lo com a VPN deverá gerar antes, os devidos certificados digitais.
Visão Geral
-----------
Em resumo, a :ref:`instalação` e a :ref:`configuração` da solução será:
* **Sistema Operacional**: CentoOS 7
* **Servidor Web**: Apache (2.4.6)
* **Servidor de Aplicação**: Tomcat (7.0.54)
* **Banco de Dados**: MariaDB (5.5.47)
* **Compilador**: gcc
* **Softwares**: Guacamole (0.9.9) e Extensões (banco de dados e ldap)
.. figure:: visao-geral-guacamole.png
:scale: 80 %
:align: center
:alt: Visão Geral - Guacamole
Diagrama da arquitetura da instalação do Guacamole e seus componentes feita nesta documentação.
.. _instalação:
Instalação
-----------
Desabilitar serviços que não são necessários e que não serão utilizados::
systemctl disable firewalld
systemctl stop firewalld
systemctl disable postfix
systemctl stop postix
SELinux - Se não souber utilizar, desabilite ou coloque em modo permissivo assim::
setenforce 0
vi /etc/sysconfig/selinux
SELINUX=permissive
Instalar e pacotes::
yum -y install haveged
systemctl start haveged
systemctl enable haveged
yum -y install tomcat
systemctl start tomcat
systemctl enable tomcat
yum -y install httpd
yum -y install mod_ssl
systemctl start httpd
systemctl enable httpd
.. _Guacamole e Componentes:
A `documentação `_ e os `downloads `_ do softwares são:
Componentes do Guacamole - dependências de pacotes
* **Repositórios necessários**::
yum -y install epel-release wget
wget -O /etc/yum.repos.d/home:felfert.repo http://download.opensuse.org/repositories/home:/felfert/Fedora_19/home:felfert.repo
* **Pacotes**::
yum -y install cairo-devel freerdp-devel gcc java-1.8.0-openjdk.x86_64 libguac libguac-client-rdp libguac-client-ssh libguac-client-vnc libjpeg-turbo-devel libpng-devel libssh2-devel libtelnet-devel libvncserver-devel libvorbis-devel libwebp-devel openssl-devel pango-devel pulseaudio-libs-devel terminus-fonts tomcat tomcat-webapps uuid-devel
* **Download Guacamole - v0.9.9** - realizar download do Guacamole a ser compilado::
wget -O guacamole-0.9.9.war http://downloads.sourceforge.net/project/guacamole/current/binary/guacamole-0.9.9.war
wget -O guacamole-server-0.9.9.tar.gz http://sourceforge.net/projects/guacamole/files/current/source/guacamole-server-0.9.9.tar.gz
* **Download das Extensões** - realizar download das extensões para utilização com banco de dados e sistema de diretório::
wget http://sourceforge.net/projects/guacamole/files/current/extensions/guacamole-auth-jdbc-0.9.9.tar.gz
wget http://dev.mysql.com/get/Downloads/Connector/j/mysql-connector-java-5.1.38.tar.gz
wget https://sourceforge.net/projects/guacamole/files/current/extensions/guacamole-auth-ldap-0.9.9.tar.gz
* **Descompactar Guacamole e extensões** - extensões para integração com banco de dados e com o LDAP::
tar -xzf guacamole-server-0.9.9.tar.gz
tar -xzf guacamole-auth-jdbc-0.9.9.tar.gz
tar -xzf mysql-connector-java-5.1.38.tar.gz
tar -xzf guacamole-auth-ldap-0.9.9.tar.gz
* **Criar Diretório Guacamole** - será o local de instalação::
mkdir /etc/guacamole
mkdir /etc/guacamole/lib
mkdir /etc/guacamole/extensions
* **Compilando e Instalando o Guacamole** - ao compilar o guacamole, será criado o binário guacd::
cd guacamole-server-0.9.9
./configure --with-init-dir=/etc/init.d
make
make install
ldconfig
* **Configurar inicialização automática do guacd**::
systemctl enable guacd
systemctl start guacd
* **Disponibilizando Arquivos** - após instalação dos componentes e extensões, disponibiliza-se para as devidas pastas::
cd ..
cp guacamole-0.9.9.war /etc/guacamole
ln -s /etc/guacamole/guacamole-0.9.9.war /var/lib/tomcat/webapps/
mv /usr/lib64/freerdp/guacsnd.so /usr/lib64/freerdp/guacsnd.so.old
mv /usr/lib64/freerdp/guacdr.so /usr/lib64/freerdp/guacdr.so.old
ln -s /usr/local/lib/freerdp/* /usr/lib64/freerdp/.
cp mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar /etc/guacamole/lib/
cp guacamole-auth-jdbc-0.9.9/mysql/guacamole-auth-jdbc-mysql-0.9.9.jar /etc/guacamole/extensions/
cp guacamole-auth-ldap-0.9.9/guacamole-auth-ldap-0.9.9.jar /etc/guacamole/extensions/
* **Link para Tomcat**::
mkdir -p /usr/share/tomcat/.guacamole/{extensions,lib}
ln -s /etc/guacamole/extensions/guacamole-auth-jdbc-mysql-0.9.9.jar /usr/share/tomcat/.guacamole/extensions/
ln -s /etc/guacamole/lib/mysql-connector-java-5.1.38-bin.jar /usr/share/tomcat/.guacamole/lib/
ln -s /etc/guacamole/extensions/guacamole-auth-ldap-0.9.9.jar /usr/share/tomcat/.guacamole/extensions/
ln -s /etc/guacamole/guacamole.properties /usr/share/tomcat/.guacamole/
.. _banco_de_dados:
Banco de Dados
""""""""""""""
A instalação do banco de dados e ajustes iniciais.
.. note:: Armazene as senhas em local seguro!
* **Propriedades do Guacamole** - essas são as configurações iniciais para subir o serviço com o banco de dados. Mudanças neste arquivo tornam necessário reiniciar o Tomcat.::
echo "# Configurações do Banco MySQL" >> /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: guacamole_user" >> /etc/guacamole/guacamole.properties
echo "mysql-password: " >> /etc/guacamole/guacamole.properties
systemctl restart tomcat
* **Instalar banco** ::
yum -y install mariadb-server
systemctl start mariadb
systemctl enable mariadb
* **Melhorar segurança do banco** ::
mysql_secure_installation
* **Criar conta e banco de dados** - criando banco e importando esquemas::
mysql -u root -p
create database guacamole_db;
create user 'guacamole_user'@'localhost' identified by '';
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
FLUSH PRIVILEGES;
quit
* **Criando schema** - script com definições do esquema de dados::
cat guacamole-auth-jdbc-0.9.9/mysql/schema/*.sql | mysql -u root -p guacamole_db
* **Finalizando a Instalação** - atualizar pacotes::
yum update
Considerando que os serviços iniciaram corretamente, o sistema estará disponível em ``http://:8080/guacamole-0.9.9/``
.. note:: O usuário/senha padrão é ``guacadmin``. Troque a senha!
.. _configuração:
Configuração
------------
Após a instalação do serviço, a configuração foi feita com base na documentação do fabricante, fórum e boas práticas.
Certificados
""""""""""""
Os certificados aqui gerados e configurados serão utilizados logo a frente, para:
* **Servidor Web** - certificado do site (HTTPS). Crie ou importe um certificado (Veja como em `certificados digitais: `_)
* **Tomcat** - certificado para o túnel entre o servidor web e o Tomcat.
Gerar um certificado auto-assinado com o nome ``tomcat``, com validade de 90 dias. Ficará armazenado no diretório 'home' do usuário corrente, dentro da keystore chamada ``.keystore``::
keytool -genkey -alias tomcat -keyalg RSA
#### Exemplo na geração do certificado ####
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: Guacamole
What is the name of your organizational unit?
[Unknown]: IMPACTA
What is the name of your organization?
[Unknown]: IMPACTA
What is the name of your City or Locality?
[Unknown]: Cidade
What is the name of your State or Province?
[Unknown]: Estado
What is the two-letter country code for this unit?
[Unknown]: BR
Enter key password for
(RETURN if same as keystore password):
O certificado gerado estará no diretório do usuário, mova o arquivo para uma pasta que o Tomcat tenha acesso::
mv ~/.keystore /usr/share/tomcat/.keystore
* **LDAP** - exporte o certificado do Active Directory e importe o certificado para o utilização do LDAPS::
keytool -imporIMPACTAert -alias activedirectory:ca-ad-IMPACTA -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64/jre/lib/security/cacerts -file /root/ca-ad-IMPACTA.cer
Para verificar se o certificado foi importado, liste os certificados do cacerts::
keytool -list -keystore /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64/jre/lib/security/cacerts
.. _Apache:
Apache
"""""""""
.. note:: WebSocket - Mesmo com a configuração de websocket (ws) no Apache, o Web Socket não funcionou devidamente, porém não impacta na utilização do Guacamole. É possível também utilizar o :ref:`NGINX`, faça sua escolha.
Será o serviço responsável por receber as solicitações do usuários e aplicar criptografia no canal (HTTPS) e encaminhar para o Tomcat. O encaminhamento (proxying) do Apache para o Tomcat é feito utilizando também criptografia. Uma configuração de exemplo do Apache:
* **ServerTokens** - ocultar informações sobre apache
* **Strict-Transport-Security** - habilitar o HSTS para evitar certos tipos de ataque MITM
* **X-Frame-Options** - não permite que site seja embutido (iframe) em outro site evitando ataques do tipo clickjacking.
* **SetEnvIf** - definir o que não irá para log, para que não seja gerado muitos eventos que não são muito úteis. Caso de uma conexão é estabelecida e há tráfego de dados entre servidor guacamole e terminal remoto.::
vi /etc/httpd/conf.d/guacamole.IMPACTA.local.conf
# Server version: Apache/2.4.6 (CentOS
ServerTokens Prod
ServerName guacamole.IMPACTA.local
ServerAlias guacamole.IMPACTA.local
ServerAlias vnp
RewriteEngine on
RewriteRule "^/$" "https://guacamole.IMPACTA.local/" [R]
SetEnvIf Remote_Addr "::1" loopback
CustomLog /var/log/httpd/guacamole.IMPACTA.local-access.log common env=!loopback
ErrorLog /var/log/httpd/guacamole.IMPACTA.local-error.log
ServerName guacamole.IMPACTA.local
ServerAlias guacamole.IMPACTA.local
ServerAlias guacamole
SSLEngine On
SSLCertificateKeyFile /etc/pki/tls/private/guacamole_IMPACTA_local_ssl.key
SSLCertificateFile /etc/ssl/certs/guacamole_IMPACTA_local_ssl.crt
RewriteEngine on
SSLProxyEngine on
Header always set Strict-Transport-Security "max-age=15552000; includeSubdomains;"
Header always append X-Frame-Options SAMEORIGIN
Header unset Etag
Header set X-XSS-Protection "1; mode=block"
Require all granted
ProxyPass https://127.0.0.1:8443/guacamole-0.9.9/ flushpackets=on
ProxyPassReverse https://127.0.0.1:8443/guacamole-0.9.9/
Require all granted
ProxyPass ws://127.0.0.1:8443/guacamole-0.9.9/websocket-tunnel
ProxyPassReverse ws://127.0.0.1:8443/guacamole-0.9.9/websocket-tunnel
SetEnvIf Request_URI "^/tunnel" dontlog
CustomLog /var/log/httpd/guacamole.IMPACTA.local-access_ssl.log common env=!dontlog
ErrorLog /var/log/httpd/guacamole.IMPACTA.local-error_ssl.log
Alguns outros ajustes e também questões de segurança::
vi /etc/httpd/conf.d/ssl.conf
# Desatibilita protocolos fracos/vulneraveis
SSLProtocol All -SSLv2 -SSLv3
# Desabilitar Cifras fracos/vulneraveis
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
Como o certificado do Tomcat é auto-assinado é necessário desativar a checagem de seu certificado, caso contrário o Apache recusará a conexão. Inserir fora do ````::
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
.. _NGINX:
NGINX
""""""
Com este servidor web o Web Socket funciona normalmente::
yum -y install nginx
systemctl enable nginx
Uma das formas para redirecionar o tráfego para HTTPS é comentar parte do arquivo::
vi /etc/nginx/nginx.conf
# server {
# listen 80 default_server;
# listen [::]:80 default_server;
. . .
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
Fazer as configurações no arquivo::
vi /etc/nginx/conf.d/guacamole.kos.local.conf
# nginx version: nginx/1.10.1
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server_tokens off;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/guacamole.kos.local.crt;
ssl_certificate_key /etc/pki/tls/private/guacamole.kos.local.key;
add_header X-Frame-Options "SAMEORIGIN";
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
location / {
proxy_pass https://localhost:8443/guacamole-0.9.9/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cookie_path /guacamole/ /;
access_log off;
}
}
Inicie o serviço::
systemctl start nginx
Tomcat
""""""
Para permitir que o tráfego entre o Apache e o Tomcat seja criptografado, as configurações abaixo são feitas.
* **Server > port** - destivar porta de shutdown
* **Listener > SSLEngine** - habilitar SSL
* **Connector > server** - alterar nome utilizado para evitar expor versão do tomcat ::
vi /etc/tomcat/server.xml
.. code-block:: xml
* **Restringir Acesso** - para não permitir acesso direto ao Tomcat é necessário inserir o parâmetro abaixo (dentro do ````)::
vi /usr/share/tomcat/conf/context.xml
.. code-block:: xml
:emphasize-lines: 1-2
Por fim, caso não seja necessário, remova aplicações exemplo que vem com o Tomcat (``examples, host-manager, manager, ROOT, sample``)::
rm -rf /usr/share/tomcat/webapps/{examples,host-manager,ROOT,manager,sample}
* **Página de Erro** - para tratar páginas de erros, edite o arquivo abaixo e inclua as linhas em destaque.::
vi /usr/share/tomcat/conf/web.xml
.. code-block:: xml
:emphasize-lines: 9-12
. . .
index.html
index.htm
index.jsp
404
/error.html
Agora, crie a página de erro com o conteúdo de exemplo.::
vi ../webapps/guacamole-0.9.9/error.html
.. code-block:: html
404
404 - URL inexistente
Verifique o nome digitado.
Altere permissão::
chown tomcat:tomcat ../webapps/guacamole-0.9.9/error.html
* **Ajustes Finos**
**Imagens** - substitua as imagens padrão para as novas (envie as suas imagens)::
cd ../webapps/guacamole-0.9.9/images/
mv logo-64.pnp logo-64.pnp.backup
mv logo-144.pnp logo-144.pnp.backup
mv guac-tricolor.pnp guac-tricolor.pnp.backup
**Idioma** - adicionar lingua portuguesa do Brasil (envie a sua tradução).::
cd ../webapps/guacamole-0.9.9/translations
cp /tmp/pt_BR.json .
chown tomcat:tomcat pt_BR.json
LDAP - Active Directory
"""""""""""""""""""""""
Para permitir a integração ao sistema de diretório (Active Directory) sem a necessidade de alterar seu esquema, o que é considerado um pouco intrusivo, utiliza-se a extensão LDAP da seguinte forma::
vi ../guacamole.properties
# LDAP - Integracao com Active Directory
ldap-hostname: guacamole.IMPACTA.local
ldap-port: 636
ldap-encryption-method: ssl
ldap-user-base-dn: OU=usuarios,DC=IMPACTA,DC=local
ldap-search-bind-dn: CN=guacamole_servico,OU=contas_servicos,DC=IMPACTA,DC=local
ldap-search-bind-password: XXXX_SENHA_XXXX
ldap-username-attribute: sAMAccountName
Reinicie o serviço para validar aplicar as configuraçôes e veja logs para mais informações e debug::
systemctl restart tomcat
Para garantir que tudo esteja bem quando reiniciar o servidor::
reboot
Pronto! A aplicação já pode ser utilizada :)