向个别员工颁发通配符证书的安全问题

信息安全 tls 公钥基础设施 通配符
2021-08-27 06:33:26

我们最近设置了一个两层内部证书颁发机构。我们还通过 Active Directory 传播根 CA,因此来自我们内部 CA 的证书会自动被我们网络中的每个 (Windows) 系统信任。

我们的开发人员需要为其本地工作站提供 SSL 证书。一种选择是为他们生成通配符证书,例如*.foo.bar.com.

好处是易于实施和面向未​​来(如果我们将来创建新的子域,它会自动覆盖它们)。

但是,另一方面,如果我们要颁发通配符证书,您如何确定恶意员工不会滥用它?

想象一下,一个恶意开发者在他们的本地工作站 (mail.foo.bar.com) 上建立了一个网站,并且可以以某种方式毒害 DNS 或修改用户的本地host文件。该通配符证书为他们的恶意网站提供了可信度,使其看起来更真实。

我是不是太偏执了?我们应该发布通配符并简化证书维护,还是应该为每个 DNS 名称生成唯一证书以限制使用范围?

有人有什么想法吗?经验?

编辑

在我看来,这里发布了两个非常好的解决方案:

  1. 按照@Kotzu的建议,将开发/测试和生产分成独立的 CA。对于我们个人而言,我不能证明为此目的而设置第二个 CA 是合理的。对于我们拥有的证书数量(总共 40 个,其中 10-20 个是开发者)来说,这太过分了。也就是说,我完全认为这是最好的答案。

  2. 按照@immbis的建议修改 DNS 命名结构,以便名称的“dev”部分是子域而不是子子域。从而使通配符更明显地成为开发域。这将在很大程度上减轻我对颁发通配符证书的担忧。然后模仿只能发生*.dev.ourdomain.com- 我可以接受。也就是说,我们只是对太多地方进行了硬编码以使其实用。

我认为我们最终要做的是继续向每个开发人员颁发完全合格的 SSL 证书。这感觉更安全,因为它为恶意人员滥用/冒充合法资源留下了更少的回旋余地。无论如何,这整个情况有点拖尾。我希望我们的开发人员一般不会恶意行事并试图建立虚假网站。我只是不想分发像免费糖果这样的受信任的通配符证书,只是为了以后让它们以某种意想不到的方式被使用/使用。

如果我们需要越来越多的证书并且颁发单个证书变得难以管理,那么我们将考虑设置仅受开发工作站(而不是整个公司)信任的第二个 CA 并颁发新的通配符证书。

4个回答

我认为你应该隔离你的环境。在您的所有网络上,只应信任生产证书。开发和测试证书只能在开发人员工作的计算机上受信任。在更安全的环境中,您甚至不会将相同的根 CA 用于生产和开发环境。

我将假设您的开发人员需要本地受信任的 SSL 证书。如前所述,如果他们真的确实需要这些,可能值得考虑。

通配符证书是指表单上带有 CN 或 SAN 的证书*.something.example.com

扩展为*仅一个标签;它不会扩展到多个标签。所以上面会匹配foo.something.example.com*扩展到单个标签)但不匹配(foo.bar.something.example.com两个标签)更不用说foo.example.com(缺少标签)。

另请记住,如果我没记错的话,*证书 SAN 和 CN 字段中特别不允许使用多个标签。所以你不能为 eg 创建一个有效的证书*.*.something.example.com这将被拒绝,因为它*在一个名称中有多个。(我认为这是公司在设置全网 HTTPS 时遇到的 Stack Exchange 问题之一。)

据推测,每个开发人员工作站的名称都不同。因此,您可能有开发人员工作站,例如dev033.internal.example.comdev7g-vm2.example.com,或者您有什么。

因此,在他们自己的主机的完全限定名称加上他们自己的主机的完全限定名称下,为每个开发人员提供一个单一通配符 SAN 的单一证书。将其设置为不允许用于签署其他证书(叶证书)。

例如,给使用仅对dev033.internal.example.com有效的证书的开发人员 dev033.internal.example.com*.dev033.internal.example.com

这样,开发人员可以自由地为自己的主机设置别名(例如,api.dev033.internal.example.com两者web.dev033.internal.example.com都可以使用这样的证书),但不能为不在自己工作站主机名下的任何东西设置任何 SSL。假设您没有internal.example.com向任何外部主机公开,那么在您的网络之外,开发人员也无法对证书执行任何他们无法使用自签名证书执行的操作。

对于奖励积分,但并非真正需要:使用仅用于此类开发(或测试或其他)证书的内部 CA 签署这些。

鉴于您的限制,我会说您应该设置一个脚本,使用 Let's Encrypt(或您自己的证书生​​成器,无论任何工作)自动为您网络上的任何开发人员生成任何请求的子域证书,关键约束是域名很明显很讨厌

例如,让您公司中的任何人创建任意子域,例如X-untrustworthy-danger-danger-danger.company.com他们X想要的任何子域(仅限 ASCII,最好是)。这应该足以进行测试而不会误导任何人。

考虑将颁发给具有extendedKeyUsage字段的开发人员的证书限制在绝对必要的范围内。如果没有服务器身份验证目的,则在 Web 服务器呈现时将被拒绝。

还可以考虑使用扩展。例如,basicConstraints扩展将区分可以签署附加证书的证书 ( CA:TRUE) 和不能签署的证书 ( CA:FALSE)。这样,如果恶意员工使用他们的证书颁发了任何其他证书,它将在任何支持此扩展的地方被拒绝(所以任何 X509v3)。

这样,如果您的恶意员工的证书受到以下限制,他们将无法以同样多的方式滥用它:

X509v3 Basic Constraints: 
    CA:FALSE
X509v3 Key Usage: 
    Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement