我想编写一个小型 PHP 应用程序来监控 Debian 服务器上的日志,包括 syslog 日志和 Apache/PHP 消息。这里的问题是 Apache 用户 (www-data) 无权访问 /var/log 目录。授予 PHP 应用程序访问日志的最佳方式是什么?我们假设日志文件可能非常大,例如数百兆字节。
我有一些想法:
编写一个 shell 脚本,通过 sudo 运行,并将最后 512 KB 的日志拖放到一个单独的文件中,该文件可供应用程序读取 - 这种方法效率低下,因为需要分叉一个新进程,并且必须读取两次数据
将 www-data 添加到 adm 组(可以读取日志)-这是不安全的
每分钟通过 cron 启动一个 PHP 进程来读取日志 — 这不是很好,因为它不允许实时监控。此外,即使我不读取日志,这个脚本也会启动,并消耗 CPU 时间(服务器在云端,我必须为此付费)
为所有具有降低权限的日志文件创建硬链接 - 我猜,这不起作用,因为 logrotate 可以重新创建日志文件,并且它们会更改 inode 编号。
在可以读取日志的特权用户下启动一个单独的 nginx/Apache 服务器。
也许有人有更好的解决方案?
答案1
我建议使用 rsyslogd 直接记录到 php 可以访问的 mysql 数据库。这是 rsyslog 支持的配置。我相信 lenny+ for debian rsyslog 是默认的系统记录器,因此如果还没有安装 mysql,则只需安装它,然后配置安全性、设置表并配置 rsyslog。
http://www.rsyslog.com/doc/rsyslog_mysql.html
例子:
*.* :ommysql:database-server,database-name,database-userid,database-password
希望这对你有帮助。
答案2
好吧,尽管原始帖子已经有几个月了,但我还是想与大家分享我的方法:
就我而言,我只想监视 /var/log/mail.log。因此,我将以下行添加到 /etc/sudoers:
www-data ALL=(:adm) NOPASSWD:/bin/cat /var/log/mail.log
/bin/cat /var/log/mail.log
这允许 www-data以组 adm 成员的身份运行该命令。
在 PHP 中我只需调用
$output = shell_exec('sudo -g adm cat /var/log/mail.log |/pipe/anywhere');
希望这种方法对某些人有用...
如果您觉得我遗漏了一些安全问题,请发表评论
答案3
正如 pablo 所暗示的 - 日志文件不需要写入 /var/log。它们不需要写入本地机器 - 这些设置可以立即配置。使用 MySQL 的问题是,您的日志系统突然变得非常复杂 - 当数据库管理系统关闭时,调用的日志条目会发生什么?
您可以将文件设置为“其他人”可读(并将目录设置为其他人可执行),查看 logrotate 的手册页以了解如何控制日志文件的权限。
但是读取日志的进程不必由 apache uid 运行。事实上,我建议以不同的用户身份运行 cron 作业(或最好是守护进程)来读取日志,并将所需的信息提取到公共存储库中。
C。