我有一个关于 Apache 安全性的一般问题DocumentRoot
,这个问题来自我在安装 Galaxy(一种生物信息学 Web 服务和基础设施)时读到的一份声明。声明中说
“请注意,Galaxy 绝不能位于 Apache 的 DocumentRoot 内的磁盘上。
默认情况下,这会将 Galaxy 的所有内容(包括数据集)暴露给网络上的任何人。”
此段摘自 https://wiki.galaxyproject.org/Admin/Config/ApacheProxy
DocumentRoot
那么问题是将一些内容放入与 放入 的子目录中有什么区别DocumentRoot
?即使将内容默认放在子目录中,是否所有内容也会暴露给网络上的任何人?
如果我将内容放入DocumentRoot
服务器SSL
,并且只允许经过身份验证和授权的用户访问,这是否可以解决全球访问问题?
更新:感谢大家的深思熟虑的回答。我想我所有的问题都得到了答案。总结一下:
除非设置了不同的权限,否则每个人都可以访问 DocumentRoot 中的子目录。
SSL 仅保护网络上传输的数据包,而不保护文件的权限。
身份验证/授权将限制谁可以访问 DocumentRoot。
Unix/Linux 文件权限不会影响访问,因为所有文件都必须由 Web 服务器所有者访问。
答案1
DocumentRoot 的子目录仍被视为在 DocumentRoot 内。
当某些软件包建议不要将包的一部分放在 DocumentRoot 内部时,其目的是让它实际上位于 DocumentRoot 之外。
例如,如果你的 DocumentRoot 是/var/www/example.com/html
你可能想把这些文件放在其他地方,比如说/var/www/example.com/restricted
并且,SSL 并没有解决,甚至没有解决在文档根目录内有敏感配置文件的问题!
答案2
补充 Joe Sniderman 的回答,将文件放在文档根目录之外会使在浏览器中输入 URL 的用户无法访问它们,但仍然可供在文档根目录中运行的脚本访问。
例如,您可以创建一份匿名化并汇总用户登录数据的报告。您将脚本放在文档根目录中,以便/var/www/example.com/html/report.php
其他人可以看到您的网站有多受欢迎。
您的报告必须使用原始用户数据,因此它会引用一个文件/var/www/example.com/restricted/login.log
作为源。此文件不在文档根目录中,因此只能通过 report.php 访问,而 report.php 无论如何都会匿名化数据。您不会希望原始数据公开,因此您需要将这些敏感数据放在文档根目录之外。
答案3
DocumentRoot 下的所有内容都被视为网站的一部分,如果您知道路径,Apache 将适时提供它们。
但....
保护文件夹非常简单。只需为其制定重写规则、访问控制等即可。
但最好将各种脚本放在其他地方。其他答案有这样的几行:
/var/www/example.com/restricted
但那并不在 DocumentRoot 之外。这是在外面:
/var/www/example.com-scripts/
或者:
/var/admin-code/example.com/
或者文件系统中的其他任何地方。您所需要的只是希望其代码位于其他地方的软件,以及一个配置设置,告诉它文件夹的位置。
如上所述,SSL 不会为您做任何事情,除了确保黑客 #2 无法窃听黑客 #1 读取您的数据库密码。
答案4
引文
“请注意,Galaxy 绝不能位于 Apache 的 DocumentRoot 内的磁盘上。默认情况下,这会将 Galaxy 的所有内容(包括数据集)暴露给网络上的任何人。”
适用于特定软件以及它期望如何完成设置!
根据上述内容,默认的 Galaxy 配置可能意味着DocumentRoot 之下(“内部”)的所有文件都可以访问。
这就是为什么你应该将无法访问的文件移出那里。
在其他安装或 Galaxy 的非标准安装中,此假设可能不成立。具体来说,Directory
指令可能会打开或关闭文件系统的某些部分,Location
指令可能会打开或关闭 URI 树的某些部分,Alias
指令可能会将文件系统子树映射到 URI,文件系统级权限以及强制访问控制(通过 SELinux 或其他系统= 可能会允许或授予 Web 服务器进程对文件系统某些部分的访问权限。
“移出 DocumentRoot” 的一个例子: