如果您告诉 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 身份运行。因此,保持程序简单且安全非常重要。
如果你描述的场景在某种程度上是正确的,你仍然可以通过以下方式回避这个问题:
- 忽略配置文件中给出的日志文件名
- 在脚本中设计自己的日志文件名
- 将 stdout 重定向到你选择的文件,如(2)
答案2
我遇到了同样的问题,但无法更改写入日志的脚本,但我可以更改解释日志的脚本。
设置:
- Apache 启动并创建日志文件,而
root:root
不是www-data:www-data
。这是由于原始发帖人的问题中提到的情况。 - 我想以非 root 用户身份在日志文件上运行分析脚本 (
www-data
),但它无法读取该文件。我以 root 用户 crontab 中的 cron 方式执行此操作 - 因此,在分析脚本运行之前,我运行(作为
root
)命令chown www-data:www-data /var/log/apache2/*.log
。这会将日志文件(但不是父目录)的所有权更改为www-data
预期,然后分析脚本就可以读取该文件。
这不是最好的解决方案,而且肯定不是您在繁忙的服务器上想要的,但是对于小型安装来说它已经足够好了。
gpjod 提及这可能是一个安全问题。Apache 文档表示日志目录不应被其他人写入。
这是真的,但对于解决 OP 问题的所有情况来说,这很可能都是真的,您可能希望阅读链接文档中的安全提示。由于在这个特定情况下,所有权从 更改为 ,root
正如www-data
预期的那样(参见原始问题),我认为我的解决方案没有产生额外的线索。