只是想知道 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 之外没有其他方法吗?
您正在尝试的方法称为“通过默默无闻来确保安全”——您实际上并没有保护资源,您只是希望没有人知道要寻找它,除非他们来自您公司的内部。
此外,SNI 与此问题无关。如果内容通过 HTTP 提供而根本没有证书,您将遇到完全相同的问题,并且您尝试通过使用单独的主机名隐藏内容来阻止内容。
这实际上并不安全。
如果您想阻止对资源的访问,则需要以其他方式进行。一种方法是在单独的 IP 上设置单独的服务器实例,并使用防火墙来保护该实例。另一种方法是在包含受限内容或目录的虚拟服务器上使用基于 IP 的块。或者,您可以将其与要求客户端使用由您的内部 CA 颁发的证书(如果有的话)结合起来。或者几乎任何其他将身份验证与授权相结合的方式。
但希望公司以外的任何人都不会尝试使用“秘密”主机名并不是有效的安全措施,无论您是否使用 SSL/SNI。
如果您需要根据站点访问者的来源限制内容,您可以使用该信息作为主要访问控制(而不仅仅是您要保护的资源的名称)。
对于 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
归档时间: |
|
查看次数: |
697 次 |
最近记录: |