告诉 Apache 以不同的用户身份创建 error.log/access.log

告诉 Apache 以不同的用户身份创建 error.log/access.log

如果您告诉 Apache 使用 CustomLog 文件,Apache2 将在启动时创建这些文件。并且它始终将它们提供给用户 root:root。我该如何更改行为?

背景

Apache 运行

SuexecUserGroup www-data www-data

同时,我使用 CustomLog 将输出通过管道传输到脚本。该脚本从 IP 中删除两个字节,然后写入日志文件。由于您无法告诉 Apache 从 error.log 中省略 IP,因此此管道输出很重要(关于德国隐私法)。

如果这不属于www-数据

如果我改变所有者,一切都会正常。

我也知道如何更改文件所有者日志旋转重命名并重新创建日志文件。

但是,如果我停止 Apache 进程,删除日志文件,然后重新启动 Apache 进程,则会创建属于 root:root 的新文件。

我如何告诉 Apache 创建新的、无效的文件作为/为www-数据在启动时?

答案1

这个句子:

如果这不属于 www-data,则脚本无法访问我的自定义日志。

与……直接矛盾http://httpd.apache.org/docs/current/logs.html#piped

管道日志进程由父 Apache httpd 进程生成,并继承该进程的用户 ID。这意味着管道日志程序通常以 root 身份运行。因此,保持程序简单且安全非常重要。

如果你描述的场景在某种程度上是正确的,你仍然可以通过以下方式回避这个问题:

  1. 忽略配置文件中给出的日志文件名
  2. 在脚本中设计自己的日志文件名
  3. 将 stdout 重定向到你选择的文件,如(2)

答案2

我遇到了同样的问题,但无法更改写入日志的脚本,但我可以更改解释日志的脚本。

设置:

  1. Apache 启动并创建日志文件,而root:root不是www-data:www-data。这是由于原始发帖人的问题中提到的情况。
  2. 我想以非 root 用户身份在日志文件上运行分析脚本 ( www-data),但它无法读取该文件。我以 root 用户 crontab 中的 cron 方式执行此操作
  3. 因此,在分析脚本运行之前,我运行(作为root)命令chown www-data:www-data /var/log/apache2/*.log。这会将日志文件(但不是父目录)的所有权更改为www-data预期,然后分析脚本就可以读取该文件。

这不是最好的解决方案,而且肯定不是您在繁忙的服务器上想要的,但是对于小型安装来说它已经足够好了。

gpjod 提及这可能是一个安全问题。Apache 文档表示日志目录不应被其他人写入。

这是真的,但对于解决 OP 问题的所有情况来说,这很可能都是真的,您可能希望阅读链接文档中的安全提示。由于在这个特定情况下,所有权从 更改为 ,root正如www-data预期的那样(参见原始问题),我认为我的解决方案没有产生额外的线索。

相关内容