上一主题: 用户信息下一主题: authxapi_RegisterExitFunction 函数


对于 UNIX

在编译代码之后,将生成一个包含编译版本代码的共享库。 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 使用相同的文件配置格式。

对于 Windows

在编译代码之后,将生成一个包含编译版本代码的动态链接库。 SDK 目录包含演示该过程的示例函数和 makefile。 请注意,编译动态链接库通常需要使用其他编译器参数。 有关如何在特定系统中创建动态链接库的信息,请参阅编译器或链接器文档。

在编写代码并创建动态链接库之后,您应按如下所示将其安装在 CA ControlMinder 注册表树中:

  1. 在以下现有注册表项下使用所选的任何名称创建注册表项:
    HKEY_LOCAL_MACHINE\Software\ComputerAssociates\AccessControl\Exits\Engine
    
  2. 在新创建的子项下创建两个值:
系统调用
对于 UNIX

由于 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 对返回代码使用以下约定:返回值零表示成功;其他任何值表示错误。

退出 API 示例

CA ControlMinder 程序包包含以下两个演示退出 API 使用的示例程序。

适用于 UNIX 的 CA ControlMinder 后台进程退出

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 后台进程不应使用屏幕输出,因为屏幕输出会导致性能显著降低。

适用于 Windows 的 CA ControlMinder SeOS 引擎退出

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 服务不应使用屏幕输出,因为它不是控制台应用程序。

密码实用程序退出
对于 UNIX

以下代码演示一个用于密码验证的简单用户 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)
{
    /* 在此情况中实际上不执行任何操作 */
}
对于 Windows

以下代码演示一个用于密码验证的简单用户 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 动态链接库。

适用于 UNIX 的函数

由 CA ControlMinder 提供的退出 API 函数根据以下类别进行分组:

常规函数

authxapi_IsThereExitFunction

检查是否已向 CA ControlMinder 注册特定事件的退出 API 函数。

authxapi_RegisterExitFunction

向 CA ControlMinder 注册新的退出 API 函数。

authxapi_UnregisterExitFunction

删除之前向 CA ControlMinder 注册的退出 API 函数。

数据库接口函数

authxapi_FreeListValues

释放在之前调用 authxapi_GetObjectListValue 函数期间分配的内存。

authxapi_GetObjectListValue

从数据库对象中检索一个列表值属性的值。

authxapi_GetObjectProperty

从数据库对象中检索一个值属性的值。

authxapi_GetUserInfo

在通过退出 API 函数给出用户句柄时检索用户名。

共享库函数

driver_RegisterExit

由扩展提供并在程序启动时调用。

driver_UnregisterExit

由扩展提供并在程序终止时调用。