我有一个使用证书和 LDAP 身份验证的 OpenVPN 服务器。
问题是,一个用户可以共享他的证书,而其他有效的 LDAP 用户可以使用该证书。
问题
如何确保 Bob 的证书只能与 LDAP 用户“bob”一起使用?
答案1
根据这个帖子,common_name
用户无法伪造。
将此添加到 openvpn server.conf
script-security 2
# untrusted state
auth-user-pass-verify /etc/openvpn/scripts/check_cn_on_connect.sh via-env
/etc/openvpn/scripts/check_cn_on_connect.sh
包含
#!/bin/bash
# username and common_name must be the same to allow access.
# users are not allowed to share their cert
if [ $username != $common_name ]; then
echo "$(date +%Y%m%d-%H%M%S) DENIED username=$username cert=$common_name" >> /var/log/openvpn-access.log
exit 1
fi
echo "$(date +%Y%m%d-%H%M%S) GRANTED username=$username cert=$common_name" >> /var/log/openvpn-access.log
exit 0
更新
这是针对 OpenVPN 2.1.4 的。在 2.2.0 中,他们添加了许多新变量,您可以通过 查看env >> /tmp/env
,其中一个新变量是证书指纹/序列号。
答案2
有很多选择,因为 OpenVPN 是一个开源项目,并且它具有编写自己的身份验证钩子的能力,有许多人做了许多不同的事情来提供不同级别的身份验证。
我还没有尝试过其中的大部分,只是在文档/博客/邮件列表中看到过它们。其中一些可能需要补丁或非免费版本。
一种主要方法是使密钥对的私有部分难以提取/复制。
- 使用硬件令牌。私钥可以存储在物理令牌上,无法复制或检索。(参考:OpenVPN 通过基于 PKCS#11 的加密令牌提供对智能卡的支持。)
- 我曾看到过使用 TPM 的提及,这类似于硬件令牌,但内置于主板中。(参考:http://www.cs.tau.ac.il/~orkaplan/TPMWorkshop/downloads/ServerSetup.txt)
- 我在邮件列表中看到一些内容,其中提到可以使用 Windows 证书存储来获取密钥。此处的密钥可以进行标记,因此不可导出。(参考:http://openvpn.net/archive/openvpn-devel/2004-10/msg00019.html)
如果保护密钥的成本过高、不受您的客户端平台支持或者由于其他原因而无法实现,那么您只剩下几个选择。
- 要求经常更新证书,因此复制的证书不能长期使用。
在服务器上设置大量日志,以观察异常情况。如果 Bob 通常只从他家登录,然后有一天,他开始从 Acme Inc. 登录,那么您可能需要进行调查。
设置多因素身份验证。您的证书被视为“您拥有的东西”。因此,您应该在“您是的东西”或“您知道的东西”中寻找替代方案。这包括生物特征或密码/密码短语。
- 正如我所提到的,OpenVPN 提供了非常灵活的身份验证。这使用选项
auth-user-pass-verify
。此选项将提供的用户名和密码传递给外部脚本/程序,该脚本/程序将根据您的需要做出身份验证决定。
答案3
我不是安全专家,我对安全非常严格。你的问题恰恰触及了 IT 安全的核心:信任。在我看来,永远不要认为鲍勃是可以信任的。当然,鲍勃可能是一个非常善良、值得信赖的人。他已经在贵公司工作了 20 多年。然而,“鲍勃”这个人与你的 IT 基础设施完全无关。
Bob 使用任意“中继”来允许访问。中继可以是任何东西:密码、证书、硬件令牌、虹膜扫描、DNA。它们是允许访问您系统的密钥。如果您的问题是关于验证使用密钥的人的身份,那么唯一诚实的答案可能是您必须在同一个房间里。在所有其他情况下,我认为您不能确信 Bob 真的是 Bob,并且在获得访问权限时没有被枪指着。因此,在您的 IT 基础设施设计计划中,合乎逻辑的做法是不要提及“Bob”:实体获得了您网站的访问权限。
因为你只能真正知道“一个实体”用你过去分发的钥匙获得了访问权限,所以正确的观点可能是限制钥匙可以打开的门的数量。你分发的钥匙越多,它们打开的门就越少。
OpenVPN 还具有一个选项,允许每个密钥仅允许一个并发连接。然后,如果 Alice 使用 Bob 的密钥登录,而 Bob 已经在内部,则 Alice 将被拒绝访问。不幸的是,这也意味着当 Alice 使用 Bob 的密钥登录时,Bob 无法登录。因此,您应该配置系统以通知您来自多个源 IP 的并发登录尝试。当发生某些违规行为时,同时启动两者,这样 Bob 就必须拨打电话寻求帮助。
要点是:不要对自己不能确定的事情抱有信心,在设计安全计划时要牢记这一点。假设总有一个比你更聪明的人,远远领先于你,迫不及待地想要证明你是错的……只是为了好玩而已。:-)