Answers:
根据这篇文章,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
这些变量,其中这些新变量之一是证书指纹/序列号。
有很多选择,因为OpenVPN是一个开源项目,并且具有编写您自己的身份验证挂钩的能力,所以许多人做了很多不同的事情以提供不同级别的身份验证。
我还没有尝试过大多数,只是看到它们在docs / blogs / maillists中提到过。其中一些可能需要修补程序或非免费版本。
一种主要方法是使您的密钥对的私有部分非常难以提取/复制。
如果保护它们的密钥成本过高,客户端平台不支持或由于其他原因而无法实现,那么您将有一些选择。
在服务器上设置大量日志,以监视异常。如果Bob通常只从他的房子登录,然后有一天,他开始从Acme Inc.登录,那么您可能需要调查。
设置多因素身份验证。您的证书算作“您拥有的东西”。因此,您应该在“您是”或“您知道”中寻找替代方案。这包括生物指标或密码/密码。
auth-user-pass-verify
选项。此选项将提供的用户名和密码传递到外部脚本/程序,该脚本/程序将根据您的需要进行身份验证决定。我不是安全专家,我对安全性很严格。您的问题正好达到IT安全的核心:信任。如我所见,永远不要以为鲍勃可以被信任。当然,鲍勃可能是一个非常友好和值得信赖的人。他在贵公司工作了20多年。但是,“鲍勃”这个人与您的IT基础架构完全无关。
鲍勃使用允许访问的任意“继电器”。中继可以是任何东西:密码,证书,硬件令牌,虹膜扫描,DNA。它们是允许访问系统的密钥。如果您的问题是关于验证使用钥匙的人的身份,唯一的诚实答案可能是您必须在同一房间。在所有其他情况下,我认为您不能向自己保证鲍勃确实是鲍勃,并且在获得他的通行权时目前并未被扣在枪口。因此,在您的IT基础结构设计计划中,逻辑上不要引用“鲍勃”:一个实体可以访问您的站点。
因为您只能真正知道“一个实体”使用您过去散发的钥匙进行了访问,所以正确的观点可能是限制钥匙可以打开的门数。发出的键越多,打开的门就越少。
OpenVPN还可以选择每个密钥仅允许一个并发连接。然后,如果在鲍勃已经在里面的情况下爱丽丝确实使用鲍勃的钥匙登录,则爱丽丝将被拒绝访问。不幸的是,这也意味着当用Bob的密钥登录Alice时,Bob无法登录。因此,您应该配置系统以通知您来自多个源IP的并发登录尝试。并在发生任何违规时将两者同时踢开,这样鲍勃将不得不拨打电话寻求帮助。
重点是:不要向自己保证无法确定的事情,在设计安全计划时请牢记这一点。假设总是有一个更聪明的人在你前面,他们迫不及待地想证明你错了……只是为了“笨蛋”。:-)
auth-user-pass-verify /etc/openvpn/scripts/connect.sh via-env
获取用户名。您知道我是否也可以从用户使用的证书中获取ID吗?如果是这样,那么我可以编写一个Perl脚本来检查具有已知证书ID的yaml文件。