SSL SNI 安全问题

SSL SNI 安全问题

我只是想知道 SNI 是否有助于将公共内容与私人内容隔离。我设法将我们的服务器配置/foo为为每个客户端提供服务,但/bar只为来自内联网的客户端提供服务,方法是指定仅从内联网解析的主机名。

因此配置如下:(剥离到非常重要的部分)

NameVirtualHost *:443
# JkWorkersFile must be global so including it here
JkWorkersFile workers.properties

<VirtualHost *:443>
  ServerName public.foo.com
  JkMountFile uriworkermap-pub.properties
</VirtualHost>

<VirtualHost *:443>
  ServerName private-foo
  JkMountFile uriworkermap-priv.properties
</VirtualHost>

<VirtualHost *:443>
  ServerName 10.1.2.3
  JkMountFile uriworkermap-priv.properties
</VirtualHost>

问题是,如果你将该名称添加到hosts文件中以解析为公共 IP,那么 SNI 实际上会以与来自内联网的有效请求相同的方式解析它。

我考虑过只使用数字IP而不是名称(例如10.1.2.3),但我认为如果客户端在他们自己的子网中具有相同的IP(例如将端口转发到我的Web服务器的公共IP的Linux主机),那么也可以欺骗他们。

该节点位于防火墙后面,我无法控制。它只有一个 IP(内部 IP),但如果需要,我可能会将其设置为两个。

实际问题是:如何防止此类泄漏?例如通过 htaccess?通过指定不同的 IP 地址?或者除了创建单独的服务器实例并忘记 SNI 之外没有其他方法吗?

答案1

如果您需要根据网站访问者的来源限制内容,则可以使用该信息作为主要访问控制(而不仅仅是您要保护的资源的名称)。

对于 Apache 2.2 来说,这将是Allow指示。

<VirtualHost *:443>
  ServerName private-foo
  <Location />
    Order Deny,Allow
    Deny from all
    # Allow from the internal subnet 10.1.2.0/24
    Allow from 10.1.2
  </Location>
  ...

在您的场景中,服务器通常会有一个内部 IP 地址和一个公共 IP 地址,并且由于内部用户只会使用该内部 IP 地址进入,因此您可以将虚拟主机绑定到该内部 IP,而不是<VirtualHost 10.1.2.3:443>监听所有 IP

此外,你关于 .htaccess 的评论引起了我的不满,引自.htaccess 手册文件:

你应该完全避免使用 .htaccess 文件 如果你有权访问 httpd 主服务器配置文件中。使用 .htaccess 文件会降低 Apache http 服务器的速度。任何可以包含在 .htaccess 文件中的指令最好都设置在Directory在主 Apache 配置文件中阻止,因为它具有相同的效果,但性能更好。

答案2

您正在尝试的是所谓的“通过隐蔽性实现安全” - 您实际上并没有保护资源,您只是希望没有人知道去寻找它,除非他们来自您的公司内部。

此外,SNI 与此问题无关。如果内容是通过 HTTP 提供的,且根本没有证书,并且您尝试通过使用单独的主机名隐藏内容来阻止内容,那么您将遇到完全相同的问题。

这实际上并不安全。

如果您想要提供对资源的访问权限,则需要以其他方式进行。一种方法是设置单独的服务器实例,使用单独的 IP,并使用防火墙保护该实例。另一种方法是在包含受限内容或目录的虚拟服务器上使用基于 IP 的块。或者,您可以将其与要求客户端使用由内部 CA 颁发的证书(如果有)相结合。或者几乎任何其他将身份验证与授权相结合的方式。

但是,无论您是否使用 SSL/SNI,希望公司外部没有人尝试使用“秘密”主机名都不是有效的安全措施。

相关内容