windows-nt/Source/XPSP1/NT/ds/security/services/ca/include/audit.h
2020-09-26 16:20:57 +08:00

219 lines
6.2 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999 - 2000
//
// File: audit.h
//
// Contents: Cert Server audit classes
//
//---------------------------------------------------------------------------
#ifndef __AUDIT_H__
#define __AUDIT_H__
#include <ntsecapi.h>
#include <authzi.h>
#define AUDIT_FILTER_STARTSTOP 0x00000001
#define AUDIT_FILTER_BACKUPRESTORE 0x00000002
#define AUDIT_FILTER_CERTIFICATE 0x00000004
#define AUDIT_FILTER_CERTREVOCATION 0x00000008
#define AUDIT_FILTER_CASECURITY 0x00000010
#define AUDIT_FILTER_KEYAARCHIVAL 0x00000020
#define AUDIT_FILTER_CACONFIG 0x00000040
#define CA_ACCESS_ALLREADROLES \
CA_ACCESS_ADMIN | \
CA_ACCESS_OFFICER | \
CA_ACCESS_AUDITOR | \
CA_ACCESS_OPERATOR| \
CA_ACCESS_READ
namespace CertSrv
{
static const LPCWSTR cAuditString_UnknownDataType = L"?";
// define event
class CAuditEvent
{
public:
static const DWORD m_gcAuditSuccessOrFailure = 0;
static const DWORD m_gcNoAuditSuccess = 1;
static const DWORD m_gcNoAuditFailure = 2;
CAuditEvent(ULONG ulEventID = 0L, DWORD dwFilter = 0);
~CAuditEvent();
void SetEventID(ULONG ulEventID);
HRESULT AddData(DWORD dwValue);
HRESULT AddData(PBYTE pData, DWORD dwDataLen);
HRESULT AddData(bool fData);
HRESULT AddData(LPCWSTR pcwszData);
HRESULT AddData(LPCWSTR *ppcwszData);
HRESULT AddData(FILETIME time);
HRESULT AddData(const VARIANT *pvar, bool fDoublePercentInString);
void DeleteLastData()
{ delete m_pEventDataList[--m_cEventData]; }
HRESULT Report(bool fSuccess = true);
HRESULT SaveFilter(LPCWSTR pcwszSanitizedName);
HRESULT LoadFilter(LPCWSTR pcwszSanitizedName);
DWORD GetFilter() {return m_dwFilter;}
HRESULT AccessCheck(
ACCESS_MASK Mask,
DWORD dwAuditFlags,
handle_t hRpc = NULL,
HANDLE *phToken = NULL);
HRESULT CachedGenerateAudit();
void FreeCachedHandles();
HRESULT GetMyRoles(DWORD *pdwRoles);
bool IsEventEnabled();
HRESULT Impersonate();
HRESULT RevertToSelf();
HANDLE GetClientToken();
// role separation
void EventRoleSeparationEnable(bool fEnable)
{m_fRoleSeparationEnabled = fEnable;};
static void RoleSeparationEnable(bool fEnable)
{m_gfRoleSeparationEnabled = fEnable;};
static bool RoleSeparationIsEnabled() {return m_gfRoleSeparationEnabled;}
static HRESULT RoleSeparationFlagSave(LPCWSTR pcwszSanitizedName);
static HRESULT RoleSeparationFlagLoad(LPCWSTR pcwszSanitizedName);
static void CleanupAuditEventTypeHandles();
struct AUDIT_CATEGORIES
{
ULONG ulAuditID;
DWORD dwFilter;
DWORD dwParamCount;
bool fRoleSeparationEnabled;
AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAuditEventType;
};
private:
bool IsEventValid();
bool IsEventRoleSeparationEnabled();
CAuditEvent(const CAuditEvent&);
const CAuditEvent& operator=(const CAuditEvent&);
struct EventData
{
EventData() : m_fDoublePercentsInStrings(false)
{
PropVariantInit(&m_vtData);
};
~EventData()
{
PropVariantClear(&m_vtData);
};
HRESULT ConvertToStringI2I4(
LONG lVal,
LPWSTR *ppwszOut);
HRESULT ConvertToStringUI2UI4(
ULONG ulVal,
LPWSTR *ppwszOut);
HRESULT ConvertToStringWSZ(
LPCWSTR pcwszVal,
LPWSTR *ppwszOut);
HRESULT ConvertToStringBOOL(
BOOL fVal,
LPWSTR *ppwszOut);
HRESULT ConvertToStringArrayUI1(
LPSAFEARRAY psa,
LPWSTR *ppwszOut);
HRESULT ConvertToStringArrayBSTR(
LPSAFEARRAY psa,
LPWSTR *ppwszOut);
HRESULT DoublePercentsInString(
LPCWSTR pcwszIn,
LPWSTR *ppwszOut);
HRESULT ConvertToString(LPWSTR *pwszData);
PROPVARIANT m_vtData;
bool m_fDoublePercentsInStrings; // Insertion strings containing %number get
// displayed incorrectly in the event log.
// If this value is set, we double % chars.
};// struct EventData
PROPVARIANT *CreateNewEventData();
EventData *CreateNewEventData1();
HRESULT BuildAuditParamArray(PAUDIT_PARAM& rpParamArray);
void FreeAuditParamArray(PAUDIT_PARAM pParamArray);
HRESULT GetPrivilegeRoles(PDWORD pdwRoles);
HRESULT GetUserPrivilegeRoles(
LSA_HANDLE lsah,
PSID_AND_ATTRIBUTES pSA,
PDWORD pdwRoles);
HRESULT BuildPrivilegeSecurityDescriptor(
DWORD dwRoles);
DWORD GetBitCount(DWORD dwBits)
{
DWORD dwCount = 0;
for(DWORD dwSize = 0; dwSize<sizeof(DWORD); dwSize++, dwBits>>=1)
{
dwCount += dwBits&1;
}
return dwCount;
}
HRESULT DoublePercentsInString(
LPCWSTR pcwszIn,
LPCWSTR *ppcwszOut);
ULONG m_ulEventID;
enum {m_EventDataMaxSize=10};
EventData* m_pEventDataList[m_EventDataMaxSize];
DWORD m_cEventData;
DWORD m_cRequiredEventData; // expected number of audit parameters
DWORD m_dwFilter;
bool m_fRoleSeparationEnabled;
// free these
IServerSecurity *m_pISS;
HANDLE m_hClientToken;
PSECURITY_DESCRIPTOR m_pCASD;
AUTHZ_CLIENT_CONTEXT_HANDLE m_ClientContext;
AUTHZ_ACCESS_CHECK_RESULTS_HANDLE m_AuthzHandle;
PSECURITY_DESCRIPTOR m_pSDPrivileges;
PACL m_pDaclPrivileges;
// no free
handle_t m_hRpc;
DWORD m_Error;
DWORD m_SaclEval;
ACCESS_MASK m_MaskAllowed;
AUTHZ_ACCESS_REQUEST m_Request;
AUTHZ_ACCESS_REPLY m_Reply;
DWORD m_crtGUID;
AUTHZ_AUDIT_EVENT_TYPE_HANDLE m_hAuditEventType;
PSID m_pUserSid;
static AUDIT_CATEGORIES *m_gAuditCategories;
static DWORD m_gdwAuditCategoriesSize;
static bool m_gfRoleSeparationEnabled;
static const DWORD AuditorRoleBit;
static const DWORD OperatorRoleBit;
static const DWORD CAAdminRoleBit;
static const DWORD OfficerRoleBit;
static const DWORD dwMaskRoles;
}; // class CAuditEvent
} // namespace CertSrv
#endif //__AUDIT_H__