CA ControlMinder 编写审核日志的格式不是公共可用的。 但是,使用该 API 的程序员有必要了解审核日志文件格式的基础知识。 本部分提供程序员必须了解的信息。
审核日志文件包括文件标头,后接记录(按顺序写入文件)。 每个记录都包括记录标头,后接特定于该记录的信息。 每个记录的标头包含以下信息:记录放入文件的时间、记录类型(仅应用程序知道的代码)以及紧接着标头的记录的大小。 数据采用压缩格式编写;记录标头中指定的记录大小是压缩数据的大小(以字节为单位)。 下图大致显示文件的格式。
使用该 API 的程序员不需要了解压缩算法或文件的确切格式。 传递给用户应用程序的信息采用未压缩格式放入结构中。 应用程序只需简单地从结构中检索信息。
本地 CA ControlMinder 目录下的 API 子目录包含 API 标头文件和库函数。 CA ControlMinder 程序包还包括演示 LogRoute API 使用的以下示例程序-将目标 syslog 添加到 CA ControlMinder 以向 UNIX 系统日志发送审核信息。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本 :8.0 文件 :audit2syslog.c 目的 :提供 selogrd API 示例用法, 将审核日志记录放入 UNIX syslog。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ============================================================*/ #define __LOGRSAMPLE_C #include <syslog.h> #include <lograpi.h> /* 包括 API 所需的 .h 文件 */ /* 本地函数的原型 */ static int sample_Sense(SEOS_ROUTENTRY *pre); static void sample_Free(SEOS_ROUTENTRY *pre); static int sample_Send(LOGRECORD *plr, SEOS_ROUTENTRY *pre, int notify, void *data); /* * 我们不使用新路由类型目标的代码, * 但是如果我们需要多个目标类型, * 可以使用它来区分这两者。 */ static int our_dest_type_code; /* * 此处我们保留配置文件 * 所需的 syslog 优先级。 * 当然,这意味着通过将其存储在全局变量中, * 我们可以在 syslog 配置文件中 * 只提供一个路由行。 其他行只会 * 覆盖此变量。 */ static int syslog_priority; /* * 这类似于我们的“main”函数。 该函数是 * selogrd 调用的函数。 */ int lograpi_RegisterDestinations(void) { static LOGRAPI_FUNCS funs = {sample_Send, sample_Free, sample_Sense}; /*...*/ return lograpi_RegisterTargetType(“syslog”, &funs, &our_dest_type_code); } static int sample_Sense(SEOS_ROUTENTRY *pre) { /* 实际上我们无需执行任何操作, * 因为此处应该有 syslog。 * 不管怎样,只需演示要执行的操作, * 我们将查看此函数类型中的目标名称, * 我们将检查目标是否是 * 一个已知的 syslog 优先级。 */ typedef struct tagAllowedDestNames { char const *name; int code; } ALLOWED_DEST_NAMES; static ALLOWED_DEST_NAMES allowed_names[] = { {“LOG_EMERG”, LOG_EMERG}, {“LOG_ALERT”, LOG_ALERT}, {“LOG_CRIT”, LOG_CRIT}, {“LOG_ERR”, LOG_ERR}, {“LOG_WARNING”, LOG_WARNING}, {“LOG_NOTICE”, LOG_NOTICE}, {“LOG_INFO”, LOG_INFO}, {“LOG_DEBUG”, LOG_DEBUG}, {NULL, 0} }; register int i; for (i = 0; allowed_names[i].name != NULL; i++) { if (strcmp(allowed_names[i].name, pre‑>out) == 0) { /* 保留我们应当在 syslog 中使用的方法 */ syslog_priority = allowed_names[i].code; return 0; } } return 1; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ static void sample_Free(SEOS_ROUTENTRY * pre) { /*...*/ /* 现在真的无需执行任何操作 */ } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ static int sample_Send(LOGRECORD * plr, SEOS_ROUTENTRY * pre, int notify, void *data) { char *as_string; if (notify) /* 忽略所有 NOTIFY 消息 */ return 0; as_string = lograpi_MakeStringMessage(plr, data); if (as_string != NULL) syslog(syslog_priority, as_string); return 0; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
CA ControlMinder 允许您将通知信息作为与用户或资源记录关联的字符串存储在数据库中。 管理员可以指定每次尝试访问资源时要通知的邮件地址。 通知请求作为特殊审核日志记录存储在审核日志文件中。 selogrd 将通知请求路由到审核日志记录中指定的目标的邮件或屏幕地址。
给定事件的通知记录与该事件关联的标准审核日志记录相同,只是通知记录还将其目标存储在审核日志记录的开头。 通知记录的日志代码就是偏移的常规审核日志记录的日志代码,偏移量为 2048。 例如,正常的登录审核日志记录的日志类型代码为 1。 则通知日志类型代码为 2049。 请注意,审核日志记录可以显示在审核日志文件中,后接同一事件的通知记录。
通知记录的结构名称的格式为 SEOSNF_AUDIT*。 确切名称与匹配的审核日志记录名称相对应:
通知记录 |
审核日志记录 |
---|---|
SEOSNF_AUDITADMIN |
SEOS_AUDITADMIN |
SEOSNF_AUDITGENR |
SEOS_AUDITGENR |
SEOSNF_AUDITINWARN |
SEOS_AUDITINWARN |
SEOSNF_AUDITLOGIN |
SEOS_AUDITLOGIN |
SEOSNF_AUDITWDWARN |
SEOS_AUDITWDWARN |
在每个结构中,第一个字段都是 SEOS_NOTIFYSTR(最大 30 字节的缓冲区),用于保留从数据库调用的目标字符串。 第二个字段是对应于该通知记录的审核日志记录。
CA ControlMinder 提供以下函数:
必须位于共享库中,且在 selogrcd 启动时调用。
必须位于共享库中,且在 selogrcd 关闭时调用。
必须位于共享库中,且在 selogrd 启动时调用。
必须位于共享库中,且在 selogrd 关闭时调用。
将审核日志记录转换为文本字符串对的向量。
将审核日志记录结构转换为 seaudit 和 seauditx 使用的单行文本格式。‑
通知 CA ControlMinder 有关注册的新目标类型的确切实施详细信息。
删除之前使用日志路由后台进程注册的目标类型。
测试是否存在 exit 函数。
注册 exit 函数。
取消注册 exit 函数。
实施新目标类型的 LogRoute API 函数必须为以下任务提供代码:
释放按存储、套接字等用户代码分配的内存,并关闭所有网络连接。
将选定的审核日志记录发送给用户指定的目标。‑
在每个配置文件行中测试目标地址的正确性。
driver_Register 函数是预定义函数,在 selogrcd 后台进程启动时调用。 您可以将自己的代码插入 driver_Register,以注册所有新的自定义目标类型。 该函数应当注册每个审核记录类型所需的 exit 函数。
函数同时出现在 selogrcd 的路由配置文件和扩展配置文件中时,将 driver 替换为目标类型。
int driver_Register (void);
如果函数成功,则应返回 0。 如果失败,则返回非零整数错误代码。 可以在 syslog 中看到该返回代码。 如果 selogrcd 处于调试模式,也可以在屏幕上看到该返回代码。
driver_UnRegister 函数是预定义函数,在 selogrcd 后台进程关闭时调用。 您可以将自己的代码插入 driver_UnRegister,以取消注册所有已注册的目标类型。
函数同时出现在 selogrcd 的路由配置文件和扩展配置文件中时,将 driver 替换为目标类型。
int driver_UnRegister (void);
如果函数成功,则应返回 0。 如果失败,则返回非零整数错误代码。 可以在 syslog 中看到该返回代码。 如果 selogrcd 处于调试模式,也可以在屏幕上看到该返回代码。
driver_RegisterDestination 函数是预定义函数,在 selogrd 后台进程启动时调用。 您可以将自己的代码插入 driver_RegisterDestination,以注册所有新的自定义目标类型。
函数同时出现在 selogrd 的路由配置文件和扩展配置文件中时,将 driver 替换为目标类型。
加载共享库时调用函数。 该函数应通过调用函数 lograpi_RegisterTargetType 初始化库并注册新目标类型。
int driver_RegisterDestination (void);
如果函数成功,则应返回 0。 如果失败,则返回非零整数错误代码。 可以在 syslog 中看到该返回代码。 如果 selogrd 处于调试模式,也可以在屏幕上看到该返回代码。
driver_UnregisterDestination 函数是预定义函数,在系统终止时由 selogrd 后台进程调用。 您可以将自己的代码插入 driver_UnregisterDestination,以取消注册所有已注册的目标类型。
重要说明! 取消注册目标类型后,无法在当前会话期间再次进行注册。 但是,所有后续记录会好像成功发送给目标一样进行标记。 因此,请勿取消注册目标类型,除非您确实不会再在当前会话期间使用该目标类型。
函数同时出现在 selogrd 的路由配置文件和扩展配置文件中时,将 driver 替换为目标类型。
加载共享库时调用函数。 该函数应通过调用函数 lograpi_RegisterTargetType 初始化库并注册新目标类型。
int driver_UnregisterDestination (void);
如果函数成功,则应返回 0。 如果失败,则返回非零整数错误代码。 可以在 syslog 中看到该返回代码。 如果 selogrd 处于调试模式,也可以在屏幕上看到该返回代码。
lograpi_InterpretRecord 函数将审核日志记录转换为文本字符串对的向量。 每一对都包含记录中字段的标签和该字段的文本。 成员标签和值都为 NULL 指针时,向量本身结束。 特定字段在审核记录中没有值时,该值可能为 NULL 指针。
如果函数成功,则返回指向结构向量的指针。 向量中的每个元素都是包含以下两个成员的结构:标签和值。 标签和值指针指向任意函数调用所覆盖的静态内存区域。 两个成员都为 NULL 指针时,向量本身结束。
用户请求有关显示记录的更多详细信息时,seauditx 实用程序将采用类似于以下内容的格式显示审核记录。
SEOS_AUDLOGINTERP * lograpi_InterpretRecord P(LOGRECORD *plr, void *unc_buff);
指向审核日志记录结构的指针,传递给 LogrApiSendFunc 函数。
指向未压缩审核日志记录信息的指针,传递给 LogApiSendFunc 函数。
lograpi_RegisterTargetType 函数使用日志路由后台进程注册新目标类型。 lograpi_RegisterTargetType 向 LOGRAPI_FUNCS 结构提供指向以下用途的三个用户函数的指针:感应有效配置文件条目,发送记录,以及释放分配的内存空间。 lograpi_RegisterTargetType 通常由 driver_RegisterDestination 函数调用,用于使用日志路由器注册您的函数。
如果函数成功,则返回 0。 如果函数失败,则返回不带符号的整数错误代码,并根据以下值表向全局变量 errno 分配值:
返回值 |
ERRNO |
含义 |
---|---|---|
LOGRAPI_E_DESTFULL |
ENOMEM |
目标表已满;最大表大小为 10 个元素。 |
LOGRAPI_E_NULLPARAM |
EINVAL |
其中一个参数为 NULL。 |
LOGRAPI_E_NOSENDFUNC |
EINVAL |
没有指定 send 函数。 |
int lograpi_RegisterTargetType (const char *name, LOGRAPI_FUNCS *funcs, int *code);
最新添加的目标类型的名称。
指向 LOGRAPI_FUNCS 结构的指针,包含三个目标类型函数:LogrApiSendFunc、LogrApiFreeFunc 和 LogrApiSenseFunc。
分配给该目标的代码。 该代码是存储在 SEOS_ROUTENTRY 结构的目标数据成员中的值。
版权所有 © 2013 CA。
保留所有权利。
|
|