Despliegue de CMS Java
En esta práctica vamos a desplegar un CMS escrito en java. ¿Qué debemos tener en cuenta?
- Debes desplegar la aplicación desde un fichero war.
- No usar instalaciones “bundler”. Estas instalaciones instalan la aplicación y tomcat al mismo tiempo. La aplicación se debe desplegar en el tomcat que tienes instalado.
- Utiliza una máquina virtual que tenga suficiente memoria, al menos 2Gb, algunos CMS requieren mucha memoria RAM.
- La aplicación debe guardar los datos en una base de datos
En esta práctica vamos a instalar un CMS escrito en Java, Apache Guacamole, que facilitará la administración remota de sistemas, unificando en una sola interfaz web los protocolos más usados en la administración remota (SSH, VNC, RDP). De esta forma podremos hacer uso de todos estos servicios simplemente accediendo a la interfaz web que nos ofrece.
Así pues, en primer lugar hay que instalar las dependencias de guacamole. Hay pocas obligatorias, pero yo he optado por instalar una gran cantidad de las opcionales (cada persona deberá decidir cuales quiere instalar y cuales no, dependiendo de sus necesidades). Podemos encontrar las dependencias en la página oficial de guacamole:
apt install build-essential libcairo2-dev libjpeg62-turbo-dev libpng-dev libtool-bin libossp-uuid-dev libavcodec-dev libavformat-dev libswscale-dev freerdp2-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libwebsockets-dev libpulse-dev libvorbis-dev libwebp-dev
Ahora debemos descargarnos las fuentes de guacamole-server, para compilar el programa nosotros (es un requisito que nos indica en la página, aunque posteriormente descarguemos el fichero .war
para instalar el cliente). Así pues, descargaremos la última versión que hay en la página oficial:
wget -O 'guacamole-client-1.3.0.tar.gz' 'https://apache.org/dyn/closer.lua/guacamole/1.3.0/source/guacamole-server-1.3.0.tar.gz?action=download'
Y lo extraemos:
tar -zxf guacamole-server-1.3.0.tar.gz
Si accedemos al directorio que acabamos de extraer, nos encontramos lo siguiente:
ls -l guacamole-server-1.3.0
total 744
-rw-r--r-- 1 1001 users 55738 dic 29 2020 aclocal.m4
drwxr-xr-x 2 1001 users 4096 dic 29 2020 bin
drwxr-xr-x 2 1001 users 4096 dic 29 2020 build-aux
-rw-r--r-- 1 1001 users 6341 dic 29 2020 config.h.in
-rwxr-xr-x 1 1001 users 555917 dic 29 2020 configure
-rw-r--r-- 1 1001 users 37030 dic 29 2020 configure.ac
-rw-r--r-- 1 1001 users 1984 jun 30 2020 CONTRIBUTING
drwxr-xr-x 2 1001 users 4096 dic 29 2020 doc
-rw-r--r-- 1 1001 users 6084 dic 29 2020 Dockerfile
-rw-r--r-- 1 1001 users 11358 ene 26 2020 LICENSE
drwxr-xr-x 2 1001 users 4096 dic 29 2020 m4
-rw-r--r-- 1 1001 users 2612 dic 22 2020 Makefile.am
-rw-r--r-- 1 1001 users 30946 dic 29 2020 Makefile.in
-rw-r--r-- 1 1001 users 165 dic 11 2020 NOTICE
-rw-r--r-- 1 1001 users 6108 jul 10 2020 README
drwxr-xr-x 12 1001 users 4096 dic 29 2020 src
drwxr-xr-x 2 1001 users 4096 dic 29 2020 util
Aquí nos encontramos con un fichero configure
, que es típico de las compilaciones (se usa normalmente para verificar que las dependencias de la compilación están cubiertas, antes de empezar con la misma). Así pues, ejecutamos de la siguiente forma ese fichero (usamos --with-init-dir=/etc/init.d
para que genere un script de inicio en /etc/init.d
para que más tarde podamos configurar el inicio automático de forma más sencilla):
./configure --with-init-dir=/etc/init.d
------------------------------------------------
guacamole-server version 1.3.0
------------------------------------------------
Library status:
freerdp2 ............ yes
pango ............... yes
libavcodec .......... yes
libavformat.......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2
Init scripts: /etc/init.d
Systemd units: no
Type "make" to compile guacamole-server.
Había más salida en ese comando, pero he dejado lo más importante. Como vemos, tenemos cubiertas las dependencias. Así pues, hacemos lo que nos indica la salida del comando:
make
make install
Ahora tendremos que actualizar la caché de librerías instaladas del sistema y volver a cargar todas las unidades de systemd para hacer uso del nuevo servicio instalado:
ldconfig
systemctl daemon-reload
Ahora ya podemos habilitar el nuevo servicio creado usando systemctl
:
systemctl enable guacd.service
systemctl start guacd.service
Podemos ver el estado del servicio que acabamos de activar:
systemctl status guacd.service
● guacd.service - LSB: Guacamole proxy daemon
Loaded: loaded (/etc/init.d/guacd; generated)
Active: active (running) since Fri 2021-12-10 19:11:38 CET; 4s ago
Docs: man:systemd-sysv-generator(8)
Process: 22443 ExecStart=/etc/init.d/guacd start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 2340)
Memory: 9.9M
CPU: 12ms
CGroup: /system.slice/guacd.service
└─22446 /usr/local/sbin/guacd -p /var/run/guacd.pid
dic 10 19:11:38 guaca systemd[1]: Starting LSB: Guacamole proxy daemon...
dic 10 19:11:38 guaca guacd[22444]: Guacamole proxy daemon (guacd) version 1.3.0 started
dic 10 19:11:38 guaca guacd[22443]: Starting guacd:
dic 10 19:11:38 guaca guacd[22444]: guacd[22444]: INFO: Guacamole proxy daemon (guacd) version 1.3.0 started
dic 10 19:11:38 guaca guacd[22443]: SUCCESS
dic 10 19:11:38 guaca systemd[1]: Started LSB: Guacamole proxy daemon.
dic 10 19:11:38 guaca guacd[22446]: Listening on host 127.0.0.1, port 4822
Con esto hemos terminado de instalar la parte del servidor de guacamole. Ahora seguiremos con el servidor de aplicaciones java: Tomcat
En primer lugar, debemos instalar tomcat. Para ello ejecutamos lo siguiente:
apt install tomcat9
Una vez que ha finalizado la instalación, comprobamos que se puede acceder desde el navegador:
Ahora descargaremos el fichero .war
de la página oficial y lo movemos al directorio /var/lib/tomcat9/webapps/
, en el cual se extraerá automáticamente:
wget -O 'guacamole.war' 'http://archive.apache.org/dist/guacamole/1.2.0/binary/guacamole-1.2.0.war'
mv guacamole.war /var/lib/tomcat9/webapps/
Con esto habríamos terminado de instalar el cliente de guacamole, y podríamos acceder a él a través del puerto 8080, pero en lugar de esto, instalaremos un servidor web (Apache en este caso), el cual configuraremos como proxy para acceder al servicio de guacamole:
apt install apache2
Una vez instalado, configuramos el virtualhost de forma que actúe como proxy:
nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName www.dparrales.guacamole.org
ServerAdmin webmaster@localhost
DocumentRoot /var/lib/tomcat9/webapps/guacamole
Redirect 301 / /guacamole/
<Location /guacamole/>
Order allow,deny
Allow from all
ProxyPass http://localhost:8080/guacamole/ flushpackets=on
ProxyPassReverse http://localhost:8080/guacamole/
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Ahora habilitamos en módulo proxy y reniciamos el servicio de apache para que tengan lugar los cambios:
a2enmod proxy_http
systemctl restart apache2
Una vez que hemos terminado de configurar el servidor web, pasemos a configurar guacamole en sí, ya que hasta ahora, lo único que hemos hecho ha sido instalarlo. Para empezar hemos de crear el “GUACAMOLE_HOME”, que es el nombre del directorio donde guardaremos toda la configuración de guacamole y está ubicado en /etc/guacamole
:
mkdir /etc/guacamole
Dentro de este directorio tendremos que crear varios ficheros y directorios:
-guacamole.properties
: En él definiremos como se va a comunicar con el demonio que habilitamos anteriormente (guacd), además de como vamos a autentificar a los usuarios (primero usaremos la autentificación básica, y más adelante crearemos una base de datos y restringiremos el acceso a solo aquellos usuario que estén en esa base datos):
nano guacamole.properties
guacd-hostname: localhost
guacd-port: 4822
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml
-user-mapping.xml
: En él definiremos la lista de usuarios que tendrán acceso al servicio y la lista de conexiones que podrá realizar dicho usuario:
nano user-mapping.xml
<user-mapping>
<authorize
username="admin"
password="admin">
<connection name="Prueba1">
<protocol>ssh</protocol>
<param name="hostname">192.168.122.179</param>
<param name="port">22</param>
<param name="username">debian</param>
<param name="password">debian</param>
</connection>
<connection name="Servidor">
<protocol>ssh</protocol>
<param name="hostname">192.168.122.63</param>
<param name="port">22</param>
<param name="username">debian</param>
<param name="password">debian</param>
</connection>
</authorize>
</user-mapping>
Podemos encriptar las contraseñas, pero no lo he visto necesario para esta instalación. Ahora debemos reiniciar los servicios de tomcat y guacamole:
systemctl restart tomcat9 guacd
Ahora podemos probar el funcionamiento de guacamole de dos formas:
- Accediendo desde Tomcat:
- Desde el proxy que hemos configurado:
Con esto guacamole ya estaría funcionando correctamente, pero vamos a ir un paso más alla, y vamos a hacer que solo puedan acceder los usuario que registremos en nuestra base de datos. Así pues, lo primero es instalar un servidor de base de datos, en mi caso he elegido mariadb, pero guacamole también admite PostgreSQL y SQL Server.
apt install mariadb-server
mysql_secure_installation
Ahora crearemos la base de datos y un usuario con permisos sobre dicha base de datos:
mysql -u root -p
CREATE DATABASE guacamole_db;
CREATE USER 'guacamole_user'@'%' IDENTIFIED BY 'guacamole_user';
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'%';
FLUSH PRIVILEGES;
Ahora debemos descargarnos la extensión de guacamole para permitir la autentificación mediante una base de datos:
wget https://archive.apache.org/dist/guacamole/1.2.0/binary/guacamole-auth-jdbc-1.2.0.tar.gz
tar -zxf guacamole-auth-jdbc-1.2.0.tar.gz
Dentro de ese nuevo directorio nos encontramos lo siguiente para mariadb:
ls -l guacamole-auth-jdbc-1.2.0/mysql/
total 5588
-rw-r--r-- 1 1001 users 5716097 jun 26 2020 guacamole-auth-jdbc-mysql-1.2.0.jar
drwxr-xr-x 3 1001 users 4096 feb 1 2020 schema
Tenemos que descargarnos también el conector para nuestra base de datos y situarlo en el directorio /etc/guacamole/lib
(hay que crearlo si no lo está ya):
mkdir /etc/guacamole/lib
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.27.tar.gz
tar -zxf mysql-connector-java-8.0.27.tar.gz
cp mysql-connector-java-8.0.27/mysql-connector-java-8.0.27.jar /etc/guacamole/lib/
Ahora debemos mover el fichero guacamole-auth-jdbc-mysql-1.2.0.jar
que venía con la extensión al directorio /etc/guacamole/extensions
(hay que crearlo si no lo está ya):
mkdir /etc/guacamole/extensions
cp guacamole-auth-jdbc-1.2.0/mysql/guacamole-auth-jdbc-mysql-1.2.0.jar /etc/guacamole/extensions/
Ahora debemos introducir los esquemas que venían con la extensión en la base de datos:
cat *.sql | mysql -u root -p guacamole_db
Con esto se nos ha creado un esquema básico dentro de nuestra base de datos. Ahora tenemos que añadir al fichero guacamole.properties
las líneas adecuadas para que use el servidor de base datos que acabamos de crear:
# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: guacamole_user
Si además añadimos la siguiente línea, indicaremos que no queremos permitir el acceso a ningún usuario que no se encuentre registrado en la base de datos:
mysql-user-required: true
Como hemos añadido esa directiva, ya no podemos acceder con el usuario que indicamos antes en user-mapping.xml
:
Para acceder, tenemos que usar el usuario que se crea por defecto en el esquema: “guacadmin” con contraseña “guacadmin”:
Desde dentro del perfil ya podríamos hacer lo que queramos: crear conexiones, cambiar la contraseña, modificar los parámetros de las conexiones existentes, etc. También, al ser administradores, podríamos crear usuarios, grupos, etc.
Para finalizar con la instalación y configuración de guacamole, intentaremos acceder a una de las máquinas que hemos definido en las conexiones:
Podemos ejecutar comandos de forma normal:
Con esto hemos terminado de instalar y configurar Apache Guacamole.