软件指南针:专注于软件传播与分享

增强OpenVPN安全性 (OpenVPN官方文档)

来源:原创 2391次浏览 0条评论
☞ 本文主要介绍软件OpenVPN的相关内容:增强OpenVPN安全性 (OpenVPN官方文档)

   其下列版本/分支可以参考本文:

  • 全部版本/分支
英文原文:http://openvpn.net/index.php/open-source/documentation/howto.html#security

增强OpenVPN的安全性

一个经常被重复提及的网络安全准则就是:不要过分相信一个单一的安全组件,否则它的失败将导致灾难性的安全漏洞。OpenVPN提供多种机制来添加额外的安全层,以避免这样的结果。

tls-auth

tls-auth指令为所有的SSL/TLS握手数据包添加一个额外的HMAC签名,以验证数据的完整性。无需进一步处理,没有正确的HMAC签名的任何UDP数据包将会被丢弃。tls-auth HMAC签名提供了上面所说的额外安全级别,而不是通过SSL/TLS来提供。它可以防御:

  • Dos攻击或者UDP端口淹没攻击。
  • 确定服务器UDP端口监听状态的端口扫描。
  • SSL/TLS实现的缓冲区溢出漏洞。
  • 与未经认证的计算机进行SSL/TLS握手(虽然这样的握手最终会验证失败,但tls-auth可以更加一点地断开它们)。

除了使用标准的RSA证书/密钥之外,使用tls-auth还需要生成一个共享的密钥:

openvpn --genkey --secret ta.key

该命令将生成一个OpenVPN静态密钥,并将其写入到ta.key文件中。该密钥应该通过已有的安全通道拷贝到服务器和所有的客户端。它应该与RSA的.key.crt文件放在同一目录。

在服务器配置中,添加:

tls-auth ta.key 0

在客户端配置中,添加:

tls-auth ta.key 1

proto udp

虽然OpenVPN允许使用TCP或者UDP协议作为VPN的连接载体,但UDP协议能够比TCP提供更好的Dos攻击和端口扫描防护:

proto udp

user/group (仅限于非Windows系统)

OpenVPN已经过非常仔细地设计,以允许在初始化后丢弃掉root权限,该特性可以在Linux/BSD/Solaris系统中一直使用。

对于攻击者而言,没有root权限,运行中的OpenVPN服务器进程就远不是一个诱人的目标。

user nobody
group nobody

非特权模式(仅限于Linux系统)

在Linux系统中,OpenVPN可以完全没有特权地正常运行。虽然配置上会稍稍麻烦一点,但却能带来最佳的安全性。

为了使用这种配置来运行,OpenVPN必须配置为使用iproute接口,这可以通过为configure脚本指定--enable-iproute2参数来完成。你的系统也需要有sudo软件包。

该配置使用Linux自身的能力来更改tun设备的权限,以便于非特权的用户也可以访问它。为了执行iproute,也需要使用sudo,从而使得接口属性和路由表可以被修改。

OpenVPN配置:

    • 重写并覆盖位于/usr/local/sbin/unpriv-ip的以下脚本文件:
      #!/bin/sh
      sudo /sbin/ip $*
    • 执行visudo,添加如下命令以允许用户"user1"执行/sbin/ip
      user1 ALL=(ALL)  NOPASSWD: /sbin/ip
      你也可以通过如下命令启用一个用户组:
      %users ALL=(ALL)  NOPASSWD: /sbin/ip
    • 在你的OpenVPN配置中添加如下语句:
      dev tunX/tapX
      iproute /usr/local/sbin/unpriv-ip
      请注意,你必须选择常量X(一般用数字标记,例如:tunX实际为tun0),并且不能同时指定tun或tap。
    • 使用root添加持久化接口,允许用户或用户组来管理它,下面的命令会创建tunX,并且允许user1和用户组访问它。
      openvpn --mktun --dev tunX --type tun --user user1 --group users
    • 在非特权用户的上下文环境中运行OpenVPN。

你可以通过核查脚本文件/usr/local/sbin/unpriv-ip的参数来添加进一步的安全约束。

chroot (仅限于非Windows系统)

chroot指令允许你将OpenVPN后台进程锁定到所谓的chroot jail(chroot监狱)中,除了该指令参数给出的指定目录外,chroot监狱中的进程无法访问主机系统的文件系统的任何部分。例如:

chroot jail

将导致OpenVPN进程在初始化时转到jail子目录,然后将它的根文件系统调整为该目录,进程将无法访问jail和它的子目录树以外的任何文件。从安全角度来说,这很重要,因为即使攻击者能够使用代码插入攻击入侵服务器,攻击也会被锁定在服务器的大部分文件系统之外。

注意事项:由于chroot调整了文件系统(仅从后台进程的角度来看),因此有必要将OpenVPN初始化后可能用到的文件放入jail目录中,例如:
  • 文件crl-verify
  • 或者目录client-config-dir

更大的RSA密钥

我们可以通过文件easy-rsa/vars中的KEY_SIZE变量来控制RSA密钥的大小,该变量必须在所有密钥生成之前进行设置。当前的默认设置为1024,该值可以合理地提高到2048,这对VPN隧道的性能没有什么负面影响,除了稍稍减缓每个客户端每小时一次的SSL/TLS重新协商握手速度,和大幅减慢使用脚本easy-rsa/build-dh生成迪菲赫尔曼参数的一次性过程之外。

更大的对象密钥

默认情况下,OpenVPN使用Blowfish -- 一种128位的对称加密算法。

OpenVPN自动地支持OpenSSL库支持的任何加密算法,同样支持使用更大密钥长度的加密算法。例如,通过在服务器和客户端配置文件中均添加如下语句来使用AES(Advanced Encryption Standard,高级加密标准)的256位版本:

cipher AES-256-CBC

将根密钥(ca.key)保留在一台没有网络连接的计算机上

使用X509 PKI(OpenVPN也使用)的安全好处之一就是,根CA密钥(ca.key)不需要放在当前的OpenVPN服务器所在计算机上。在一个高度安全的环境中,你可能想特别指定一台计算机用于密钥签名,让该计算机受到良好的保护,并断开所有的网络。必要时,可以使用软盘来回移动该密钥文件。这些措施使得攻击者想要窃取根密钥变得非常困难(对于密钥签名计算机的物理盗窃而言,则一点都不难)。


作者:软件指南针(http://www.softown.cn),转载请保留出处!

用户评论

使用指南 故障排除 0 返回顶部