出于安全原因,我希望能够监控对我的 Web 服务器上的某个文件的访问。每次访问它时,我都希望在 MySQL 日志表中添加一个条目。这样,我可以从 Web 应用程序中主动响应安全漏洞。
3 回答
Apache HTTP 服务器提供日志记录功能。
服务器访问日志记录了服务器处理的所有请求。访问日志的位置和内容由CustomLog指令控制。LogFormat指令可用于简化日志内容的选择。本节介绍如何配置服务器在访问日志中记录信息。
它可用于将日志写入文件。如果需要存储在 MySQL 表中,请运行 cron 作业将文件导入数据库。
关于日志的更多信息在这里: http ://httpd.apache.org/docs/1.3/logs.html#accesslog
它已从 PHP7 中删除,但对于发现这篇文章的其他人来说,FAM(现在的 PECL)扩展中有许多选项。这个函数http://php.net/manual/en/function.fam-monitor-file.php似乎描述了这里需要什么
此外,您可以通过http://php.net/manual/en/function.stat.php访问有关文件状态的大量详细信息。把它放在一个 cron 或 sleep 驱动的脚本中,然后你就可以看到它什么时候改变了。
可以从三个点访问该文件:
- 直接文件系统访问
- 像这样调用 url
www.example.com/importantfile.jpg
(apache 提供文件) - 调用服务器
www.example.com/readfile.php?name=important.jpg
上读取文件的一些 php 脚本。
如果您只关心案例 2,请查看 Rishi Dua 的解决方案。
但是,如果您想要更多,那么您应该编写一个带有fileatime()调用的脚本,然后将其添加到 cron 以例如每分钟运行一次。
它的伪代码:
<?php
$previous_access_time = get_previous_access_time(); // get the previous last access time from you remembered in db or textfile or whatever
$current_access_time = fileatime('path/to/very_important_file.jpg');
if ($previous_access_time != $current_access_time) {
log_access_to_db();
save_new_access_time(); // update the new last access time
}
然而,该解决方案存在一些问题。首先是您只能获取访问时间,但不能获取访问文件的用户 ID 或 IP。其次,正如手册所说,某些Unix系统不会更新访问时间,因此解决方案会失败。
如果您非常关心安全性,那么我认为您必须检查一些像这样的审计工具