Introducción
El objetivo de este tutorial es deshacerse de las conexiones SSH públicas y RDP públicas. Al colocar todo esto detrás de un cliente HTML5 muy conveniente, podemos agregar una capa de seguridad para acceder a nuestra nube.
Guacamole también registra cualquier acceso remoto, por lo que el acceso no autorizado se vuelve mucho más rastreable.
Nota: Para cifrar Let's (opción B) necesitamos un nombre de dominio. Si no tiene uno, puede omitir este paso y sólo hay que ejecutar la opción A .
Paso 1 - Preparando el sistema
Comience girando un VPS en su zona Vultr deseada. Un 1024 MB
VPS será suficiente, ya que Guacamole no es tan exigente.
Habilitar la IP privada
Comience habilitando la red privada en el VPS. Esto está bien documentado aquí
Preparando el firewall
Primero endurezcamos un poco la imagen. Y verifiquemos si la imagen aprovisionada se ha ufw
habilitado.
root@vultr:~# ufw status
Status: inactive
Por defecto está deshabilitado, por lo que necesitaremos agregar algunas reglas.
- Regla 1: ssh: puerto TCP 22
- Regla 2: http: puerto TCP 8080 (regla de prueba temporal para Guacamole)
Comencemos con la configuración de estos puertos.
ufw allow 22/tcp
ufw allow 8080/tcp
Luego habilite el firewall.
ufw enable
No se preocupe si recibe una advertencia. Si agregó puerto 22
, no enfrentará ningún problema.
root@vultr:~# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Una vez habilitado, solicite el estado del firewall y veremos la configuración de nuestro puerto.
ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
8080/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
Paso 2 - Instalando Guacamole
Instalar todas las dependencias
Antes de comenzar a instalar, necesitamos actualizar y actualizar el repositorio. Con paquetes como Tomcat
, que está basado en Java, hay un flujo constante de errores descubiertos y sus correcciones de errores asociadas. Por lo general, es una buena idea hacer esto primero en lugar de apresurarse directamente a nuestra instalación.
apt-get update
apt-get -y upgrade
El siguiente es todas las dependencias. Guacamole tiene bastantes de ellos. (Puede encontrar una lista completa de dependencias y su función aquí ). Continuemos instalándolos todos.
apt-get -y install build-essential tomcat8 freerdp libcairo2-dev libjpeg-turbo8-dev libpng12-dev libossp-uuid-dev libavcodec-dev libavutil-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvorbis-dev libwebp-dev mysql-server mysql-client mysql-common mysql-utilities libswscale-dev libvncserver-dev libpulse-dev libssl-dev
Cuando el instalador solicite una contraseña raíz de MySQL, proporcione una y asegúrese de anotarla. Usaremos esta contraseña más adelante para crear la base de datos Guacamole.
Descargando Guacamole
Ahora que tenemos todas nuestras dependencias, podemos continuar con la descarga de Guacamole. El guacamole en sí viene principalmente en forma de fuente, y no en binario. Primero nos moveremos a la /tmp
carpeta para evitar saturar otras partes del disco. Luego descargue todo el código fuente.
Hay cuatro archivos fuente / binarios para descargar:
guacamole-0.9.13-incubating.war
: Esta es la aplicación web. Un WAR
archivo es un paquete web comprimido que proporciona un único sitio web alojado en un sitio web de Tomcat
guacamole-server-0.9.13-incubating.tar.gz
: Este archivo proporcionará la guacd
aplicación de fondo. Esto crea las secuencias a través de RDP y SSH.
guacamole-auth-jdbc-0.9.13-incubating.tar.gz
: Utilizaremos una base de datos MySQL local, por lo que necesitamos el JDBC
conector asociado .
mysql-connector-java-5.1.43.tar.gz
: Sin un controlador de base de datos, el conector JDBC no hace nada. Este archivo lo proporciona el equipo de MySQL.
Nota: las descargas se resolvieron en el servidor más cercano .
cd /tmp
wget http://apache.belnet.be/incubator/guacamole/0.9.13-incubating/binary/guacamole-0.9.13-incubating.war
wget http://apache.cu.be/incubator/guacamole/0.9.13-incubating/source/guacamole-server-0.9.13-incubating.tar.gz
wget http://apache.cu.be/incubator/guacamole/0.9.13-incubating/binary/guacamole-auth-jdbc-0.9.13-incubating.tar.gz
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.43.tar.gz
Una vez que hayamos descargado todos estos archivos, extraiga los tar.gz
.
tar -xzvf guacamole-server-0.9.13-incubating.tar.gz
tar -xzvf guacamole-auth-jdbc-0.9.13-incubating.tar.gz
tar -xzvf mysql-connector-java-5.1.43.tar.gz
Compilando Guacamole
Ahora que hemos extraído todo el código fuente, hagamos algunas guacamole
carpetas, que serán utilizadas por la aplicación guacamole y sus dependencias.
mkdir -p /etc/guacamole/lib
mkdir -p /etc/guacamole/extensions
Todo está listo para nuestros nuevos binarios de Guacamole. Ahora podemos comenzar el proceso de compilación e instalación. Vaya a la carpeta extraída del Servidor Guacamole.
cd /tmp/guacamole-server-0.9.13-incubating
Configure la aplicación para crear también un init.d
archivo para ejecutarlo como un servicio más adelante.
./configure --with-init-dir=/etc/init.d
El comando debe terminar con un 'sí' en todas las bibliotecas y protocolos. Si no, regrese y verifique el comando apt-get para asegurarse de que no se haya perdido ningún paquete.
------------------------------------------------
guacamole-server version 0.9.13-incubating
------------------------------------------------
Library status:
freerdp ............. yes
pango ............... yes
libavcodec .......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebp ............. yes
Protocol support:
RDP ....... yes
SSH ....... yes
Telnet .... yes
VNC ....... yes
Services / tools:
guacd ...... yes
guacenc .... yes
Init scripts: /etc/init.d
Type "make" to compile guacamole-server.
A continuación, compile e instale el servidor Gucamole.
make && make install
Una vez hecho todo esto, ejecute ldconfig
para reconstruir la ruta de búsqueda para las bibliotecas que se han agregado.
ldconfig
Continúe usando la systemctl
configuración guacd
(Guacamole Daemon) para iniciar el arranque.
systemctl enable guacd
Los binarios de guacamole ya están instalados. Ahora prepararemos la aplicación web para Tomcat.
Comience moviendo el war
archivo a la guacamole
carpeta que acabamos de crear, una vez hecho esto, cree un enlace lógico en el directorio tomcat para apuntar a nuestro war
archivo.
cd /tmp
mv guacamole-0.9.13-incubating.war /etc/guacamole/guacamole.war
ln -s /etc/guacamole/guacamole.war /var/lib/tomcat8/webapps/
Entonces necesitamos el conector mysql y JDBC. Se necesita el controlador JDBC en la extensions
carpeta, el conector en la lib
carpeta.
cp mysql-connector-java-5.1.43/mysql-connector-java-5.1.43-bin.jar /etc/guacamole/lib/
cp guacamole-auth-jdbc-0.9.13-incubating/mysql/guacamole-auth-jdbc-mysql-0.9.13-incubating.jar /etc/guacamole/extensions/
Configurando Guacamole y Tomcat
Una vez que el conector y JDBC estén en su lugar, necesitamos editar el tocamt8
archivo. Este archivo contiene muchas tomcat8
configuraciones, y en nuestro caso necesitamos agregar la GUACAMOLE_HOME
variable al final del archivo.
nano /etc/default/tomcat8
Añadir con lo siguiente.
GUACAMOLE_HOME=/etc/guacamole
Creando la base de datos
Lo siguiente es crear la base de datos. Guacamole almacena su configuración de conexión en una base de datos, no dentro de un archivo.
Inicie sesión con el root password
que utilizó durante la instalación.
mysql -u root -p
El primer paso es crear una base de datos llamada 'guacamole_db'.
create database guacamole_db;
Luego ejecuta el create user
comando. Esto creará un usuario con una contraseña mysupersecretpassword
, este usuario solo podrá conectarse localhost
.
create user 'guacamole_user'@'localhost' identified by "mysupersecretpassword";
Otorgue CRUD
operaciones a este usuario para la base de datos guacamole_db
.
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
Vacíe los privilegios y salga del shell.
flush privileges;
exit
Termine agregando el esquema Guacamole a nuestra base de datos recién creada.
cat /tmp/guacamole-auth-jdbc-0.9.13-incubating/mysql/schema/*.sql | mysql -u root -p guacamole_db
Una vez hecho esto, necesitamos editar el guacamole.properties
archivo. Este archivo contiene nuestra configuración de servidor MySQL recientemente creada.
nano /etc/guacamole/guacamole.properties
Agregue los detalles y las credenciales de conexión de MySQL.
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: mysupersecretpassword
Termine creando un enlace simbólico a la carpeta compartida de tomcat, ya que aquí es donde el WAR
archivo buscará estas propiedades.
ln -s /etc/guacamole /usr/share/tomcat8/.guacamole
Probar la configuración
Termine reiniciando el tomcat8
servidor e inicie el guacd
demonio del servidor.
service tomcat8 restart
service guacd start
Puede verificar mediante el comando de estado.
service tomcat8 status
service guacd status
Ahora puedes navegar a tu VPS en el puerto 8080
http://<yourpublicip>:8080/guacamole/
Use el nombre de usuario guacadmin
y la misma contraseña guacadmin
. Esto le otorgará acceso a un servidor Guacamole vacío.
Haga clic en la esquina superior derecha de su nombre de usuario guacadmin
y seleccione Settings
. Una vez que esté en la página de configuración, vaya a la Users
pestaña y seleccione el usuario guacadmin
.
Ahora cambie su contraseña a otra o cree un nuevo usuario administrador y elimine la predeterminada guacadmin
.
Paso 3 - Ajuste fino y limpieza
Estos son los pasos finales: limpiar después de que haya terminado.
Elimine el código fuente descargado y los binarios de la /tmp
carpeta.
rm -rf /tmp/guacamole-*
rm -rf /tmp/mysql-connector-java-*
Además, haga que la aplicación web Guacamole sea la predeterminada. En el ecosistema tomcat, la aplicación que obtiene la ROOT
carpeta es la que se inicia de manera predeterminada cuando accede al sitio web.
Eliminar el antiguo ROOT
marcador de posición.
rm -rf /var/lib/tomcat8/webapps/ROOT
Y haga un enlace simbólico para que sea el servidor guacamole ROOT
.
ln -s /var/lib/tomcat8/webapps/guacamole /var/lib/tomcat8/webapps/ROOT
Esto requiere un reinicio de tomcat.
service tomcat8 restart
Paso 4 (opción A): solo se ejecuta en HTTP
- Si no va a utilizar los certificados Let's Encrypt y no utilizará un DNS, ejecute las acciones en este paso y luego vaya directamente al Paso 6. - Opción A
- Si desea crear un sitio más seguro y tiene un DNS listo, puede omitir esto e ir directamente a la opción B (Paso 5).
Edite el tomcat8/server.xml
archivo y cambie el puerto del conector.
nano /etc/tomcat8/server.xml
Busque el Connector port
.
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
Y reemplazar 8080
con 80
.
De forma predeterminada, tomcat no permite el enlace de puertos a continuación 1024
. Para habilitar esto, debemos decirle a tomcat8 que cree enlaces autenticados.
Edite el default
archivo de tomcat8 y descomente la AUTHBIND
línea y use la opciónyes
nano /etc/default/tomcat8
AUTHBIND=yes
Una vez hecho esto, intall authbind
.
apt-get install authbind
Configúrelo para que 80
tomcat8 pueda reclamar el puerto.
touch /etc/authbind/byport/80
chmod 500 /etc/authbind/byport/80
chown tomcat8 /etc/authbind/byport/80
Permita el puerto a 80
través del firewall y elimine la regla para 8080
.
ufw allow 80/tcp
ufw delete allow 8080/tcp
Reiniciar tomcat.
service tomcat8 restart
Eso es todo, ahora Guacamole debería estar funcionando en el puerto 80
.
Paso 5 (opción B) - Configuración de Nginx
Instalación y configuración de Nginx
Tomcat realmente no es una de las mejores y más robustas aplicaciones para usar certbot
. Por suerte Nginx es. Solo haremos un proxy de tomcat a Nginx. Utiliza la funcionalidad lista para usar de certbot a costa de sacrificar un poco de RAM.
apt-get install nginx
Una vez instalado, edite la configuración predeterminada.
nano /etc/nginx/sites-available/default
Elimine todas las configuraciones de ejemplo y agregue la siguiente configuración.
server {
listen 0.0.0.0:80;
proxy_request_buffering off;
proxy_buffering off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Esto creará un proxy para el sitio web que se ejecuta en 8080
. Reinicie Nginx y actívelo en el arranque.
systemctl restart nginx
systemctl enable nginx
Comprueba si todo funciona.
systemctl status nginx
Deshabilite el puerto de prueba 8080
y permita el tráfico en el puerto 80
.
ufw allow 80/tcp
ufw delete allow 8080/tcp
Instalar Let's Encrypt
Antes de que podamos usar certbot
, necesitamos agregar el correcto ppa
al sistema que contiene nuestros paquetes certbot.
add-apt-repository ppa:certbot/certbot
Presione " ENTER
" para aceptar el cambio de configuración.
Actualice apt
para reunir los nuevos paquetes.
apt-get update
Finalmente, instale el módulo Nginx para asignar los certificados.
apt-get -y install python-certbot-nginx
Configure Nginx para usar certificados
Configure el firewall para permitir HTTPS
.
ufw allow 443/tcp
Antes de que podamos solicitar nuevos certificados, necesitamos un nombre DNS.
nano /etc/nginx/sites-available/default
Agregue la siguiente server_name
configuración.
server_name rdp.example.com;
Cambie la configuración para reflejar esta nueva configuración.
server {
server_name rdp.example.com;
listen 0.0.0.0:80;
proxy_request_buffering off;
proxy_buffering off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Compruebe si todo funciona y reinicie Nginx.
nginx -t
service nginx restart
Ahora solicite un certificado con certbot.
certbot --nginx -d rdp.example.com
Proporcione su correo electrónico y acepte las preguntas formuladas por el instalador. (Puede elegir " No
" compartir su correo electrónico de forma segura). Certbot le preguntará automáticamente qué necesita hacer HTTPS
. Vamos a utilizar la opción 2: redirect to HTTPS
.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Lo último que haremos será actualizar los DH
parámetros. Estos son, por defecto, un poco débiles para los estándares de 2017.
Crea algunos nuevos.
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
A continuación, agréguelos al sitio predeterminado en Nginx.
nano /etc/nginx/sites-available/default
Agréguelos a la configuración del servidor.
server {
server_name rdp.example.com;
listen 0.0.0.0:80;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
proxy_request_buffering off;
proxy_buffering off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Verificar errores.
nginx -t
Aplique los cambios reiniciando el servidor.
service nginx restart
Limpiar la vieja 8080
regla
ufw delete allow 8080/tcp
Nota: si recibe un "502 Bad Gateway", necesitará reiniciar tomcat8 .
service tomcat8 restart
Renovación automática de certificados
Encriptemos los certificados requieren renovación. Podemos crear un trabajo cron para esto. Comience editando el crontab
.
crontab -e
Agrega la siguiente línea.
00 2 * * * /usr/bin/certbot renew --quiet
Esto verificará a las 2:00 a.m. si algún certificado requiere una renovación y los renovará si lo hacen.
Paso 6: probarlo todo
Vaya a su servidor de Guacamole (ya sea http://<ip>/
o https://rdp.example.com)
).
Para esta prueba, necesitará dos instancias más: una máquina virtual Linux y otra Windows Server 2012 R2 con una IP privada habilitada en ambas.
Agregar la conexión RDP de Windows
Haz clic en " username
" en la esquina superior derecha y ve a " Settings
". Luego vaya a " Connections
" y seleccione " New Connection
".
Complete la siguiente configuración (puede dejar los otros valores predeterminados).
Name: Windows Server 2012 R2
Location: ROOT
Protocol: RDP
Maximum number of connections: 1
Maximum number of connections per user: 1
Parameters > Hostname: 10.99.0.12
Parameters > Port: 3389
Username: Administrator
Password: <password> (provided by Vultr)
Security mode: Any
Ignore server certificate: <checked>
Presione " save
" y regrese a la pantalla de inicio. Ahora puede hacer clic en la Windows Server 2012 R2
conexión " " y se ejecutará RDP en esta máquina.
Agregar la conexión SSH de Linux
Presione " Ctrl+Shift+Alt
". Esto abrirá el menú al costado. Aquí puede desconectar o realizar otras tareas administrativas para Guacamole.
Haz clic username
en la parte superior del menú y ve a " Settings
". Luego vaya a la Connections
pestaña " " y seleccione " New Connection
".
Complete la siguiente configuración (puede dejar los otros valores predeterminados).
Name: Linux
Location: ROOT
Protocol: SSH
Maximum number of connections: 5
Maximum number of connections per user: 2
Parameters > Hostname: 10.99.0.11
Parameters > Port: 22
Username: root
Password: <password> (provided by Vultr)
Presione " save
" y regrese a la pantalla de inicio. Ahora puede hacer clic en esta conexión recién creada y conectarse a su servidor Linux a través de SSH.
Conclusión
Ahora tiene una puerta de enlace web RDP / SSH HTML5. Ahora puede firewall el acceso público RDP y SSH de su plataforma y acceder a su entorno desde cualquier navegador moderno. Para obtener más información sobre lo que Guacamole puede ofrecer, hay un excelente video que muestra todas las posibilidades de la plataforma aquí .