我有一个使用证书和LDAPauthentication的OpenVPN服务器。
问题是,一个用户可以共享他的证书,其他有效的LDAP用户可以使用这个证书。
题
如何确保Bob的证书只能与LDAP用户“bob”一起使用?
根据这篇文章 , 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版本中,他们添加了许多新variables,您可以通过env >> /tmp/env看到这些variables,其中一个新variables是证书指纹/序列号。
有很多select,因为OpenVPN是一个开源项目,它有能力编写自己的authentication钩子,有很多人做了许多不同的事情,提供不同级别的authentication。
我没有尝试过大部分这些只是看到他们在文档/博客/邮件列表中提到他们。 其中一些可能需要补丁或非免费版本。
一个主要的方法是使你的密钥对的私人部分难以提取/复制。
如果保护他们的钥匙是成本高昂的,不支持在您的客户端平台或由于其他原因不可能,那么您只剩下几个选项。
在服务器上设置很多日志logging,以查看exception情况。 如果鲍勃通常只从他家login,然后有一天他开始从Acme Inc.login,那么您可能需要调查。
设置多重身份validation。 您的证书被视为“您拥有的东西”。 所以你应该在“你是什么”或“你知道的东西”中寻找替代品。 这包括生物指标,或密码/通行短语。
auth-user-pass-verify选项。 此选项将提供的用户名和密码传递给外部脚本/程序,该脚本将根据您的需要进行身份validation决策。 我不是安全专家,我对安全性很严格。 你的问题恰恰达到了IT安全的核心:信任。 正如我所看到的,人们永远不应该假定鲍勃可以被信任。 当然,鲍勃可能是一个非常好,值得信赖的人。 他在贵公司工作了20多年。 然而,“Bob”这个人在你的IT基础设施中完全不相关。
Bob使用允许访问的任意“中继”。 中继可以是任何东西:密码,证书,硬件令牌,虹膜扫描,DNA。 他们是允许访问您的系统的钥匙。 如果您的问题是关于validation使用密钥的人的身份,唯一诚实的答案可能是您必须在同一个房间。 在所有其他情况下,我认为你不能向自己保证,鲍勃确实是鲍勃,并且在获得他的访问权时并没有被枪毙。 因此,在您的IT基础架构devise计划中,合乎逻辑的事情不是指“Bob”:一个实体获得了访问您的网站的权限。
因为你只能真正知道“一个实体”通过你过去传出的密钥获得访问权限,所以正确的观点可能是限制密钥可以打开的门的数量。 你传递的钥匙越less,他们打开的门就越less。
OpenVPN也有一个选项,允许每个密钥只有一个并发连接。 那么,如果Alice在Bob已经在里面的时候用Bob的密钥login,Alice将被拒绝访问。 不幸的是,这也意味着当Alice用Bob的密钥login时Bob不能login。 所以你应该configuration你的系统通知你来自多个源IP的并发login尝试。 当发生一些违规事件时,启动这两个,所以鲍勃将不得不拨打帮助。
重点是:不要向自己保证你不能确定的事情,并在devise安全计划时牢记这一点。 假设总是有一个更聪明的人,就在你的前面,谁等不及要certificate你错了……只是为了“stream氓”。 🙂