Bluemix™ Secure Gateway 安全网关是 Bluemix 提供的一种集成服务,当用户无法直接连接存储在企业内部或云端的资源时,可以通过 Bluemix Secure Gateway 与资源之间建立安全传输通道,以达到访问数据资源的目的。
Bluemix Secure Gateway 有两种应用模式,这取决于用户想要访问的资源位置,资源在本地为 on-premises 模式,资源在云端为 on-cloud 模式。无论资源是在本地或是云端,都可以利用 Secure Gateway 建立安全访问通道。本文以 on-cloud 模式为例。现有大多数的文档或者文章都将目光关注于 Bluemix 上部署的应用通过 Secure Gateway 来访问云下的资源,也就是 resource on-premises 的场景。本文以 Cloud 模式为例,描述如何通过 Secure Gateway 来使得企业内部程序访问云上的资源。
云数据库的广泛使用使得企业可以方便的把自己的数据资源托管在云端,例如 Bluemix Cloudant Database。另外,也可以将资源以 API 或者微服务的方式发布在 Bluemix 云端。这些资源和微服务可以方便的被企业部署在 Bluemix 上的应用所使用。但是对于企业内部服务器,往往被企业内部防火墙隔离以保证其安全,因此无法直接跨过防火墙与云上的资源和服务进行交互。
为了使企业内部服务器可以安全的访问云上资源和服务,本文我们将介绍如何用 Bluemix Secure Gateway 建立安全通道使得内部服务器可以直接访问外网资源。本文的方案适用于局域网内完全受限的服务器(外网完全不可访问),通过配置与局域网某些或某个安装了 Secure Gateway 客户端的服务器进行安全通信,进而通过 Secure Gateway 与指定的云上资源交换数据。如图 1.
本文所有的工作在 IBM 开发云平台 Bluemix™(https://console.ng.bluemix.net)上进行,因此需要首先注册一个 Bluemix 账户,登陆 Bluemix 后,点击 Bluemix 首页右上角的 catalog,之后选择 integrate, 点击 Secure Gateway,如图 2.
采用默认设置,点击 create,这样就创建了一个 Secure Gateway 实例。选择 Edit Name,改为 SGdemo。如图 3.
点击 Add Gateway 添加新的 Gateway。如图 4,图 5。
点击进入 Gateway,进行服务端配置。点击 Add Destination,选择 Cloud 模式。因为我们要访问的资源位于云端。如图 6,图 7。
点击 Next,进入下一项配置。填写要访问的 resource 所在主机的 hostname 及 port,本文实例中使用云端的 Cloudant DB 作为外网资源,其配置参数为
hostname: 6ec235f4-25b7-4ce8-a4bc-bb141a888d87-bluemix.cloudant.com port:443
client port 是客户端电脑端口,客户端可以通过该端口访问 resource,本文使用 7000 作为客户端访问端口,用户可以自定义。如图 8.
点击 Next,进入下一项配置。选择客户端访问目标资源使用的安全协议,这里选 HTTP 协议。如图 9.
点击 Next,进入下一项配置。选择目标资源的安全协议,根据本文实际情况选择 Destination-Side,点击 UPLOAD CERTIFICATE 上传目标资源的网站证书(https://6ec235f4-25b7-4ce8-a4bc-bb141a888d87-bluemix.cloudant.com /dashboard.html)注意要上传完整的证书链,只上传子证书 Secure Gateway 无法识别会报错。如图 10.
证书下载方法,首先浏览器访问链接,点击浏览器左上方 URL 前面的锁形标记,接着点击 View Certificate,点击 Details,export 下载证书,文件名以.pem 做为后缀名,Format 要选择 certificate with chain。这样下载的证书就可以直接使用了。如图 11,图 12.
点击 Next,给 destination 命名 CloudantDB。如图 13.
点击 Finish,这样一个的 destination 就添加完了,也就是该 Secure Gateway 的目标资源。CloudantDB 图标右上角有一个红色小手代表禁止访问的意思,这点我们后文再讲。 如图 14.
Gateway 的控制面板上点击 Add Clients 添加客户端。客户端连接 Gateway 有三种方式 IBM Installer、Docker、IBM DataPower,这里我们选用第一种,下载客户端对应的 Software Installer 安装文件,在客户端解压。如图 15.
命令行里运行 secgw.command,依次输入 Gateway ID、Security Token,这样就连接成功了。如图 16.
Secure Gateway 界面上会显示 connected。继续在 command line 窗口中输入命令,把目标资源的主机名和端口添加到 Secure Gateway 的访问控制列表里。
acl allow hostname:port
CloudantDB 图标右上角红色小手也就消失,表示客户端已经与其连通。如图 17.
这样我们就可以通过访问客户端特定端口而访问目标资源了。
本文以在云端的 Cloudant 数据库作为目标资源,实现在客户端使用 nodejs 编写的 application 访问该资源,并创建一个新的文档。
Project 的 Github 地址为 https://github.com/wanglei369235/SecureGateway.git ,下载该工程修改 example/crud.js 文件中 cloudant 变量值:
cloudant = Cloudant({url:"http://6ec235f4-25b7-4ce8-a4bc-bb141a888d87-bluemix:c433e08139804fd9822d6db3016febe60bb51726a660e7f3dd8142f83c47cfc8@127.0.0.1:7000"})
clone 到本地后,在 command line 里执行命令
cd example npm install node crud.js
登录 CloudantDB 数据库的控制界面,可以看到新添加的数据库实例 cruddemo,说明本地的 app 成功连接并操作了云端的 CloudantDB 数据库。如图 18.
服务端的管理监控在 Secure Gateway server 端的控制面板中完成。如图 19.
点击 Gateway 的图标,就进入 Secure Gateway 的监控面板,在这里可以看到服务中一共有多少个 gateway,是否开启,每一个 Gateway 包含几个 destination,每一个 destination 中的具体信息:
还有一个图表可以显示每一个网关在近十二小时内的数据流量。该数据每 25 秒更新一次。图表中每一个 gateway 用不同的颜色标出,点击可以单独查看每一个 gateway 的数据情况。
客户端连接建立以后,就可以在安装了 Secure Gateway 客户端的服务器上通过访问 localhost:9003/dashboard 登陆客户端控制面板,在此可以查询该客户端连接的相关数据信息,并对其进行设置。如图 20.
Access Control List 访问控制列表中可以添加删除访问白名单和黑名单,以控制通过该客户端的访问权限。如图 21.
View logs 实时显示连接过程中的 log,提供下载功能,并且可以自定义显示的 log 级别。如图 22.
Connection Info 显示该客户端连接的详细信息。数据流量,总连接数和活跃连接数,以及对应的服务端 Gateway 的信息。如图 23.
Secure Gateway 集成了 TLS 协议来对服务器进行身份验证、对传输数据进行加密以确保传输安全。传输层安全协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议 (TLS Handshake)。
TLS 记录协议位于 TLS 握手协议的下面,在可靠的传输协议(如 TCP/IP)上面。TLS 记录协议的一条记录包含长度字段、描述字段和内容字段。TLS 记录协议处理数据的加密,即记录协议得到要发送的消息之后,将数据分成易于处理的数据分组,进行数据压缩处理(可选),计算数据分组的消息认证码 MAC, 加密数据然后发送数据;接收到的消息首先被解密,然后校验 MAC 值,解压缩,重组,最后传递给协议的高层客户。记录协议有四种类型的客户:握手协议、警告协议、改变密码格式协议和应用数据协议。通常使用一个对称算法,算法的密钥由握手协议提供的值生成。
TLS 握手协议处理对等用户的认证,在这一层使用了公共密钥和证书,并协商算法和加密实际数据传输的密钥,该过程在 TLS 记录协议之上进行。TLS 握手协 议是 TLS 协议中最复杂的部分,它定义了 10 种消息,客户端和服务器利用这 10 种消息相互认证,协商哈希函数和加密算法并相互提供产生加密密钥的机密数 据。TLS 记录协议会在加密算法中用到这些加密密钥,从而提供数据保密性和一致性保护。
Secure Gateway 具体提供了以下连接方式来供用户选择:
TCP 传输控制协议。不提供身份验证,应用程序可以直接通过 Secure Gateway 与数据资源通信而不需要验证任何证书
TLS:Server Side 传输层安全协议。 Secure Gateway 服务端需要提供证书来证明其身份,并且需要将证书添加到应用程序 truststore 中。
TLS:Mutual Auth 除了服务端提供的证书外,还需要上传一份自签名证书 。
另外还有三种 HTTP、HTTPS、HTTPS:Mutual Auth 都是建立在以上三种传输层协议之上的应用层协议。
本文实例中,本地 Nodejs 应用访问云端 resourse,Nodejs 与 Secure Gateway 客户端以 HTTP 方式连接,可以直接传输数据;Secure Gateway 服务端与云端 resource 连接采用 HTTPS 的方式,连接资源时需要首先验证资源的证书,同时依靠证书中的公钥对传输的数据进行非对称加密,保证数据传输安全。
Secure Gateway 作为 IBM 公有云 Bluemix 上的一种集成类服务,可以为用户访问各类资源提供可靠传输通道,同时集成 TLS 协议,加密数据,保证传输的安全性。能够使企业内部应用安全的访问云上的资源。让企业应用可以自如的使用自己的数据中心和云上的数据。