SSL SNI 安全问题

Sur*_*anó 2 sni apache-2.2

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

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

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>
Run Code Online (Sandbox Code Playgroud)

问题是,如果您将该名称添加到您的hosts文件中以解析为公共 IP,那么 SNI 实际上将解析处理它,就像它是来自 Intranet 的有效请求一样。

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

该节点位于我没有影响的防火墙后面。它只有一个 IP(内部 IP),但如果需要,我可以将其设为两个。

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

Jen*_*y D 9

您正在尝试的方法称为“通过默默无闻来确保安全”——您实际上并没有保护资源,您只是希望没有人知道要寻找它,除非他们来自您公司的内部。

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

这实际上并不安全。

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

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


HBr*_*ijn 5

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

对于 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>
  ...
Run Code Online (Sandbox Code Playgroud)

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

此外,您对 .htaccess 的评论引发了我的反感,引用自.htaccess文件手册

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