注意事项
这里的信息适用于 OpenVPN 2.3.x 版本。对于 2.4.x,有更多安全选项。 本帖将很快更新,以包含更多有关 2.4 的内容!
更新
2017年8月3日在 #4 中添加了:关于 DH 参数的说明,并添加了-检查
选项的opensl
指挥。
2015年3月24日包括tls-version-min
(现为 #12),并更新了 #16,加入了关于 IANA TLS 密码套件名称的说明。
天航vpn
OpenVPN 开发人员倾向于优先考虑向后兼容性,而不是安全性。 这并不是一个普遍的坏做法,但目前的 OpenVPN 默认设置并';t那在我看来,从安全的角度来看是如此。 在这篇文章中,我希望用 16 个实用技巧来帮助你实现更安全的 OpenVPN 设置。
遵循本帖中的提示,将有助于最大限度地降低(甚至完全减轻)风险,如
- 中间人攻击
- none
- 客户端密钥泄露,允许攻击者冒充服务器。
这篇文章可能看起来很大,让人不知所措,我知道这种可能性。 这完全取决于你安装 OpenVPN 的目的。 对于保护真正安全的网络(保密性)和数据完整性的需要,请阅读全部内容。 如果只是绕过简单的防火墙,而没有数据加密的特殊需要,这篇文章可能与你的关系不大,因为默认情况下,OpenVPN 对你来说可能已经足够安全了。
天航vpn
除非另有说明,否则所有配置更改均适用于客户端和服务器配置。 大多数更改都要求客户端更新其配置(如果稍后更改)。 如果您目前正在使用默认设置运行大量客户端,您可能希望一次性应用所有更改,并在维护窗口中计划过渡。
在这篇文章中,我假设你运行的 OpenVPN 版本为 2.3.x,采用 TLS 身份验证(证书,而不是预共享密钥)。
天航vpn
注意事项
none
天航vpn
在客户端配置中,验证服务器证书主题字符串。 例如
verify-x509-name 'C=NL, O=Gert van Dijk, CN=xlsvps.gertvandijk.net' subject
天航vpn
采取这一措施可防止客户端使用自己的证书冒充服务器。
使用 X509v3 格式的证书已设置了密钥使用标志。 客户端应使用设置了"TLS Web Client Authentication"的证书,服务器则应发送设置了"TLS Web Server Authentication"的证书。 现在配置 OpenVPN 以检查这一点:
客户端配置,连接服务器:
remote-cert-eku "TLS网络服务器验证";
对于服务器配置,接受客户端连接:
remote-cert-eku "TLS网络客户端身份验证";
天航vpn
使用额外的共享秘密来验证 TLS 握手,最大限度地减少 (D)DoS 攻击。 服务器和所有客户端应共享相同的秘密,以通过初始 TLS 握手。
生成共享秘密:
openvpn --genkey --secret tls-auth.key
客户端配置,连接服务器:
tls-auth /path/to/tls-auth.key 1
对于服务器,接受客户端连接:
tls-auth /path/to/tls-auth.key 0
或者,嵌入密钥并单独指定密钥方向:
... </tls-auth> 键方向 0
none
天航vpn
通过预生成的 Diffie-Hellman 参数,TLS 会话将被启用(但不限于),以便与提供以下功能的 TLS 密码套件一起使用前向保密性none
DH 参数被认为是公开的,很难验证生成的 DH 参数是否真正强大。 遗憾的是,OpenVPN 并没有内置经过验证的强 DH 参数。
仅服务器需要。
生成 2048 位 DH 参数文件:
openssl dhparam 2048 -out dh2048.pem -check
在配置中:
dh /path/to/dh2048.pem
天航vpn
对于所有证书/密钥,请使用至少2048 位 (RSA),因为这是考虑的最小密钥大小。 默认情况下,旧版 easy-rsa 辅助脚本会生成所有 1024 位密钥。 撤销并重新签发所有大小低于 2048 位的证书/密钥。 如果情况允许,请使用 4096 位 RSA 密钥。
天航vpn
应检查已撤销证书的列表,以拒绝使用此类证书进行访问。
crl-verify /path/to/crl.pem
天航vpn
在签署证书时,要计算待签署证书的数字签名。 这个哈希值(摘要信息)是由 CA 密钥签名的实际数据,用于信任它。 重要的是,不要使用 MD5、SHA-1 或更弱的摘要,因为这被认为是不安全的,有人可能会冒充你的服务器或客户端的身份。
要检查证书(或中间 CA)签名,请执行以下操作
openssl x509 -in /path/to/cert.crt -text
它应该输出这样的行:
签名算法:sha256WithRSAEncryption
任何 SHA-2 系列(SHA-256、SHA-384、SHA-512)的算法都可以。
天航vpn
在典型的证书使用中,客户的私钥在企业中无处不在,并在许多机器上使用。 可以通过撤销来降低它们被泄露的风险,但如果密钥在不知不觉中被盗,那就无济于事了。
与其将私人密钥存储在普通存储器上,不如使用令牌或智能卡等安全设备。 此类设备上的私钥永远不会离开设备,加密操作在卡本身执行。 这大大降低了私钥泄露的风险。
OpenVPN 可以与 PKCS#11 兼容设备对话。 如需设置此类设备,请参阅另一篇文章:开始使用智能卡-HSM.
通过列出令牌上的所有证书,选择正确的证书:
openvpn --show-pkcs11-ids my-pkcs11-middleware.so
地点my-pkcs11-middleware.so
是制造商提供的中间件(共享库)的路径。 对于使用 OpenSC 提供的 PKCS#11 中间件的 OpenSC 卡,请使用
openvpn --show-pkcs11-ids opensc-pkcs11.so
输出结果如下
证书 DN:C=NL, O=Gert van Dijk, CN=Gert van Dijk, description=ePass2003 #2 Q4 天航vpn 序列号:15序列号 EnterSafe/PKCS\x2315/7528531617051201/ePass2003\x20\x232\x20\x28User\x20PIN\x29/D08DD75984CC577F
none
pkcs11-id 'EnterSafe/PKCS\x2315/7528531617051201/ePass2003\x20\x232\x20\x28User\x20PIN\x29/D08DD75984CC577F' pkcs11-providers opensc-pkcs11.so
在启动连接时,PKCS#11 中间件会要求输入安全令牌口令。
天航vpn
虽然你的连接可能会中断,OpenVPN 正在尝试重新连接,但你可能会再次使用默认网络路由,绕过隧道。 对于访问私人网络来说,这可能不是什么大问题,因为从隧道外部可能无法访问网络地址,但这可能会暴露你希望保密的信息,如包含 cookie 的 HTTP 请求。
要让 OpenVPN 保持设备开放,并在连接恢复前保留流量,只需设置坚持-屯
选择。
坚持-屯
天航vpn
在 OpenVPN 使用中,服务器发送一些客户端配置参数(推送),客户端应用这些参数(拉)是很常见的。 如果你只想确保客户端配置与你配置的完全一致,那么可以考虑不包含拉绳
选项。 这将要求你在客户端配置中明确设置一切,可能会严重影响 OpenVPN 客户端部署的便捷性。
天航vpn
在正常配置中,你会希望 OpenVPN 守护进程为你配置 tun/tap 设备。 (例如:用服务器分配的 IP 地址配置接口。)不过,你也可以考虑自己配置,以确保避免命令注入。 有人会被 Shellshock 攻击吗?)
来自手册
脚本安全级别 该指令对 OpenVPN' 使用外部程序和脚本提供策略级控制。 级别越低,限制越多,级别越高,许可越多。 级别设置: 0 -- 严格禁止调用外部程序。 1 -- (默认)只调用内置可执行程序,如 ifconfig、ip、route 或 netsh。 2 -- 允许调用内置可执行程序和用户自定义脚本。 3 -- 允许通过环境变量向脚本传递密码(可能不安全)。
天航vpn
为了防止任何形式的 TLS 协议降级攻击,请在客户端和服务器上设置最低版本。 如果客户机和服务器都是现代版本(2.3.3 以上),它们应该可以很好地支持 TLSv1.2,因此可以这样配置:
tls-version-min 1.2
请注意,这将会破坏 OpenVPN 2.3.2 及更早版本,因为这些版本只能使用 TLSv1.0 握手签名。
天航vpn
上述所有项目基本上都是 PKI 的一般 TLS 配置选项。 要进一步增强安全性,可以使用OpenVPN-NLOpenVPN-NL是OpenVPN的一个分叉,使用PolarSSL而不是OpenSSL作为加密库,并具有更安全的默认设置。 以下项目不适用于 OpenVPN-NL,因为它已经包含了足够强大的设置,或者甚至不提供其他设置。 我建议至少考虑在服务器和/或客户端使用 OpenVPN-NL 而不是 OpenVPN。 在此期间,请将其余项目应用到普通的 OpenVPN 安装中;它们是为了与 OpenVPN-NL 兼容而选择的。
注意事项
使用 OpenVPN-NL 时,本帖中的 shell 命令应使用openvpn-nl
而不是openvpn
.
免责声明:我受雇于福克斯信息技术公司该公司正在开发OpenVPN-NL与 OpenVPN 社区合作。
天航vpn
OpenVPN-NL 不需要。
密码 AES-256-CBC
OpenVPN 的默认加密算法BF-CBC
(Blowfish, block-cipher),密钥大小为 128 位(可变)。 虽然它肯定不是一个可怕的或'破'密码,如RC4或单一 DES,我更喜欢 AES 这样更现代、使用更广泛的密码。 在所有其他强大的选项中,我选择了 AES-256-CBC,以实现与 OpenVPN-NL 的互操作性。
要查看您的 OpenVPN 版本支持哪些其他密码,请运行
openvpn --show-ciphers
天航vpn
OpenVPN-NL 不需要。
授权 SHA-256
信息验证就是所谓的 HMAC。 使用 HMAC 是为了确保加密数据在传输过程中不被篡改。 OpenVPN 的默认设置是SHA-1
. SHA-1是被视为弱者none折旧政策noneSHA-2none
要查看 OpenVPN 支持哪些其他 HMAC,请运行
openvpn --show-digests
天航vpn
OpenVPN-NL 不需要。
建议限制 TLS 密码列表,因为你想为连接执行一个安全的密码套件。 基本上,你要将 OpenVPN 提供给客户端的列表减少到你认为安全的列表。 这样可以消除降级攻击或客户端配置中的安全问题,以及使用普通 RSA 密钥交换的问题。
摘自 OpenVPN 手册:
清单
l
允许使用的 TLS 密码,以冒号(":")分隔。 如果您需要较高的安全级别,可能需要手动设置此参数,以防止版本回滚攻击,即中间人攻击者试图迫使两个对等程序协商到它们都支持的最低安全级别。
要查看 OpenVPN 支持哪些 TLS 密码,请运行
openvpn --show-tls
我建议设置一个小的密码列表,以匹配共同推荐集例如
tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
上述列表基本上是普通 OpenVPN(OpenSSL 1.0.1)的两种最强密码和 OpenVPN-NL 提供的两种最强密码的组合。 所有这些都是启用了 DHE 或 ECDHE 的密码套件,这意味着密钥交换是通过启用 Diffie-Hellman 来完成的,从而提供了前向保密性。 ECDHE 更受青睐,因为它使用椭圆曲线加密技术,比普通的 Diffie-Hellman 要慢得多。
密码套件名称必须以 IANA 格式指定,而不是通常在互联网上找到的 OpenSSL 格式。 OpenVPN 源代码中提供了从 IANA 到/从 OpenSSL 密码套件名称的映射表src/openvpn/ssl.c
目前稳定的 2.3.6 版本来自第 116 行. 感谢 'sosbar'在评论中向我指出这一点。
天航vpn
有什么不清楚的吗? 您对这篇文章有什么意见吗? 我是否遗漏了一件重要的事情? 请告诉我! 请在下面留言或给我发鸣叫.
您喜欢这篇文章吗? 欢迎转发或以其他方式分享!