为程序启动、会话启动和可疑活动写入审计日志。 可能有价值的信息包括日期、时间、uid、euid、gid、egid、终端信息、进程 ID 和命令行值。 您可能会发现 syslog(3) 函数对于实现审计日志很有帮助。 一个棘手的问题是,任何日志记录系统都应该能够记录大量信息(因为这些信息可能非常有用),但是如果信息处理不当,信息本身可能会被用来发起攻击。 毕竟,攻击者控制着发送到程序的一些输入。 当记录可能的攻击者发送的数据时,请识别“预期”字符列表并转义任何“意外”字符,以使日志不会损坏。 不这样做可能会成为一个真正的问题; 用户可能包含控制字符(尤其是 NIL 或行尾符)等字符,这些字符可能会导致实际问题。 例如,如果攻击者嵌入换行符,他们可以通过在换行符后跟所需的日志条目来伪造日志条目。 可悲的是,似乎没有转义这些字符的标准约定。 我倾向于使用 URL 转义机制(%hh,其中 hh 是转义字节的十六进制值),但也存在其他机制,包括 C 约定(\ooo 表示八进制值,\X 表示特殊符号,例如,\n 表示换行符)。 还有插入符号系统(^I 是 control-I),尽管它不能优雅地处理超过 127 的字节值。
存在用户可能通过执行大量事件来创建拒绝服务攻击(或至少停止审计)的危险,这些事件会削减审计记录,直到系统耗尽资源来存储记录。 应对此威胁的一种方法是限制审计记录的记录速率; 如果正在削减“太多”审计记录,则有意降低响应速率。 您可以尝试仅降低对可疑攻击者的响应速率,但在许多情况下,单个攻击者可以伪装成许多潜在用户。
当然,选择什么是“可疑活动”取决于程序的功能及其预期用途。 任何未能通过前面讨论的过滤检查的输入当然都是候选对象(例如,包含 NIL)。 应该记录可能并非正常使用产生的输入,例如,CGI 程序中以可疑方式缺少某些必填字段。 在许多情况下,任何包含 /etc/passwd 或 /etc/shadow 等短语的输入都非常可疑。 同样,尝试访问 Windows “注册表”文件或 .pwl 文件也非常可疑。
不要在审计记录中记录密码。 人们经常会意外输入其他系统的密码,因此记录密码可能会使系统管理员能够侵入管理员域外的其他计算机。