部署背景需求
由于众所周知的安全考虑,不想对公网暴露 Domino http 服务器的地址?
多个 Domino 服务器能不能对外只用一个地址?
在部署 Domino 的情况中,这种需求越来越多。而这些可以通过安装 Apache http 服务器, 把它作为 Domino 的逆向代理(reverse proxy)来实现。
为什么选择 Apache http 服务器
首先,它是一个开源的项目,文档源码都可以参考到。其次,它已经被广泛使用,健壮性有口皆碑。最后,安装配置很简单,在 Windows 上不到 10 分钟就能完成。
逆向代理是 Apache 服务器的一个应用,它处理来自 internet 上客户端的连接请求,然后将请求转发给内部网络上的服务器,并将从内部网络上服务器上得到的结果返回给 internet 上请求连接的客户端。 可参看以下示意图:
图 1. 逆向代理示意图
上图中 Apache 逆向代理服务器上没有保存任何网页的真实数据,所有的内容都来来自于在内部的 Domino 服务器上。因此对逆向代理服务器的攻击并不会使得 Domino 服务器上的数据遭到破坏,这样就增强了 Web 服务器的安全性。
实际部署中,通常逆向代理位于防火墙外,Domino 服务器位于防火墙里,能受到防火墙的安全保护。
Apache 逆向代理还可以根据需求配置容许的缓存数据,比如图片。还可以配置动态负载平衡,等等其他一些特性,但这些特性不在本文介绍范围内。
安装 Apache Web 服务器
我们以 Windows 为例。
首先去在 apache 的网站 http://httpd.apache.org/download.cgi 下载一个稳定版 Windows 安装包。下载完后,点击执行安装,一路使用默认的配置,只是在填 host 名字的时候,填上实际安装机器对外的 host 名字,比如我们这里填:bj.cn.ibm.com.
安装完后,窗口右下角会有一个图标 ,这时 apache http 服务器已经自动运行了。尝试打开浏览器,输入 http://dev.cn.ibm.com, 回车,会打开默认的网页,表示 apache 服务器工作正常。
如果是测试配置环境,并没有真正的对外 host 名字,可以在 c:windowssystem32drivesetchosts 里面加上:
ip 地址 hostname
如果机器的 ip 地址是 192.168.0.11,就可以加上如下一行:
192.168.0.11 bj.cn.ibm.com
Hostname 可以是多个。若多个 hostname 实际使用同一个 ip,比如下面就是 2 个 host 共享一个 ip 地址:
192.168.0.11 bj.cn.ibm.com sh.cn.ibm.com
回页首
逆向代理配置
下面我们来看具体怎么和 Domino 服务器结合,配置逆向代理。现在假设我们有 2 台 domino 服务器,他们属于是一个集群(cluster)。
其中一台 host 名字是:inotesBJ.cn.ibm.com
另一台 host 名字是:inotesSH.cn.ibm.com
Apache 服务器就是上面刚刚安装好的。
在配置好后,internet 用户直接使用 bj.cn.ibm.com 来透明访问 inotesBJ.cn.ibm.com; 或者使用 sh.cn.ibm.com 来透明访问 inotesSH.cn.ibm.com。他们实际并不知道 inoteBJ/inotesSH.cn.ibm.com 的存在。
我们知道 Domino Web 服务支持 http 和 htpps 两种方式,https 的逆向代理配置稍微复杂一些,下面先 http 的配置开始。
Http 请求配置
安装好 Apache Web 服务器后,对 http 请求,它默认使用的是 80 端口。而 Domino 默认使用的 http 端口也是 80,所以为了避免冲突,把 domino 的端口改为 8080.(提示一下,这一步可以一并把 Domino https 默认的端口号 443 改为 4433.)
如下图所示:
图 2. 修改 Domino http(s) 默认端口号
修改结束后,保存,再通过 Admin 控制台,重启一下 http 服务。
接下来打开 apache 应用程序目录,下面有个 conf 子目录,用文本编辑器打开这个目录下的 httpd.conf. 这个文件存放了 Apache 服务器的所有配置信息,为了增加逆向代理支持,我们在文件的末位加上:
Include conf/myproxy.conf
然后在同一个目录下新建一个文件 myproxy.conf,里面加上如下配置。
LoadModule headers_module modules/mod_headers.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so <VirtualHost *:80> ServerName bj.cn.ibm.com ProxyRequests Off ProxyPassReverse / http://inotesbj.cn.ibm.com:8080/ <Location / > ProxyPass http:// inotesbj.cn.ibm.com:8080/ </Location> </VirtualHost> <VirtualHost *:80> ServerName sh.cn.ibm.com ProxyRequests Off ProxyPassReverse / http://inotesSH.cn.ibm.com:8080/ <Location / > ProxyPass http:// inotesSH.cn.ibm.com:8080/ </Location> </VirtualHost>
|
保存一下所做的修改,再重启一下 Apache 服务器。 试着在浏览器里面输入 bj.cn.ibm.com, 就会发现已经进入 inotesbj.cn.ibm.com 的登录界面; 相应的试着输入 sh.cn.ibm.com, 就会发现进入 inotesSH.cn.ibm.com 的登录页面。
很简单,http 的逆向代理就配好了。接下来是 https 的逆向代理配置。
Https 请求配置
1.Https 是基于 SSL 的,这意味着作为逆向代理的 Apache 服务器需要一个 SSL 的证书, 而 Domino 使用的证书是 .kyr 格式的,这种格式 Apache 服务器无法识别。所以需要一个工具将 .kyr 格式转换成 Apache 能读取的证书格式(.cert 和 .key)。然而 Domino 并没有自带的内建命令或者工具能把 .kyr 格式转换成任何其他格式。
所幸 IBM 提供了一个叫 ikeyman 的程序, 它是 IBM http server 和 Websphere 的一部分,用它可以打开 .kyr 文件,然后导出成 .pkcs12 格式。如果没有 IBM http server 和 Websphere,可以从下列 ftp 服务器上下载:ftp://ftp.software.ibm.com/software/lotus/tools/Domino/gsk5-ikeyman.zip
下载完成后,根据 readme 里面描述的步骤,打开 ikeyman(注意,ikeyman 不能在 Win7 64 位上运行),在图形用户界面下,先打开 .kyr 文件,然后通过此程序的 import/Export 按钮,选择把 .kyr 导出成 .pkcs12 格式的文件,后缀为 .p12,这期间需要输入生成 .kyr 时设置的密码。 iKeyman 不能直接导出成 Apache 可读的格式,但 .p12 格式已经是个中间格式了。这里我们把导出文件名叫 server.p12.
2. 从 www.openssl.org上下载 openssl,用以下命令将步骤 1 的 .p12 文件转换成 .cert 和 .key 文件。
openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.certopenssl pkcs12 -in server.p12 -nocerts -nodes -out server.key
转换结束后,拷贝这 2 个文件到 Apache 安装目录下。3. 下面要修改 myproxy.conf:
首先在前面 http 配置过程新建的 myproxy.conf 中 , 在 loadModule 下面加上如下 2 个 module。
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so 再加上增加监听 https 默认端口 443, 如下:
Listen 443
注意,请确保 Domino 已经完成图 2 所示的修改,把 Domino 默认的 SSL 端口改为非 443,如上图为 4433.
4. 接着修改 VirtualHost 部分, SSLCertifcateFile 指向刚刚拷过来的 server.cert 路径,这个路径是相对于 apache 可执行程序的路径。SSLCertifcatekeyFile 指向 server.key 的相对路径。
<VirtualHost *:443> ServerName bj.cn.ibm.com:443 SSLEngine On SSLCertificateFile conf/ssl/server.cert SSLCertificateKeyFile conf/ssl/server.key SSLProxyEngine on ProxyRequests Off KeepAlive off ProxyPassReverse / https://inotesbj.cn.ibm.com:4433/ <Location / > ProxyPass https://inotesbj.cn.ibm.com:4433/ </Location> </VirtualHost>
|
对于 inotesSH.cn.ibm.com, 重复以上步骤,将它的 .kyr 文件转换成 .cert 和 .key 文件,增加一个 VitualHost 部分,对应填上相应的数据。
5. 最后重启一下 Apache 服务器。试着输入 https://bj.cn.ibm.com,将会出现登陆 intoesbj.ibm.com.cn 的页面,同理对于 sh.cn.ibm.com.
终于 Domino 服务器的 https 逆向代理也配好了。
最好这是一份完整的,仅供参考的 myproxy.conf.
配置清单 :
####################################################### # Before attempting to use your new reverse-proxy # # 1: Stop the Apache server # 2: Start Apache server # ####################################################### LoadModule headers_module modules/mod_headers.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule ssl_module modules/mod_ssl.so LoadModule proxy_connect_module modules/mod_proxy_connect.so CookieLog logs/cookies.log Listen 443 <IfModule ssl_module> SSLMutex default SSLRandomSeed startup builtin SSLRandomSeed connect builtin SSLSessionCache none </IfModule> <VirtualHost bj.cn.ibm.com:443> ServerName bj.cn.ibm.com:443 SSLEngine On SSLCertificateFile conf/ssl/server.cert SSLCertificateKeyFile conf/ssl/server.key SSLProxyEngine on ProxyRequests Off <Proxy *> Order deny,allow Allow from 127.0.0.1 </Proxy> KeepAlive off ProxyPassReverse / https://inotesbj.cn.ibm.com:4433/ ProxyPassReverseCookieDomain inotesbj.cn.ibm.com .cn.ibm.com <Location / > ProxyPass https:// inotesbj.cn.ibm.com:4433/ </Location> </VirtualHost> <VirtualHost sh.cn.ibm.com:443> ServerName sh.cn.ibm.com:443 SSLEngine On SSLCertificateFile conf/ssl/server2.cert SSLCertificateKeyFile conf/ssl/server2.key SSLProxyEngine on ProxyRequests Off <Proxy *> Order deny,allow Allow from 127.0.0.1 </Proxy> KeepAlive off ProxyPassReverse / https://inotessh.cn.ibm.com:4433/ ProxyPassReverseCookieDomain inotessh.cn.ibm.com .cn.ibm.com <Location / > ProxyPass https:// inotessh.cn.ibm.com:4433/ </Location> </VirtualHost> <VirtualHost bj.cn.ibm.com:80> ServerName bj.cn.ibm.com:80 ProxyRequests Off ProxyPassReverse / http:// inotesbj.cn.ibm.com:8080/ <Location / > ProxyPass http:// inotesbj.cn.ibm.com:8080/ </Location> </VirtualHost> <VirtualHost sh.cn.ibm.com:80> ServerName sh.cn.ibm.com:80 ProxyRequests Off ProxyPassReverse / http:// inotessh.cn.ibm.com:8080/ <Location / > ProxyPass http:// inotessh.cn.ibm.com:8080/ </Location> </VirtualHost>
|
回页首
总结
通过使用 Apache 逆向代理来对外提供 Domino 的 Web 服务功能,是一个很不错的安全选择,实施的代价很小,而得到的功能是很多企业想要的。这样即使有黑客攻破了 Apache 服务器,也获取不了任何有价值的数据,因为所有的数据都在企业的局域网内的 Domino 服务器上。
本文提供了一个配置的入门级介绍,希望它能作为一个开始,给更多的人一个参考和借鉴。
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。