이전 항목: selogrd 사용자 지정다음 항목: lograpi_UnregisterTargetType 함수


로그 파일의 형식

CA ControlMinder가 감사 로그를 기록하는 형식은 공개적으로 사용할 수 없습니다. 그러나 이 API를 사용하는 프로그래머는 감사 로그 파일 형식의 기본 사항을 이해하고 있어야 합니다. 이 단원에서는 프로그래머가 알아야 하는 정보를 제공합니다.

감사 로그 파일은 파일 헤더와 레코드로 구성되며 레코드는 파일에 순차적으로 기록됩니다. 각 레코드는 레코드 헤더와 해당 레코드에 관한 정보로 구성됩니다. 각 레코드의 헤더에는 레코드가 파일에 추가된 시간, 레코드 유형(응용 프로그램만 인식하는 코드), 그리고 헤더 다음에 나오는 레코드의 크기가 포함됩니다. 데이터는 압축된 형식으로 기록되며, 레코드 헤더에 명시된 레코드 크기는 이 압축된 데이터의 크기(바이트)입니다. 다음 다이어그램에서는 파일 형식을 개략적으로 보여 줍니다.

이 API를 사용하는 프로그래머는 압축 알고리즘이나 정확한 파일 형식을 알고 있지 않아도 됩니다. 사용자 응용 프로그램에 전달되는 정보는 압축되지 않은 형식으로 구조에 포함됩니다. 응용 프로그램은 단순히 이 구조에서 정보를 검색합니다.

추가 정보:

구조 및 데이터 형식

LogRoute API 예제

로컬 CA ControlMinder 디렉터리의 API 하위 디렉터리에는 API 헤더 파일과 라이브러리 함수가 들어 있습니다. CA ControlMinder 패키지에는 LogRoute API의 사용 방법, 즉 감사 정보를 UNIX 시스템 로그로 보내기 위해 대상 syslog를 CA ControlMinder에 추가하는 방법을 보여 주는 다음 샘플 프로그램도 포함되어 있습니다.

/*=========================================================
Project      : eTrust
Module       : eTrust
Version      : 8.0
File         : audit2syslog.c
Purpose      : Provide sample usage of the selogrd API to place
               audit log records in UNIX syslog.
===========================================================
Copyright :
Copyright 2004 Computer Associates International, Inc.
============================================================*/
#define __LOGRSAMPLE_C
#include <syslog.h>
#include <lograpi.h>

/* Include the .h file required by API */
/* Prototypes for our local functions */
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);
/* 
   * We don't use the code of the new route type target, but
   * if we wanted more than one target type, we could use
   * it to distinguish between the two.
*/
static int our_dest_type_code;
/*
   * We preserve here the syslog priority required by
   * the configuration file.
   * This of course means that by storing it in global
   * variable we provide only one route line in the
   * configuration file for syslog. Other lines will just
   * overwrite this variable.
*/
static int syslog_priority;
/*
   * This like our 'main'. This function is the one called by
   * the 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)
{
    /* Actually we have nothing to do, since syslog 
     * should be there.
     * Anyway, just to demonstrate what to do we will look
     * at the destination name in this type of function,
     * we will check that the destination is one of the
     * known syslog priorities.
     */
    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) {
                    /* Preserve the method we should use in syslog */
                        syslog_priority = allowed_names[i].code;
                        return 0;
                    }
    }
    return 1;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static void sample_Free(SEOS_ROUTENTRY * pre)
{
    /*...*/      /* Now really nothing to be done */
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static int sample_Send(LOGRECORD * plr, SEOS_ROUTENTRY * pre,
                         int notify, void *data)
{
    char *as_string;

    if (notify)           /* Ignore any NOTIFY messages */
                    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

각 구조에서 첫 번째 필드는 데이터베이스에서 가져온 대상 문자열을 포함하기 위한 최대 30 바이트의 버퍼인 SEOS_NOTIFYSTR입니다. 두 번째 필드는 이 알림 레코드에 해당하는 감사 로그 레코드입니다.

함수

CA ControlMinder는 다음 함수를 제공합니다.

driver_Register

공유 라이브러리에 있어야 하며 selogrcd가 시작될 때 호출됩니다.

driver_UnRegister

공유 라이브러리에 있어야 하며 selogrcd가 종료될 때 호출됩니다.

driver_RegisterDestination

공유 라이브러리에 있어야 하며 selogrd가 시작될 때 호출됩니다.

driver_UnregisterDestination

공유 라이브러리에 있어야 하며 selogrd가 종료될 때 호출됩니다.

lograpi_Interpret_Record

감사 로그 레코드를 텍스트 문자열 쌍의 벡터로 변환합니다.

lograpi_MakeStringMessage

감사 로그 레코드 구조를 seaudit 및 seauditx가 사용하는 한 행으로 된 텍스트 형식으로 변환합니다.

lograpi_RegisterTargetType

등록할 새 대상 유형의 정확한 구현에 대한 세부 정보를 CA ControlMinder에 알려 줍니다.

lograpi_UnregisterTargetType

이전에 로그 라우팅 데몬에 등록된 대상 유형을 제거합니다.

servlog_IsThereExit

종료 함수가 있는지 여부를 테스트합니다.

servlog_RegisterExit

종료 함수를 등록합니다.

servlog_UnRegisterExit

종료 함수의 등록을 취소합니다.

새 대상 유형을 구현하는 LogRoute API 함수는 다음 작업에 대한 코드를 제공해야 합니다.

LogrApiFreeFunc

사용자 코드에 의해 저장소, 소켓 등에 할당된 모든 메모리를 해제하고 모든 네트워크 연결을 닫습니다.

LogrApiSendFunc

선택된 감사 로그 레코드를 사용자가 지정한 대상으로 보냅니다.

LogrApiSenseFunc

각 구성 파일 행의 대상 주소에 수정할 부분이 있는지 테스트합니다.

driver_Register 함수

driver_Register 함수는 selogrcd 데몬이 시작 시 호출하는 미리 정의된 함수입니다. 새로 사용자 지정한 모든 대상 유형을 등록하려면 해당 코드를 driver_Register에 삽입하십시오. 이 함수는 각 감사 레코드 유형에 필요한 종료 함수를 등록해야 합니다.

selogrcd의 라우트 구성 파일과 확장 구성 파일 모두에 driver가 나타나면 이를 대상 유형으로 바꾸십시오.

int driver_Register (void);

이 함수는 성공하면 0을 반환합니다. 실패하면 0이 아닌 정수 오류 코드를 반환합니다. 이 반환 코드는 syslog에서 볼 수 있습니다. selogrcd가 디버그 모드를 사용하는 경우에는 반환 코드가 화면에도 표시될 수 있습니다.

추가 정보:

driver_UnRegister 함수

lograpi_RegisterTargetType 함수

driver_UnRegister 함수

driver_UnRegister 함수는 selogrcd 데몬이 종료 시 호출하는 미리 정의된 함수입니다. 등록한 모든 대상 유형의 등록을 취소하려면 해당 코드를 driver_UnRegister에 삽입하십시오.

selogrcd의 라우트 구성 파일과 확장 구성 파일 모두에 driver가 나타나면 이를 대상 유형으로 바꾸십시오.

int driver_UnRegister (void);

이 함수는 성공하면 0을 반환합니다. 실패하면 0이 아닌 정수 오류 코드를 반환합니다. 이 반환 코드는 syslog에서 볼 수 있습니다. selogrcd가 디버그 모드를 사용하는 경우에는 반환 코드가 화면에도 표시될 수 있습니다.

추가 정보:

driver_Register 함수

driver_RegisterDestination 함수

driver_RegisterDestination 함수는 selogrd 데몬이 시작 시 호출하는 미리 정의된 함수입니다. 새로 사용자 지정한 모든 대상 유형을 등록하려면 해당 코드를 driver_RegisterDestination에 삽입하십시오.

selogrd의 라우트 구성 파일과 확장 구성 파일 모두에 driver가 나타나면 이를 대상 유형으로 바꾸십시오.

이 함수는 공유 라이브러리가 로드될 때 호출됩니다. 이 함수는 라이브러리를 초기화하고, lograpi_RegisterTargetType 함수를 호출하여 새 대상 유형을 등록해야 합니다.

int driver_RegisterDestination (void);

이 함수는 성공하면 0을 반환합니다. 실패하면 0이 아닌 정수 오류 코드를 반환합니다. 이 반환 코드는 syslog에서 볼 수 있습니다. selogrd가 디버그 모드를 사용하는 경우에는 반환 코드가 화면에도 표시될 수 있습니다.

driver_UnregisterDestination 함수

driver_UnregisterDestination 함수는 selogrd 데몬이 시스템 종료 시 호출하는 미리 정의된 함수입니다. 등록한 모든 대상 유형의 등록을 취소하려면 해당 코드를 driver_UnregisterDestination에 삽입하십시오.

중요! 대상 유형의 등록을 취소한 후에는 현재 세션 중에 다시 등록할 수 없습니다. 하지만 이후의 모든 레코드는 해당 대상으로 보내는 데 성공한 것처럼 표시됩니다. 따라서 현재 세션에서 대상 유형을 다시 사용하지 않을 것이 분명한 경우에만 해당 대상 유형의 등록을 취소하십시오.

selogrd의 라우트 구성 파일과 확장 구성 파일 모두에 driver가 나타나면 이를 대상 유형으로 바꾸십시오.

이 함수는 공유 라이브러리가 로드될 때 호출됩니다. 이 함수는 라이브러리를 초기화하고, lograpi_RegisterTargetType 함수를 호출하여 새 대상 유형을 등록해야 합니다.

int driver_UnregisterDestination (void);

이 함수는 성공하면 0을 반환합니다. 실패하면 0이 아닌 정수 오류 코드를 반환합니다. 이 반환 코드는 syslog에서 볼 수 있습니다. selogrd가 디버그 모드를 사용하는 경우에는 반환 코드가 화면에도 표시될 수 있습니다.

추가 정보:

driver_RegisterDestination 함수

lograpi_InterpretRecord 함수

lograpi_InterpretRecord 함수는 감사 로그 레코드를 텍스트 문자열 쌍의 벡터로 변환합니다. 각 쌍은 레코드의 필드 레이블과 해당 필드의 텍스트로 구성됩니다. 벡터 자체는 두 구성원, 즉 레이블과 값이 모두 NULL 포인터일 때 종결됩니다. 값은 감사 레코드의 특정 필드에 값이 없는 경우에 NULL 포인터일 수 있습니다.

이 함수는 성공 시 구조의 벡터에 대한 포인터를 반환합니다. 벡터의 각 요소는 두 구성원, 즉 레이블과 값을 포함하는 구조입니다. 레이블 및 값 포인터는 이 함수를 호출할 때 덮어쓰여진 정적 메모리 영역을 가리킵니다. 벡터 자체는 두 구성원이 모두 NULL 포인터일 때 종결됩니다.

seauditx 유틸리티는 사용자가 표시된 레코드에 대해 더 자세한 정보를 요청할 때 이와 유사한 형식으로 감사 레코드를 표시합니다.

SEOS_AUDLOGINTERP * lograpi_InterpretRecord P(LOGRECORD *plr, void *unc_buff);
plr

LogrApiSendFunc 함수에 전달된 감사 로그 레코드 구조에 대한 포인터입니다.

unc_buff

LogApiSendFunc 함수에 전달된 압축되지 않은 감사 로그 레코드 정보에 대한 포인터입니다.

추가 정보:

lograpi_MakeStringMessage 함수

lograpi_RegisterTargetType 함수

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

보내기 함수가 지정되지 않았습니다.

int lograpi_RegisterTargetType (const char *name, LOGRAPI_FUNCS *funcs, int *code);
name

새로 추가된 대상 유형의 이름입니다.

funcs

세 개의 대상 유형 함수 LogrApiSendFunc, LogrApiFreeFunc 및 LogrApiSenseFunc를 포함하는 LOGRAPI_FUNCS 구조에 대한 포인터입니다.

code

이 대상에 할당된 코드입니다. 이 코드는 SEOS_ROUTENTRY 구조의 대상 데이터 구성원에 저장된 값입니다.