这一节介绍该解决方案的核心组件之一:Open×××。

Open***的技术核心是虚拟网卡,其次是SSL协议实现。Open×××使用OpenSSL库来加密数据与控制信息。Open×××与生俱来便具备了许多安全特性:它在用户空间运行,无须对内核及网络协议栈作修改;初始完毕后以chroot方式运行,放弃root权限;使用mlockall以防止敏感数据交换到磁盘。Open×××还具有许多优秀的功能,例如数据压缩,良好的兼容性,服务端能够推送一些网络信息至客户端。

有关Open×××安装和基础配置的文档,在51CTO的网络安全->×××专区里面有许多专家文档。在此不浪费篇幅。本文着重描述一些不太常见的特别之处。

首先看一下我们对Open×××的功能需求列表:

  • 连接需要加密。这个是Open×××与生俱来的特性。

  • 同一个用户可能从多个PC端同时保持连接。现在的SA两台或以上工作机的比比皆是了。

  • IP分配。使用动态地址池,确保内部IP地址资源有效利用。地主家也可能没有余粮啊!

  • 用户认证方面,需要使用RSA令牌系统。这里我们使用pam+radius来连接RSA令牌系统。RSA令牌是安全系数比较高的系统

  • 同时连接用户数量最大为128。

这个功能需求仅仅是一个案例,读者可以将之调整为你需要的任意内容。

Open×××服务端配置基本步骤如下:

  • clean-all。清除所有现有的证书文件。

  • build-ca。生成ROOT CA。

  • build-key-server。生成服务端证书和密钥。

  • build-dh。生成Diffie-Hellman文件。

  • build-key。生成客户端证书和密钥。这组文件需要发放给客户端。如果一个用户有多个终端,并且需要同时登录,那么也需要多组客户端证书和密钥文件。如果server.conf包含client-cert-not-required配置时,服务器端将不会验证客户端证书和密钥,这时可以跳过这一步。

  • 修改服务端相关配置文件。

  • 拷贝客户端证书和密钥给用户。

1 服务端的核心文件如下:

  • server.conf,服务端配置文件。

  • /etc/pam.d/open***,open***和pam结合的配置文件。

  • /etc/pam_radius.conf,pam和radius结合的配置文件。

  • ca.crt/ca.key,ROOT CA。

  • server.crt/server.key,服务端证书和密钥。

  • client.crt/client.key,客户端证书和密钥,这组文件是客户端相关的,文件名不是固定的,在服务器端也可能会同时存在很多组。

  • dhxxx.pem,Diffie-Hellman文件。

其中.crt/.key/.pem文件都是之前步骤中程序自动生成的。

各个配置文件的主要内容如下:

server.conf


port 1194

proto tcp

dev tun

ca ca.crt

cert server.crt

key server.key

dh dh1024.pem

ifconfig-pool-persist ipp.txt

keepalive 10 120

comp-lzo

max-clients 128

persist-key

persist-tun

status open***-status.log

verb 3

log/var/log/open***.log

log-append /var/log/open***.log

server xxx.xxx.xxx.0 255.255.0.0

push "route xxx.xxx.0.0 255.255.0.0"


reneg-sec 0

duplicate-cn

client-connect    /etc/open***/connect

client-disconnect    /etc/open***/disconnect

socket-flags    TCP_NODELAY

push    "socket-flags TCP_NODELAY"

plugin    /usr/lib64/open***/plugin/lib/open***-auth-pam.so open***


username-as-common-name


对于这个配置文件需要特别说明如下:

  • server xxx.xxx.0.0 255.255.0.0

    如果不考虑本文的既定需求,IP地址分配实际上也可以使用CCD配置来分配固定IP。但是对于用户数量较多的情况下,配置会比较麻烦,同时IP地址的使用也会比较浪费。

  • reneg-sec 0 : 禁止open***证书自动过期,以便用户保持连接。

  • duplicate-cn : 允许一个用户从多个PC端同时保持连接。

  • client-connect/client-disconnect : 用户连接之后和断开连接之后的动作。

  • socket-flags TCP_NODELAY

    push"socket-flags TCP_NODELAY" : 这个配置项是需要同时应用在服务端和客户端的。在使用TCP模式时,这个选项能够有效降低网络延时。详细原因可以参见有关Nagle算法的说明。简单说来:网络吞吐量和网络传输实时性是互相矛盾的,利用Nagle算法会将小的数据包缓存合并成为大的数据包,提高吞吐量,但是会增加网络延时。Open×××默认是启用这一算法的。TCP_NODELAY选项关闭这一算法,数据包不管多小都不再合并,直接发出,从而降低网络延时。

  • plugin/usr/lib64/open***/plugin/lib/open***-auth-pam.so open*** 使用pam验证用户,通过pam将radius系统结合起来。

  • username-as-common-name这个选项对open***系统本身是没有特别作用的,在此先卖个关子,我会在后面的章节介绍为什么要使用这个选项。


/etc/pam.d/open***


account required /lib64/security/pam_radius_auth.so

auth required /lib64/security/pam_radius_auth.so


/etc/pam_radius.conf


:16453


2 客户端的核心文件如下:

  • xxx.o*** : 客户端配置文件

  • ca.crt/ca.key : ROOT CA

  • client.crt/client.key : 客户端证书和密钥


xxx.o***


client

dev tun

route-metric 0

proto tcp

remote 1194

resolv-retry infinite

nobind

persist-key

persist-tun

ca ../ca.crt

cert ../client.crt

key ../client.key

auth-user-pass

ns-cert-type server

comp-lzo

verb 3

mute 20

reneg-sec 0


总结:Open×××的配置本身相对还是比较简单,网络上面的文档也很容易找到。不过本节也提出了一些特有的内容:

  • 使用radius作为中间协议来进行open***的RSA认证。在网络设备中也经常会使用radius作为网络设备RSA认证的中间桥梁。

  • Open×××在使用TCP模式时,需要使用TCP_NODELAY来提高网络延时。对于网络吞吐能力优先的应用不能够使用TCP_NODELAY,例如SAMBA;而对于并发性能优先的应用应该启用TCP_NODELAY,例如Nginx。

  • 设置reneg-sec 0 避免用户在操作的过程中由于证书超时而中断,如果没有设置这个参数,open***连接会每个小时自动断开连接。

  • 设置duplicate-cn 允许用户从多个终端同时保持连接。