我想写一个小的PHP应用程序来监视Debian服务器上的日志,包括syslog日志和Apache / PHP消息。 这里的问题是Apache用户(www-data)无法访问/ var / log目录。 授予PHP应用程序日志访问权限的最佳方式是什么? 我们假设日志文件可能非常大,如数百兆字节。
我有一些想法:
编写一个shell脚本,将通过sudo运行,并将最后512 Kb的日志logging到可由应用程序读取的单独文件中 – 这是无效的,因为分叉了一个新进程并且不得不重新读取数据
将www-data添加到adm组(可以读取日志) – 这是不安全的
每分钟通过cron启动一个PHP进程来读取日志 – 这不是很好,因为它不允许实时监控。 而且,即使我不读取日志,也会启动这个脚本,并消耗CPU时间(服务器在云端,我将不得不为此付费)
为权限降低的所有日志文件创build一个硬链接 – 我猜这样做是行不通的,因为logrotate可以重新创build日志文件,并且它们会更改inode编号。
在可能读取日志的特权用户下启动一个单独的nginx / Apache服务器。
也许有人得到更好的解决scheme?
我会build议使用rsyslogd直接login到可以通过PHP访问的MySQL数据库。 这是rsyslog支持的configuration。 我相信lenny + debian rsyslog是默认的syslogging器,所以它应该只是安装mysql,如果它不在那里,configuration安全性,设置表和configurationrsyslog。
http://www.rsyslog.com/doc/rsyslog_mysql.html
例:
*.* :ommysql:database-server,database-name,database-userid,database-password
希望这对你有帮助。
那么,虽然原来的post已经很安静了几个月,但我想和你分享一下我的方法:
在我的情况下,我只想监视/var/log/mail.log。 所以我把下面这行添加到/ etc / sudoers:
www-data ALL=(:adm) NOPASSWD:/bin/cat /var/log/mail.log
这允许www数据作为组adm的成员运行命令/bin/cat /var/log/mail.log 。
在PHP中,我只是打电话
$output = shell_exec('sudo -g adm cat /var/log/mail.log |/pipe/anywhere');
希望这种方法对某人有用…
如果您觉得我错过了一些安全问题,请发表评论
正如pablo提示的 – 日志文件不需要写入/ var / log。 他们不需要写在本地机器上 – 这些设置可以被configuration在盒子外面。 使用MySQL的问题是,你的日志logging系统突然变得非常复杂 – 当dbmsclosures时,调用的日志条目会发生什么?
您可以将文件设置为“other”可读(并且可以由其他文件执行的目录),请查看logrotate的手册页,了解如何控制日志文件的权限。
但是读取日志的过程不一定要由apache uid运行。 事实上,我build议运行cron作业 – 或者说是一个守护进程 – 作为不同的用户来读取日志 – 并将所需的信息提取到公共存储库。
C。