방법: Windows Communication Foundation 보안 이벤트 감사
WCF(Windows Communication Foundation)에서는 Windows 이벤트 뷰어를 사용하여 볼 수 있는 Windows 이벤트 로그에 보안 이벤트를 기록할 수 있습니다. 이 항목에서는 보안 이벤트를 기록하도록 응용 프로그램을 설정하는 방법에 대해 설명합니다. WCF 감사에 대한 자세한 내용은 보안 이벤트 감사를 참조하십시오.
코드에서 보안 이벤트를 감사하려면
감사 로그 위치를 지정합니다. 이렇게 하려면 다음 코드와 같이 ServiceSecurityAuditBehavior 클래스의 AuditLogLocation 속성을 AuditLogLocation 열거형 값 중 하나로 설정합니다.
' Create a new auditing behavior and set the log location. Dim newAudit As New ServiceSecurityAuditBehavior() newAudit.AuditLogLocation = AuditLogLocation.Application
// Create a new auditing behavior and set the log location. ServiceSecurityAuditBehavior newAudit = new ServiceSecurityAuditBehavior(); newAudit.AuditLogLocation = AuditLogLocation.Application;
AuditLogLocation 열거에는 Application, Security 또는 Default의 세 개 값이 있습니다. 이 값은 이벤트 뷰어에서 볼 수 있는 로그(보안 로그 또는 응용 프로그램 로그) 중 하나를 지정합니다. Default 값을 사용하는 경우 실제 로그는 응용 프로그램을 실행하는 운영 체제에 따라 달라집니다. 감사를 사용하지만 로그 위치가 지정되지 않은 경우 기본값은 보안 로그에 쓰기를 지원하는 플랫폼의 Security 로그입니다. 그렇지 않으면 Application 로그에 씁니다. 기본적으로 Windows Server 2003 및 Windows Vista만 보안 로그에 쓰기를 지원합니다.
감사할 이벤트 형식을 설정합니다. 서비스 수준 이벤트나 메시지 수준 권한 부여 이벤트를 동시에 감사할 수 있습니다. 이렇게 하려면 다음 코드와 같이 ServiceAuthorizationAuditLevel 속성이나 MessageAuthenticationAuditLevel 속성을 AuditLevel 열거형 값 중 하나로 설정합니다.
newAudit.MessageAuthenticationAuditLevel = _ AuditLevel.SuccessOrFailure newAudit.ServiceAuthorizationAuditLevel = _ AuditLevel.SuccessOrFailure
// Create a new auditing behavior and set the log location. ServiceSecurityAuditBehavior newAudit = new ServiceSecurityAuditBehavior(); newAudit.AuditLogLocation = AuditLogLocation.Application; newAudit.MessageAuthenticationAuditLevel = AuditLevel.SuccessOrFailure; newAudit.ServiceAuthorizationAuditLevel = AuditLevel.SuccessOrFailure;
로그 감사 이벤트에 대해 오류를 응용 프로그램에 노출할지 또는 표시하지 않을지 지정합니다. 다음 코드와 같이 SuppressAuditFailure 속성을 true 또는 false로 설정합니다.
newAudit.SuppressAuditFailure = False
// Create a new auditing behavior and set the log location. ServiceSecurityAuditBehavior newAudit = new ServiceSecurityAuditBehavior(); newAudit.AuditLogLocation = AuditLogLocation.Application; newAudit.MessageAuthenticationAuditLevel = AuditLevel.SuccessOrFailure; newAudit.ServiceAuthorizationAuditLevel = AuditLevel.SuccessOrFailure; newAudit.SuppressAuditFailure = false;
기본 SuppressAuditFailure 속성이 true이므로 감사하지 못해도 응용 프로그램에 영향을 주지 않습니다. 그렇지 않으면 예외가 throw됩니다. 성공한 모든 감사에 대해 자세한 추적이 기록됩니다. 감사하지 못하면 오류 수준에서 추적이 기록됩니다.
ServiceHost의 설명에 있는 동작 컬렉션에서 기존 ServiceSecurityAuditBehavior를 삭제합니다. 동작 컬렉션은 Description 컬렉션에서 액세스되는 Behaviors 속성으로 액세스됩니다. 다음 코드와 같이 동일한 컬렉션에 새 ServiceSecurityAuditBehavior를 추가합니다.
' Remove the old behavior and add the new. serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior) serviceHost.Description.Behaviors.Add(newAudit)
// Remove the old behavior and add the new. serviceHost.Description. Behaviors.Remove<ServiceSecurityAuditBehavior>(); serviceHost.Description.Behaviors.Add(newAudit);
구성에서 감사를 설정하려면
구성에서 감사를 설정하려면 web.config 파일의 Behaviors element 섹션에 <behavior> 요소를 추가합니다. 다음 예제와 같이 serviceSecurityAudit 요소를 추가하고 다양한 특성을 설정합니다.
<behaviors> <behavior name="myAuditBehavior"> <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false" serviceAuthorizationAuditLevel="None" messageAuthenticationAuditLevel="SuccessOrFailure" /> </behavior> </behaviors>
다음 예제와 같이 서비스의 동작을 지정해야 합니다.
<services> <service type="WCS.Samples.Service.Echo" behaviorConfiguration=" myAuditBehavior"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="CertificateDefault" contract="WCS.Samples.Service.IEcho" /> </service> </services>
예제
다음 코드에서는 ServiceHost 클래스의 인스턴스를 만들고 동작 컬렉션에 새 ServiceSecurityAuditBehavior를 추가합니다.
Public Shared Sub Main()
' Get base address from appsettings in configuration.
Dim baseAddress As New Uri(ConfigurationManager.AppSettings("baseAddress"))
' Create a ServiceHost for the CalculatorService type
' and provide the base address.
Dim serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress)
Try
' Create a new auditing behavior and set the log location.
Dim newAudit As New ServiceSecurityAuditBehavior()
newAudit.AuditLogLocation = AuditLogLocation.Application
newAudit.MessageAuthenticationAuditLevel = _
AuditLevel.SuccessOrFailure
newAudit.ServiceAuthorizationAuditLevel = _
AuditLevel.SuccessOrFailure
newAudit.SuppressAuditFailure = False
' Remove the old behavior and add the new.
serviceHost.Description.Behaviors.Remove(Of ServiceSecurityAuditBehavior)
serviceHost.Description.Behaviors.Add(newAudit)
' Open the ServiceHostBase to create listeners
' and start listening for messages.
serviceHost.Open()
' The service can now be accessed.
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
' Close the ServiceHostBase to shutdown the service.
serviceHost.Close()
Finally
End Try
End Sub
public static void Main()
{
// Get base address from appsettings in configuration.
Uri baseAddress = new Uri(ConfigurationManager.
AppSettings["baseAddress"]);
// Create a ServiceHost for the CalculatorService type
// and provide the base address.
using (ServiceHost serviceHost = new
ServiceHost(typeof(CalculatorService), baseAddress))
{
// Create a new auditing behavior and set the log location.
ServiceSecurityAuditBehavior newAudit =
new ServiceSecurityAuditBehavior();
newAudit.AuditLogLocation =
AuditLogLocation.Application;
newAudit.MessageAuthenticationAuditLevel =
AuditLevel.SuccessOrFailure;
newAudit.ServiceAuthorizationAuditLevel =
AuditLevel.SuccessOrFailure;
newAudit.SuppressAuditFailure = false;
// Remove the old behavior and add the new.
serviceHost.Description.
Behaviors.Remove<ServiceSecurityAuditBehavior>();
serviceHost.Description.Behaviors.Add(newAudit);
// Open the ServiceHostBase to create listeners
// and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
serviceHost.Close();
}
}
보안
SuppressAuditFailure 속성을 true로 설정하면 보안 감사 생성 오류가 표시되지 않습니다. false로 설정하면 예외가 throw됩니다. 그러나 다음 Windows 로컬 보안 설정 속성을 사용하면 감사 이벤트를 생성하지 못할 경우 Windows가 즉시 종료됩니다.
감사: 보안 감사를 로그할 수 없는 경우 즉시 시스템 종료
속성을 설정하려면 로컬 보안 설정 대화 상자를 엽니다. 보안 설정에서 로컬 정책을 클릭합니다. 그런 다음 보안 옵션을 클릭합니다.
AuditLogLocation 속성이 Security로 설정되어 있지만 개체 액세스 감사가 로컬 보안 정책에 설정되지 않은 경우 감사 이벤트는 보안 로그에 기록되지 않습니다. 오류가 반환되지는 않지만 감사 항목이 보안 로그에 기록되지 않습니다.
참고 항목
참조
AuditLogLocation
ServiceSecurityAuditBehavior
AuditLogLocation