只是想知道SNI是否有用于将公共内容与私人内容分离。 我设法configuration我们的服务器为每个客户端服务/foo ,但只为来自内部网的客户端提供/bar服务,方法是指定仅从intranetparsing的主机名。
所以configuration如下:(剥离到非常必要的部分)
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文件中以parsing公有IP,则SNI实际上将以与从Intranet发出的有效请求相同的方式处理它。
我围绕着只使用数字IP而不是名字(例如10.1.2.3 )的想法,但是我认为如果客户端在自己的子网中有相同的IP地址,也可能会被欺骗(例如,一个将端口转发到公有IP的Linux主机我的networking服务器。
节点位于我没有影响力的防火墙后面。 它只有一个IP(内部的),但如果需要的话,我可以把它做成两个。
实际的问题是:你如何防止这样的泄漏? 例如通过htaccess? 通过指定不同的IP地址? 还是没有别的办法,而不是创build一个单独的服务器实例,忘记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> ...
通常在你的情况下,服务器将有一个内部和一个公共IP地址,因为内部用户会使用该内部IP地址,只有你将虚拟主机绑定到只有内部IP,例如<VirtualHost 10.1.2.3:443>而不是听所有的IP
另外,您对.htaccess的评论引发了我的宠爱,引自.htaccess文件中的手册 :
如果您有权访问httpd主服务器configuration文件, 则应该完全避免使用.htaccess文件。 使用.htaccess文件会降低您的Apache HTTP服务器速度。 您可以包含在.htaccess文件中的任何指令都可以在主Apacheconfiguration文件的
Directory块中更好地设置,因为它具有相同的效果,性能更好。
你所尝试的被称为“安全通过默默无闻” – 你实际上并没有获得资源,你只是希望没有人会知道要find它,除非他们来自公司内部。
另外,SNI与这个问题无关。 如果内容是通过HTTP提供的,并且完全没有证书,那么您将会遇到完全相同的问题,并尝试使用单独的主机名来隐藏内容。
这实际上并不安全。
如果您想要获取资源,则需要以其他方式进行访问。 一种方法是在单独的IP上设置单独的服务器实例,并使用防火墙来保护该实例。 另一种方法是在虚拟服务器上使用包含受限内容或目录的基于IP的块。 或者,您可以将它与要求客户使用由您的内部CA颁发的证书(如果有的话)结合使用。 或者将authentication与授权相结合的其他任何方式。
但希望贵公司以外的人不要尝试使用“秘密”主机名称,这不是一个有效的安全措施,无论您是否使用SSL / SNI。