不,不要打开那罐虫子。
如果您允许发送者指定时间戳,您就允许攻击者欺骗他们希望隐藏的事件的时间戳。这违背了使用单独的机器进行日志记录的整个目的(安全方面)。
但是,您可以做的是比较当前时间和时间戳,并将其包含在每条记录的消息的开头,使用类似
struct timespec now;
struct timespec timestamp;
double delta;
int priority = facility | level;
const char *const message;
delta = difftime(timestamp.tv_sec, now.tv_sec)
+ ((double)timestamp.tv_nsec - now.tv_nsec) / 1000000000.0;
syslog(priority, "[%+.0fs] %s\n", delta, message);
在典型配置的 Linux 机器上,它应该产生类似于
Jan 18 08:01:02 hostname service: [-1s] Original message
假设消息至少需要半秒钟才能到达。如果主机名的时钟运行得很快,则增量将为正数。通常,增量为零。在网络非常慢的情况下,增量为负,因为原始事件相对于显示的时间戳发生在过去。
如果您已经有基础设施来监控记录的消息,您可以让守护程序或 cron 脚本读取日志文件,并生成新的日志文件(不是通过syslog()
,而是简单地使用字符串和文件操作),时间戳由指定的增量。然而,这必须非常小心地完成,识别不可接受或意外变化的增量,或者以某种方式标记它们。
如果您编写日志文件监控/显示小部件,那么您可以非常轻松地让用户在“实际”(syslog)或“派生”(syslog + delta)时间戳之间切换,因为从记录的行中提取 delta 是微不足道的,如果永远存在;即使这样,您也必须小心让用户知道增量是否超出范围或意外更改,因为这样的更改最总是能向用户提供信息。(如果它不是恶意的,这确实意味着机器计时有问题;时间不应该只是跳跃。即使是 NTP 调整也应该相当顺利。)
如果您坚持要打开那罐蠕虫,只需生成您自己的日志文件。许多应用程序都这样做。毕竟,这不像syslog()
是灵丹妙药或对可靠日志记录的严格要求。
如果您的日志接收应用程序作为特定用户和组运行,您可以创建/var/log/yourlogs/
由 root 用户和该组拥有的用户,并将您的日志文件保存在那里。将目录模式设置为02770
(drwxrws---
或u=rwx,g=rwxs,o=
),在该目录中创建的所有文件将自动归同一组所有(这就是 setgid 位 ,s
对目录所做的事情)。您只需要确保您的服务将 umask 设置为002
(并在创建日志文件时使用0666
或0660
模式标志),以便它们保持组可读和组可写。
日志轮换(归档和/或删除旧日志文件、邮寄日志)通常是一个单独的服务,由软件包提供,并通过在安装时logrotate
放入特定于服务的配置文件进行配置。/etc/logrotate.d/
换句话说,即使您编写自己的日志文件,也不要轮换它们;为此使用现有服务。它使您的用户(我们的系统管理员)的生活变得更加轻松。(注意:umask 002
在上述目录情况下,在日志轮换脚本的开头设置非常有用;创建的文件将是组可写的。umask 022
将使它们成为组只读的。)