在编译代码之后,将生成一个包含编译版本代码的共享库。 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。
保留所有权利。
|
|