在编译代码之后,将生成一个包含编译版本代码的共享库。 apisamples 目录包含演示该过程的示例函数和 makefile。 请注意,编译共享库通常需要使用其他编译器参数来创建位置独立代码。‑ 有关如何在特定系统中创建共享库的信息,请参阅编译器或链接器文档。
在编写代码并创建共享库之后,将共享库添加到与代码应链接到的程序相关的“按需”共享库配置文件中。‑
如果已编写以下后台进程或程序之一的共享库,则将共享库添加到相关文件中(可能需要使用 apisamples 目录中的示例创建这些 .ext 文件):
每个文件都包含两列:驱动程序名称和共享库路径。 按照惯例,驱动程序名称是与您的目标类型具有相同名称的字符串;不过,它可以是任何有效的 C 语言符号。
例如,如果您已编写代码来实施传呼机,则目标名称应为 pager,完整文件条目将为:
pager /usr/local/lib/libseospager.so
该文件条目意味着后台进程 seosd 在启动时加载共享库并调用您的函数:
/usr/local/lib/libseospager.so
尽管一些系统支持名为 _init 的预定义函数,但建议您改用 driver_RegisterDestination 函数。 这实际上是从共享库调用的第一个函数。 函数 driver_RegisterDestination 可注册新目标类型。
在后台进程关闭时,建议您使用函数 driver_UnregisterDestination,而不是预定义函数 _fini。
注意:使用 CA ControlMinder 函数而不是预定义的系统函数将为您的代码赋予更高的可移植性。
后台进程 seosd 与 sepass 使用相同的文件配置格式。
在编译代码之后,将生成一个包含编译版本代码的动态链接库。 SDK 目录包含演示该过程的示例函数和 makefile。 请注意,编译动态链接库通常需要使用其他编译器参数。 有关如何在特定系统中创建动态链接库的信息,请参阅编译器或链接器文档。
在编写代码并创建动态链接库之后,您应按如下所示将其安装在 CA ControlMinder 注册表树中:
HKEY_LOCAL_MACHINE\Software\ComputerAssociates\AccessControl\Exits\Engine
值:退出动态链接库的完整路径。
值:任何有效的 C 语言符号。
示例:如果前缀是“TEMP”,则动态链接库中的注册函数名称为 TEMP_RegisterExit。
由于 CA ControlMinder 会拦截操作系统调用,因此当您在执行授权操作时,并非所有系统活动都被允许。 无法从 seosd 的退出 API 函数中调用以下函数:
所在环境: |
不使用的函数: |
---|---|
运行 CA ControlMinder 的 NIS 或 DNS 服务器、Solaris 2.5.x 及更高版本 |
getgrent getgrgid etgrnam gethostbyaddr gethostbyname gethostent getnetbyaddr getnetbyname getnetent getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent |
运行 CA ControlMinder 的任何工作站 |
getrpcbyname getrpcbynumber getrpcent |
CA ControlMinder 使用定义为整数并且由两个字节组成的错误代码。 MSB 包含一个层代码,而 LSB 包含一个特定于该层的错误代码。 这样,可定义多达 256 个不同的层,并且每层可以有 256 个不同的错误代码。 为简化错误代码管理,CA ControlMinder 使用宏 _SEOS_RC。 退出 API 也使用宏 AUTHXAPI_MODULE 定义层代码。 不要自行在代码中使用这些宏,否则可能会遇到编译问题。
CA ControlMinder 对返回代码使用以下约定:返回值零表示成功;其他任何值表示错误。
CA ControlMinder 程序包包含以下两个演示退出 API 使用的示例程序。
apisamples 目录包含 API 标头文件(位于 include 子目录中)和库函数(位于 lib 子目录中)。
以下程序在 seosd 后台进程执行任何操作时调用一个由用户定义的特殊 exit 函数。‑ 该函数保留每个操作执行次数的统计信息。 当该函数感应到 root 用户登录时,将输出收集的信息。 有关此函数要点的更详细解释位于源代码之后。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本 :8.0 文件 :seosdexits.c 用途 :eTrust 后台进程退出示例。 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ #define __SEOSEXIT_C /* 系统标头 : * sys/types.h :我们常用 uid_t * stdio.h :printf * string.h & memory.h :memcpy */ #include sys/types.h #include stdio.h #include string.h #include memory.h /* authx API 标头文件 */ #include authxapi.h /* 这是一个用于构建 * Access Control 退出模块的示例程序。 * 此模块仅“输出”信息并 * 收集有关事件数目的统计信息。 * 当“root”用户登录时, * 将输出统计信息。 */ typedef struct { int nPreRes; int nPostRes; int nPreLogin; int nPostLogin; int nPreInet; int nPostInet; } EXIT_CALLS_COUNTERS; static EXIT_CALLS_COUNTERS counters; static void print_my_statistics(void) { printf(“General Resource ... Pre %6d Post %6d\n” “Login .............. Pre %6d Post %6d\n” “Internet TCP ....... Pre %6d Post %6d\n”, counters.nPreRes, counters.nPostRes, counters.nPreLogin, counters.nPostLogin, counters.nPreInet, counters.nPostInet); } static int ExitFunc_PreResource(void *data, SEOS_EXITRES *p_sexr) { SEOS_EXITGENR *ptr; ptr = (SEOS_EXITGENR *)data; counters.nPreRes++; printf(“Pre General Resource Class %s\n”, ptr‑>szClass); return 0; } static int ExitFunc_PostResource(void *data, SEOS_EXITRES *p_sexr) { SEOS_EXITGENR *ptr; ptr = (SEOS_EXITGENR *)data; counters.nPostRes++; printf(“Post General Resource Class %s\n”, ptr‑>szClass); return 0; } static int ExitFunc_PreLogin(void *data, SEOS_EXITRES *p_sexr) { SEOS_EXITLOGIN *p_sexl; char buff[20]; char const *p; p_sexl = (SEOS_EXITLOGIN *)data; counters.nPreLogin++; if (p_sexl‑>szUname == NULL) {p = buff; sprintf(buff, “UID=%u”, p_sexl‑>luid);} else p = p_sexl‑>szUname; printf(“Pre Login For %s\n”, p); /* 供 ROOT 输出一些统计信息 */ if (p_sexl‑>luid == (uid_t)0) print_my_statistics(); return 0; } static int ExitFunc_PostLogin(void *data, SEOS_EXITRES *p_sexr) { SEOS_EXITLOGIN *p_sexl; char buff[20]; char const *p; p_sexl = (SEOS_EXITLOGIN *)data; counters.nPostLogin++; if (p_sexl‑>szUname == NULL) {p = buff; sprintf(buff, “UID=%u”, p_sexl‑>luid);} else p = p_sexl‑>szUname; printf(“Post Login For %s\n”, p); /* 供 ROOT 输出一些统计信息 */ if (p_sexl‑>luid == (uid_t)0) print_my_statistics(); return 0; } static int ExitFunc_PreInet(void *data, SEOS_EXITRES *p_sexr) { /* 不要花太多精力在 TCP 上 */ counters.nPreInet++; return 0; } static int ExitFunc_PostInet(void *data, SEOS_EXITRES *p_sexr) { /* 不要花太多精力在 TCP 上 */ counters.nPostInet++; return 0; } int sample_RegisterExit(void) { int rc; memset(&counters, 0, sizeof(counters)); rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_PREGNRES, ExitFunc_PreResource); if (rc) return rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_POSTGNRES, ExitFunc_PostResource); if (rc) return rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_PRELOGIN, ExitFunc_PreLogin); if (rc) return rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_POSTLOGIN, ExitFunc_PostLogin); if (rc) return rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_PREINET, ExitFunc_PreInet); if (rc) return rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_POSTINET, ExitFunc_PostInet); return rc; } void sample_UnregisterExit(void) { /* 我们在此示例中没有需要执行的操作 */ }
authxapi.h 标头文件包含使用该 API 所需的原型和定义。 该代码声明一个新类型 EXIT_CALLS_COUNTER。 此结构包括 API 注册的每个事件的计数器。 已声明该新本地类型的静态变量。 列出的常规资源检查函数和 TCP/IP 请求函数均为简单的计数器。 登录函数具有相同的计数器,并且还会将已登录用户的用户 ID 与 0 进行比较。‑ 登录函数利用 UNIX 的 root 用户 ID 为 0 这一事实来避免从系统数据库中提取真实用户信息。
注意:此示例将输出到屏幕上。 CA ControlMinder 后台进程不应使用屏幕输出,因为屏幕输出会导致性能显著降低。
SDK 目录包含 API 标头文件(位于 include 子目录中)和库函数(位于 lib 子目录中)。
以下程序在 seosd 服务执行任何操作时调用一个由用户定义的特殊 exit 函数。 该函数保留每个操作执行次数的统计信息。 当该函数感应到 Administrator 用户登录时,将输出收集的信息。 有关此函数要点的更详细解释位于源代码之后。
/*======================================================================== 项目: eTrust Access Control 8.0 for Windows NT/2000 模块: eTrust 引擎退出示例。 文件: main.c 用途: eTrust 引擎退出 DLL 演示用户 如何在前检查和后检查中使用 eTrust 引擎授权的示例。 用法: 构建 ExitsExample.dll 并使用 eTrust Access Control 8.0 for Windows NT/2000 文档配置注册表和文件 系统。 ======================================================================== 版权所有 2004 Computer Associates International, Inc. ======================================================================== */ #include <stdio.h> #include <authxapi.h> typedef struct { int nPreRes; int nPostRes; int nPreLogin; int nPostLogin; } EXIT_CALLS_COUNTERS; EXIT_CALLS_COUNTERS counters = { 0 }; static void print_my_statistics(void) { // // 输出统计信息检查计数器 // printf("General Resource ... Pre %6d Post %6d \n" "Login................Pre %6d Post %6d \n", counters.nPreRes, counters.nPostRes, counters.nPreLogin, counters.nPostLogin); } static int ExitFunc_PreResource(void* data, SEOS_EXITRES *p_sexr) { SEOS_EXITGENR *ptr; ptr = (SEOS_EXITGENR *) data; counters.nPreRes++; // // 前检查:输出资源的 eTrust 类名 // printf("Pre General Resource %s of Class %s\n", ptr->szRes, ptr->szClass); return 0; } static int ExitFunc_PostResource(void* data, SEOS_EXITRES *p_sexr) { SEOS_EXITGENR *ptr; ptr = (SEOS_EXITGENR *) data; counters.nPostRes++; // // 后检查:输出资源的 eTrust 类名 // printf("Post General Resource %s of Class %s\n", ptr->szRes, ptr->szClass); return 0; } static int ExitFunc_PreLogin(void* data, SEOS_EXITRES *p_sexr) { SEOS_EXITLOGIN *p_sexl; char buff[20]; char const *p; p_sexl = (SEOS_EXITLOGIN*) data; counters.nPreLogin++; if(p_sexl->szUname == NULL) { p = buff; sprintf(buff, "UID = %u", p_sexl->luid); } else p = p_sexl->szUname; // // 对于登录前检查:输出登录用户名 // printf("Pre Login For %s from terminal %s\n", p, p_sexl->szTerm); if(strstr(p_sexl->szUname, "Administrator") != NULL) { print_my_statistics(); } return 0; } static int ExitFunc_PostLogin(void* data, SEOS_EXITRES *p_sexr) { SEOS_EXITLOGIN *p_sexl; char buff[20]; char const *p; p_sexl = (SEOS_EXITLOGIN*) data; counters.nPostLogin++; if(p_sexl->szUname == NULL) { p = buff; sprintf(buff, "UID = %u", p_sexl->luid); } else p = p_sexl->szUname; // // 对于登录后检查:输出登录用户名 // printf("Post Login For %s from terminal %s\n", p, p_sexl->szTerm); if(strstr(p_sexl->szUname, "Administrator") != NULL) { print_my_statistics(); } return 0; } typedef int(*PFNEXIT)(void); // 函数名称:SM_RegisterExit // 说明:导出 exits 函数 // 返回值类型:int 0 // 参数:IN/OUT PFNEXIT pfnExit[]-用户定义的函数数组 // 参数:IN/OUT DWORD *pdwType-引擎事件数组 _declspec(dllexport) int __stdcall SM_RegisterExit(PFNEXIT pfnExit[], PDWORD pdwType) { pfnExit[0] = (PFNEXIT)ExitFunc_PreLogin; pfnExit[1] = (PFNEXIT)ExitFunc_PostLogin; pfnExit[2] = (PFNEXIT)ExitFunc_PreResource; pfnExit[3] = (PFNEXIT)ExitFunc_PostResource; pdwType[0] = AUTHXAPI_EV_PRELOGIN; pdwType[1] = AUTHXAPI_EV_POSTLOGIN; pdwType[2] = AUTHXAPI_EV_PREGNRES; pdwType[3] = AUTHXAPI_EV_POSTGNRES; return 0; }
此外,在包含以下内容的项目中,您将需要另一个 .def 文件:
authxapi.h 标头文件包含使用该 API 所需的原型和定义。 该代码声明一个新类型 EXIT_CALLS_COUNTER。 此结构包括 API 注册的每个事件的计数器。 已声明该新本地类型的静态变量。 列出的常规资源检查函数是简单的计数器。 登录函数具有相同的计数器,并且还会将已登录用户的用户名与 Administrator 进行比较。
注意:此示例将输出到屏幕上。 CA ControlMinder 服务不应使用屏幕输出,因为它不是控制台应用程序。
以下代码演示一个用于密码验证的简单用户 exit 函数。 此代码将可能的密码与字符串密码进行比较,并在找到匹配项时不允许选择相应密码。
/*========================================================= 项目 :eTrust 模块 :eTrust 版本 :8.0 文件 :exit.c 用途 :密码实用程序 exit 函数的示例 =========================================================== 版权: 版权所有 2004 Computer Associates International, Inc. ===========================================================*/ /* 使用密码库扩展密码规则的示例 */ /* 此函数在 Access Control 验证密码之前 */ /* 验证密码。 要覆盖 Access Control 检查,请使用结果 */ /* SEOS_EXITR_PASS。 */ /* 查看 Makefile.exits 了解编译选项。 */ #include API/authxapi.h /* 此函数不允许用户将单词“password”*/ /* 用作新密码。 */ int ExitFunc_PreVerify(void *sexp, SEOS_EXITRES *sexr) { if (strcmp(((SEOS_EXITPASS *) sexp)‑>szPass,”password”) == 0) { printf(“new password is refused by exit function\n”); sexr‑>result = SEOS_EXITR_DENY; /* 不允许使用该密码 */ } else sexr‑>result = SEOS_EXITR_CHECK; /* 继续 Access Control 检查 */ return 0; } /* 必须注册以上 exit 函数 */ int sample_RegisterExit(void) { int rc; rc = authxapi_RegisterExitFunction(AUTHXAPI_EV_PREVERPWD, ExitFunc_PreVerify); if (rc) return rc; } void sample_UnregisterExit(void) { /* 在此情况中实际上不执行任何操作 */ }
以下代码演示一个用于密码验证的简单用户 exit 函数。 此代码将可能的密码与字符串密码进行比较,并在找到匹配项时不允许选择相应密码。
/* ======================================================================== 项目:eTrust Access Control 8.0 for Windows NT/2000 模块:eTrust 密码退出示例。 文件:main.c 用途:eTrust 密码退出 DLL 演示用户 如何 在前检查和后检查中使用 eTrust 密码授权的示例。 用法:构建 PasswordExitsExample.dll 并使用 eTrust Access Control 8.0 for Windows NT/2000 文档配置注册表和文件 系统。 ======================================================================= 版权所有 2004 Computer Associates International, Inc. ======================================================================= */ #include <stdio.h> #include <authxapi.h> static int ExitFunc_PreVerifyPassword(void* data, SEOS_EXITRES *p_sexr) { SEOS_EXITPASS *ptr; ptr = (SEOS_EXITPASS *) data; if (strcmp(ptr->szPass, "password") == 0) { p_sexr->result = SEOS_EXITR_DENY; /* 不允许使用该密码 */ } else { /* 继续 Access Control 检查 */ p_sexr->result = SEOS_EXITR_CHECK; } return 0; } typedef int(*PFNEXIT)(void); // 函数名称:PWD_RegisterExit // 说明:导出 exits 函数 // 返回值类型:int 0 // 参数:IN/OUT PFNEXIT pfnExit[]-用户定义的函数数组 // 参数:IN/OUT DWORD *pdwType-引擎事件数组 _declspec(dllexport) int __stdcall PWD_RegisterExit(PFNEXIT pfnExit[], DWORD pdwType) { pfnExit[0] = (PFNEXIT)ExitFunc_PreVerifyPassword; pdwType[0] = AUTHXAPI_EV_PREVERPWD; return 0; }
注意:为使用密码相关的退出,在注册表中安装退出动态链接库之后,必须重新启动计算机。 这是强制性操作,因为只有计算机启动时,才会加载处理 CA ControlMinder 密码验证的 pwdchange 动态链接库。
由 CA ControlMinder 提供的退出 API 函数根据以下类别进行分组:
检查是否已向 CA ControlMinder 注册特定事件的退出 API 函数。
向 CA ControlMinder 注册新的退出 API 函数。
删除之前向 CA ControlMinder 注册的退出 API 函数。
释放在之前调用 authxapi_GetObjectListValue 函数期间分配的内存。
从数据库对象中检索一个列表值属性的值。
从数据库对象中检索一个值属性的值。
在通过退出 API 函数给出用户句柄时检索用户名。
由扩展提供并在程序启动时调用。
由扩展提供并在程序终止时调用。
版权所有 © 2013 CA。
保留所有权利。
|
|