Apache 网络内容所有者的最佳实践?(www-data、root、用户等?)

Apache 网络内容所有者的最佳实践?(www-data、root、用户等?)

对于简单的 LAMP 设置,处理 /var/www 目录(或子目录)的文件所有权的最安全方法是什么?

Apache 以 www-data 的身份运行,因此如果它是所有者,它将具有写入权限。这可能是一个坏主意,但是可以方便文件上传。

如果它们归 root 所有,是否存在任何安全问题?

让每个用户成为其 /var/www/site 文件夹的所有者是否有意义?(我知道 ~/public_html 是执行此操作的正确方法,但是将所有 Web 内容放在 /var/www/ 下可以轻松查看服务器上当前正在运行的网站)

答案1

如果 httpd 用户能够读取这些内容,则这些内容归 root 所有应该不会有问题。

用户资料应放在 下/srv,而不是 下/var/www。他们可以在那里拥有自己的代码和数据。

答案2

您的安全关注级别取决于这是面向内联网还是面向互联网(尽管根据您的防火墙和整体网络安全,“在内联网中更安全”可能会产生误导)。

让 apache 用户拥有文件的写权限不利于安全。如果服务器被 root,那么他们可以更改内容。当然,允许未经审查的文件上传是一个更大的安全问题 - 不需要 apache 漏洞。你最好将文件上传到 Web 服务器之外的某个目录,等待审查,然后移至 Web 服务器区域。

如果文件归 root 所有,则只有 root 用户才能修改它们。这意味着所有更改它们的进程都需要 root 权限,这是一个安全问题。您是否愿意为所有 Web 内容作者提供 root/sudo 权限?我不建议这样做。

如果可能的话,apache 及其日志应放在单独的卷上,至少应放在 /bin/ 和 /var 之外。过大的日志文件或巨大的上传文件可能会导致您的操作系统拒绝服务 - Linux 系统在 /var 分区 100% 满的情况下会表现异常。

如果您要让用户全面使用 LAMP,那么您必须担心用户的编码技能。尽可能确保 PHP 的安全(唉,为什么没有更好的语言,PHP 确实很糟糕,但对于快速内容来说,没有什么比它更好了)。仅编译使用参数化查询的数据库访问(消除了几乎所有的 sql 注入攻击)。在 MySQL 中设计您的架构和授权,以便隔离所有用户。

答案3

我在类似情况下利用组权限:

  • 每个网站都有专门的用户和组

  • Apache 应读取的所有文件和目录都是所有者可写且组可读的(umask 设置为027),并且属于相应的网站组

  • 非特权 Apache 用户www-data是每个网站组的成员

  • 管理的目录和文件网站管理员(网络内容)归相应用户所有

  • 一切由服务器admins:Web 应用程序、CGI 脚本、SSL 证书等,放置在单独的目录中,并由 root 拥有。使用AliasScriptAlias指令可以访问它们。

  • CGI 脚本和 Web 应用程序必须具有写入权限的目录由www-data和相应的网站组拥有,并已setgid设置位 ( chmod g+s)。因此,在其中创建的文件属于网站组,而不是www-data,并且可以由网站管理员读取。

相关内容