在Ubuntu 16.04 LTS上使用Guacamole创建HTML 5 RDP/SSH前端

・25 分钟阅读

介绍

本教程的目标是摆脱公开的SSH和RDP连接。通过将这一切放在一个非常方便的HTML5客户端后面,我们可以添加一层安全性来访问我们的云。

Guacamole还记录任何远程访问,因此未经授权的访问变得更加可追溯。

注意:对于 Let's encrypt(选项B),我们需要一个域名。如果你没有域名,你可以跳过这一步,只需执行选项A。

步骤1准备系统

一个1024 MB的VPS就足够了,因为Guacamole要求不苛刻。

启用专用IP

首先启用VPS上的专用网络。

准备防火墙

检查已部署的镜像是否启用了ufw 。


root@vultr:~# ufw status
Status: inactive

默认情况下它是禁用的,所以,我们需要添加一些规则。

  • 规则1:ssh :TCP端口22
  • 规则2:http:TCP端口8080(Guacamole的临时测试规则)

让我们从配置这些端口开始。


ufw allow 22/tcp
ufw allow 8080/tcp

下一步启用防火墙。

 
ufw enable

 

如果收到警告,请不要担心,如果添加了端口22,则不会遇到任何问题。


root@vultr:~# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

一旦启用,请求防火墙的状态,会看到我们的端口配置。

 
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)

步骤2安装Guacamole

安装所有依赖项

在开始安装之前,我们需要更新和升级repo ,


apt-get update
apt-get -y upgrade 

Guacamole有很多依赖,(一个完整的依赖列表及功能可以在这里中找到),让我们继续安装它们。


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

当安装程序要求一个MySQL root密码时,请提供一个,并确保记录它,稍后我们会使用此密码创建Guacamole数据库。

下载Guacamole

既然我们有了所有的依赖项,我们可以继续下载Guacamole,Guacamole本身是源代码形式的,而不是二进制的,然后下载所有的源代码。

有四个源/二进制文件可供下载:

  • guacamole-0.9.13-incubating.war :这是web应用程序,WAR文件是一个压缩的Web包,提供在Tomcat网站上托管的单个网站,
  • guacamole-server-0.9.13-incubating.tar.gz :此文件会提供后端guacd应用程序,这将通过RDP和SSH创建流,
  • guacamole-auth-jdbc-0.9.13-incubating.tar.gz :我们使用本地的MySQL数据库,所以我们需要相关的JDBC连接器,
  • mysql-connector-java-5.1.43.tar.gz :没有数据库驱动程序,JDBC连接器不执行任何操作,这个文件是由MySQL团队自己提供的,

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

下载完所有这些文件后,提取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

编译Guacamole

现在我们已经提取了所有源代码,让我们创建一些guacamole文件夹,这些文件夹将由guacamole 应用程序及其依赖项使用。


mkdir -p /etc/guacamole/lib
mkdir -p /etc/guacamole/extensions

现在我们可以开始编译和安装进程了,切换到Guacamole Server文件夹。


cd /tmp/guacamole-server-0.9.13-incubating

将应用程序配置在init.d文件以作为服务运行。


./configure --with-init-dir=/etc/init.d


------------------------------------------------
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.

接下来编译并安装Gucamole服务器。


make && make install

完成这些操作后,运行ldconfig以重新构建库的搜索路径。

 
ldconfig

 

继续使用systemctl设置guacd (Guacamole守护进程)在开机时自动启动。


systemctl enable guacd

Guacamole二进制文件现已安装。现在我们为Tomcat准备好web应用程序。

首先将WAR文件移动到刚刚创建的guacamole文件夹,一旦完成这个操作,就在tomcat目录中创建一个逻辑链接,指向我们的WAR文件。


cd /tmp
mv guacamole-0.9.13-incubating.war /etc/guacamole/guacamole.war
ln -s /etc/guacamole/guacamole.war /var/lib/tomcat8/webapps/

然后我们需要mysql连接器和JDBC ,在extensions文件夹中需要JDBC驱动程序,lib文件夹中的连接器。


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/

配置Guacamole和Tomcat

一旦连接器和JDBC就绪,我们需要编辑tocamt8文件,这个文件包含许多tomcat8设置,在我们的例子中,我们需要在文件的末尾添加GUACAMOLE_HOME变量。


nano /etc/default/tomcat8

附加以下内容。


GUACAMOLE_HOME=/etc/guacamole

创建数据库

下一步是创建数据库,Guacamole将它的连接配置存储在数据库中,而不是存储在文件中。

使用安装过程中使用的root password登录。


mysql -u root -p

第一步是创建一个名为'guacamole_db'的数据库。


create database guacamole_db;

然后运行create user命令,这将创建一个密码mysupersecretpassword用户,这个用户将只能从localhost连接。


create user 'guacamole_user'@'localhost' identified by"mysupersecretpassword";

CRUD操作授予此用户以获得数据库guacamole_db


GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';

刷新权限并退出shell 。


flush privileges;
exit

最后将Guacamole架构添加到我们新创建的数据库中。


cat /tmp/guacamole-auth-jdbc-0.9.13-incubating/mysql/schema/*.sql | mysql -u root -p guacamole_db

完成这个操作后,我们需要编辑guacamole.properties文件,这个文件包含我们最近创建的MySQL服务器配置。


nano /etc/guacamole/guacamole.properties

附加MySQL连接详细信息和凭据。


mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: mysupersecretpassword

通过创建指向tomcat共享文件夹的符号链接完成,因为这是WAR文件会搜索这些属性的地方。


ln -s /etc/guacamole /usr/share/tomcat8/.guacamole

测试设置

通过重新启动tomcat8服务器,并且启动guacd服务器守护进程。


service tomcat8 restart
service guacd start

你可以使用状态命令进行验证。


service tomcat8 status
service guacd status

现在你可以在端口8080上浏览你的VPS


http://<yourpublicip>:8080/guacamole/

使用用户名guacadmin和相同的密码guacadmin ,这将授予你访问空Guacamole服务器的权限。

点击你的用户名guacadmin上的右上角,选择Settings ,在设置页中,转到Users选项卡,并且选择用户guacadmin

现在更改密码新的管理用户,并删除默认的guacadmin 。

步骤3微调和清理

以下是最后的步骤: 完成后清理。

/tmp文件夹中删除下载的源代码和二进制文件。


rm -rf /tmp/guacamole-*
rm -rf /tmp/mysql-connector-java-*

同时,让Guacamole网站应用程序成为默认的,在tomcat生态系统中,ROOT文件夹的应用程序是默认启动的网站应用程序。

删除旧的ROOT占位符。


rm -rf /var/lib/tomcat8/webapps/ROOT

并为guacamole服务器做一个符号链接作为ROOT。


ln -s /var/lib/tomcat8/webapps/guacamole /var/lib/tomcat8/webapps/ROOT

这需要tomcat重启。


service tomcat8 restart

步骤4选项A仅在HTTP上运行

  • 如果你不打算使用Let's Encrypt证书而不使用DNS请执行此步骤中的操作,然后直接转到步骤6方案A,
  • 如果你想创建一个更安全的站点,你有一个DNS准备就绪,你可以跳过这个选项B(步骤5 ),

编辑tomcat8/server.xml文件,并且更改连接器端口。


nano /etc/tomcat8/server.xml

搜索Connector port


<Connector port="8080" protocol="HTTP/1.1"
 connectionTimeout="20000"
 URIEncoding="UTF-8"
 redirectPort="8443" />

80替换8080

默认情况下,tomcat不允许在1024下面绑定端口,要启用此功能,我们需要告诉Tomcat8创建经过身份验证的绑定。

编辑tomcat8的default file,并且取消对authbind line的注释然后,使用选项yes


nano /etc/default/tomcat8


复制代码 AUTHBIND = YES

完成后请输入authbind


apt-get install authbind

对它进行配置使端口80 可以由Tomcat8声明。


touch /etc/authbind/byport/80
chmod 500 /etc/authbind/byport/80
chown tomcat8 /etc/authbind/byport/80

允许端口80通过防火墙,并删除8080规则。


ufw allow 80/tcp
ufw delete allow 8080/tcp

重启tomcat 。


service tomcat8 restart

就是这样,现在Guacamole应该在端口80上运行,

步骤5选项B设置nginx

Nginx的安装和配置

Tomcat不是与certbot一起使用的最好和最强大的应用程序。但Nginx是,我们只要tomcat代理到Nginx,牺牲一点内存为代价就可以使用certbot的开箱即用功能。


apt-get install nginx

安装后,编辑默认配置。


nano /etc/nginx/sites-available/default

删除所有例子配置并添加以下配置。


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;
 }
}

这为在8080运行的网站创建一个代理,重新启动Nginx,并在启动时启用它。


systemctl restart nginx
systemctl enable nginx

检查一切是否正常。


systemctl status nginx

禁用测试端口8080,并且允许端口80上的流量。


ufw allow 80/tcp
ufw delete allow 8080/tcp

安装let's Encrypt

在我们可以使用certbot 之前,我们需要将正确的ppa 添加到包含certbot包的系统中


add-apt-repository ppa:certbot/certbot

按"ENTER"接受配置更改。

更新apt以收集新软件包。

 
apt-get update

 

最后,安装Nginx模块来分配证书。


apt-get -y install python-certbot-nginx

将Nginx配置为使用证书

配置防火墙以允许HTTPS

 
ufw allow 443/tcp

 

在我们可以申请新证书之前,我们需要一个DNS名称。


nano /etc/nginx/sites-available/default

添加以下server_name设置。


server_name rdp.example.com;

更改配置以反映此新设置。


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;
 }
}

检查所有是否正常工作,并且重新启动Nginx 。


nginx -t
service nginx restart

现在用certbot申请证书。


certbot --nginx -d rdp.example.com

提供你的电子邮件,并且同意安装者提出的问题,我们将使用选项2 redirect 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

我们要做的最后一件事是更新DH参数。

新建一些新的。


openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

接下来,将它们添加到Nginx中的默认站点。


nano /etc/nginx/sites-available/default

将它们添加到服务器配置。


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;
 }
}

检查错误。

 
nginx -t

 

通过重新启动服务器应用更改。


service nginx restart

清除旧的8080规则


ufw delete allow 8080/tcp

注意:如果你应该收到一个"502 Bad Gateway",你需要重新启动tomcat8.


service tomcat8 restart

自动续订证书

let's Encrypt证书需要续订,我们可以为此创建一个cron作业,从编辑crontab开始。

 
crontab -e

 

添加以下行。


00 2 * * * /usr/bin/certbot renew --quiet

这将在凌晨2:00检查是否有证书需要续订,如果有的话会续订。

第6步全面测试

转到你的菜单菜单服务器(http://<ip>/https://rdp.example.com) )。

对于此测试,你还需要另外两个实例: 一个Linux VM和另一个Windows Server 2012 R2,两者都启用了专用IP。

添加Windows RDP连接

点击右上角的"username",转到"Settings"。 然后转到"Connections",并且选择"New Connection"

填写下列设置(你可以保留其他默认值)。


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 )
Security mode: Any
Ignore server certificate: <checked>

按"save"键并返回主屏幕,现在你可以点击" Windows Server 2012 R2 "连接并将RDP发送到这台机器。

添加Linux SSH连接

按"Ctrl+Shift+Alt"键,这会弹出菜单中的菜单,在这里,你可以断开或执行Guacamole的其他管理任务。

单击菜单顶部的username,然后转到"Settings",然后转到"Connections"选项卡,并且选择"New Connection"。

填写下列设置(你可以保留其他默认值)。


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 )

按"save"键并返回主屏幕,现在你可以单击这个新建的连接,并通过SSH连接到你的Linux服务器。

结束语

你现在有一个Web RDP/SSH HTML5网关。现在,你可以阻止公开的RDP和SSH访问,并从任何现代浏览器访问你的环境。

Hrh profile image