246 lines
6.5 KiB
C
246 lines
6.5 KiB
C
/****************************** Module Header ******************************\
|
|
* Module Name: audit.c
|
|
*
|
|
* Copyright (c) 1991, Microsoft Corporation
|
|
*
|
|
* Implementation of routines that access/manipulate the system audit log
|
|
*
|
|
* History:
|
|
* 12-09-91 Davidc Created.
|
|
* 5-6-92 DaveHart Fleshed out.
|
|
\***************************************************************************/
|
|
|
|
#include "msgina.h"
|
|
|
|
#include "authzi.h"
|
|
#include "msaudite.h"
|
|
|
|
/***************************************************************************\
|
|
* GetAuditLogStatus
|
|
*
|
|
* Purpose : Fills the global data with audit log status information
|
|
*
|
|
* Returns: TRUE on success, FALSE on failure
|
|
*
|
|
* History:
|
|
* 12-09-91 Davidc Created.
|
|
* 5-6-92 DaveHart Fleshed out.
|
|
\***************************************************************************/
|
|
|
|
BOOL
|
|
GetAuditLogStatus(
|
|
PGLOBALS pGlobals
|
|
)
|
|
{
|
|
EVENTLOG_FULL_INFORMATION EventLogFullInformation;
|
|
DWORD dwBytesNeeded;
|
|
HANDLE AuditLogHandle;
|
|
|
|
|
|
|
|
//
|
|
// Assume the log is not full. If we can't get to EventLog, tough.
|
|
//
|
|
|
|
pGlobals->AuditLogFull = FALSE;
|
|
|
|
AuditLogHandle = OpenEventLog( NULL, TEXT("Security"));
|
|
|
|
if (AuditLogHandle) {
|
|
if (GetEventLogInformation(AuditLogHandle,
|
|
EVENTLOG_FULL_INFO,
|
|
&EventLogFullInformation,
|
|
sizeof(EventLogFullInformation),
|
|
&dwBytesNeeded ) ) {
|
|
if (EventLogFullInformation.dwFull != FALSE) {
|
|
pGlobals->AuditLogFull = TRUE;
|
|
}
|
|
}
|
|
CloseEventLog(AuditLogHandle);
|
|
}
|
|
|
|
|
|
//
|
|
// There's no way in the current event logger to tell how full the log
|
|
// is, always indicate we're NOT near full.
|
|
//
|
|
|
|
pGlobals->AuditLogNearFull = FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
/***************************************************************************\
|
|
* DisableAuditing
|
|
*
|
|
* Purpose : Disable auditing via LSA.
|
|
*
|
|
* Returns: TRUE on success, FALSE on failure
|
|
*
|
|
* History:
|
|
* 5-6-92 DaveHart Created.
|
|
\***************************************************************************/
|
|
|
|
BOOL
|
|
DisableAuditing()
|
|
{
|
|
NTSTATUS Status, IgnoreStatus;
|
|
PPOLICY_AUDIT_EVENTS_INFO AuditInfo;
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
|
|
LSA_HANDLE PolicyHandle;
|
|
|
|
//
|
|
// Set up the Security Quality Of Service for connecting to the
|
|
// LSA policy object.
|
|
//
|
|
|
|
SecurityQualityOfService.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
|
|
SecurityQualityOfService.ImpersonationLevel = SecurityImpersonation;
|
|
SecurityQualityOfService.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
|
|
SecurityQualityOfService.EffectiveOnly = FALSE;
|
|
|
|
//
|
|
// Set up the object attributes to open the Lsa policy object
|
|
//
|
|
|
|
InitializeObjectAttributes(
|
|
&ObjectAttributes,
|
|
NULL,
|
|
0L,
|
|
NULL,
|
|
NULL
|
|
);
|
|
ObjectAttributes.SecurityQualityOfService = &SecurityQualityOfService;
|
|
|
|
//
|
|
// Open the local LSA policy object
|
|
//
|
|
|
|
Status = LsaOpenPolicy(
|
|
NULL,
|
|
&ObjectAttributes,
|
|
POLICY_VIEW_AUDIT_INFORMATION | POLICY_SET_AUDIT_REQUIREMENTS,
|
|
&PolicyHandle
|
|
);
|
|
if (!NT_SUCCESS(Status)) {
|
|
DebugLog((DEB_ERROR, "Failed to open LsaPolicyObject Status = 0x%lx", Status));
|
|
return FALSE;
|
|
}
|
|
|
|
Status = LsaQueryInformationPolicy(
|
|
PolicyHandle,
|
|
PolicyAuditEventsInformation,
|
|
(PVOID *)&AuditInfo
|
|
);
|
|
if (!NT_SUCCESS(Status)) {
|
|
|
|
IgnoreStatus = LsaClose(PolicyHandle);
|
|
ASSERT(NT_SUCCESS(IgnoreStatus));
|
|
|
|
DebugLog((DEB_ERROR, "Failed to query audit event info Status = 0x%lx", Status));
|
|
return FALSE;
|
|
}
|
|
|
|
if (AuditInfo->AuditingMode) {
|
|
|
|
AuditInfo->AuditingMode = FALSE;
|
|
|
|
Status = LsaSetInformationPolicy(
|
|
PolicyHandle,
|
|
PolicyAuditEventsInformation,
|
|
AuditInfo
|
|
);
|
|
} else {
|
|
Status = STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
IgnoreStatus = LsaFreeMemory(AuditInfo);
|
|
ASSERT(NT_SUCCESS(IgnoreStatus));
|
|
|
|
IgnoreStatus = LsaClose(PolicyHandle);
|
|
ASSERT(NT_SUCCESS(IgnoreStatus));
|
|
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
DebugLog((DEB_ERROR, "Failed to disable auditing Status = 0x%lx", Status));
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
DWORD
|
|
GenerateCachedUnlockAudit(
|
|
IN PSID pUserSid,
|
|
IN PCWSTR pszUser,
|
|
IN PCWSTR pszDomain
|
|
)
|
|
{
|
|
DWORD dwRet = ERROR_SUCCESS;
|
|
|
|
WCHAR szComputerName[CNLEN + sizeof('\0')] = L"-";
|
|
DWORD dwComputerNameSize = ARRAYSIZE(szComputerName);
|
|
|
|
LUID Luid;
|
|
LUID SystemLuid = SYSTEM_LUID;
|
|
|
|
if( !pUserSid || !pszUser )
|
|
{
|
|
DebugLog((DEB_ERROR, "GenerateCachedUnlockAudit got invalid parameters"));
|
|
ASSERT(FALSE);
|
|
dwRet = ERROR_INVALID_PARAMETER;
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
//
|
|
// Generate a locally unique id to include in the logon sid
|
|
// Note that this is a dummy SID. We don't want to use the logon
|
|
// LUID as this is specific to logon/logoff. Also a NULL LUID
|
|
// is seen as meaningless, so we have to generate a random one
|
|
//
|
|
if( !AllocateLocallyUniqueId(&Luid) )
|
|
{
|
|
dwRet = GetLastError();
|
|
DebugLog((DEB_ERROR, "AllocateLocallyUniqueId failed, error = 0x%lx", dwRet));
|
|
goto ErrorReturn;
|
|
}
|
|
|
|
//
|
|
// Ignore the failure
|
|
//
|
|
GetComputerName(szComputerName, &dwComputerNameSize);
|
|
|
|
if( !AuthziSourceAudit(
|
|
APF_AuditSuccess,
|
|
SE_CATEGID_LOGON, //category id
|
|
SE_AUDITID_SUCCESSFUL_LOGON, //audit id
|
|
L"Security",
|
|
pUserSid, //the user sid
|
|
12, //count for va section
|
|
APT_String, pszUser,
|
|
APT_String, pszDomain ? pszDomain : L"-",
|
|
APT_Luid, Luid,
|
|
APT_Ulong, CachedUnlock,
|
|
APT_String, L"Winlogon",
|
|
APT_String, L"Winlogon unlock cache",
|
|
APT_String, szComputerName,
|
|
APT_String, L"-",
|
|
APT_String, L"SYSTEM",
|
|
APT_String, L"NT AUTHORITY",
|
|
APT_Luid, SystemLuid,
|
|
APT_Ulong, GetCurrentProcessId()
|
|
) )
|
|
{
|
|
DebugLog((DEB_ERROR, "AuthziSourceAudit failed, error = 0x%lx", dwRet));
|
|
dwRet = GetLastError();
|
|
}
|
|
|
|
ErrorReturn:
|
|
return dwRet;
|
|
}
|