방법: 엔터프라이즈에서 끝점 잠그기
대형 엔터프라이즈에서는 응용 프로그램을 엔터프라이즈 보안 정책에 따라 개발해야 하는 경우가 종종 있습니다. 다음 항목에서는 컴퓨터에 설치된 모든 WCF(Windows Communication Foundation) 클라이언트 응용 프로그램의 유효성을 확인할 수 있는 클라이언트 끝점 유효성 검사기를 개발하고 설치하는 방법에 대해 설명합니다.
이 경우 machine.config 파일에서는 클라이언트 <commonBehaviors> 섹션에 끝점 동작이 추가되므로 유효성 검사기는 클라이언트 유효성 검사기입니다. WCF는 클라이언트 응용 프로그램에 대해서는 일반 끝점 동작만 로드하고, 서비스 응용 프로그램에 대해서는 일반 서비스 동작을 로드합니다. 서비스 응용 프로그램에 동일한 유효성 검사기를 설치하려면 유효성 검사기가 서비스 동작이어야 합니다. 자세한 내용은 다음 항목을 참조하십시오. <commonBehaviors> 섹션을 참조하십시오.
참고: |
---|
구성 파일의 <commonBehaviors> 섹션에 추가된 AllowPartiallyTrustedCallersAttribute 특성(APTCA)으로 표시되지 않은 서비스 또는 끝점 동작은 응용 프로그램이 부분 신뢰 환경에서 실행될 때 실행되지 않으며, 이러한 경우 예외가 throw되지 않습니다. 유효성 검사기와 같은 일반 동작을 실행하려면 다음을 수행해야 합니다. -- 부분 신뢰 응용 프로그램으로 배포될 때 실행될 수 있도록 일반 동작을 AllowPartiallyTrustedCallersAttribute 특성으로 표시합니다. APTCA로 표시된 어셈블리가 실행되지 않도록 컴퓨터에 레지스트리 항목을 설정할 수 있습니다. - 부분 신뢰 환경에서 응용 프로그램을 실행하기 위해 사용자가 코드 액세스 보안 설정을 수정할 수 없는 완전 신뢰 응용 프로그램으로서 응용 프로그램이 배포되는지 확인합니다. 사용자가 보안 설정을 수정할 수 있는 경우 사용자 지정 유효성 검사기가 실행되지 않고 예외가 throw되지 않습니다. 이를 확인할 수 있는 한 가지 방법으로 Code Access Security Policy Tool (Caspol.exe)를 사용하는 levelfinal 옵션을 참조하십시오. 자세한 내용은 부분 신뢰를 위한 최선의 방법 및 지원되는 배포 시나리오를 참조하십시오. |
끝점 유효성 검사기를 만들려면
Validate 메서드의 원하는 유효성 검사 단계를 사용하여 IEndpointBehavior를 만듭니다. 코드 예제는 다음과 같습니다. (
InternetClientValidatorBehavior
는 Security Validation 샘플에서 가져온 것입니다.)public class InternetClientValidatorBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) { } public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { BindingElementCollection elements = endpoint.Binding.CreateBindingElements(); if (EndpointIsDual(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint uses 'dual' mode. This mode is disallowed for use with untrusted services."); if (EndpointAllowsNtlm(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint allows NTLM. This mode is disallowed for use with untrusted services."); if (EndpointAllowsTransactionFlow(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint flows transaction ids. This mode is disallowed for use with untrusted services."); }
1단계에서 만든 끝점 유효성 검사기를 등록할 새 BehaviorExtensionElement를 만듭니다. 다음 코드 예제에서는 이를 보여 줍니다. (이 예제의 원본 코드는 Security Validation 샘플에 있습니다.)
public class InternetClientValidatorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(InternetClientValidatorBehavior); } } protected override object CreateBehavior() { return new InternetClientValidatorBehavior(); } }
컴파일된 어셈블리가 강력한 이름으로 서명되어 있는지 확인합니다. 자세한 내용은 Strong Name Tool (Sn.exe) 및 사용하는 해당 언어에 대한 컴파일러 명령을 참조하십시오.
대상 컴퓨터에 유효성 검사기를 설치하려면
적절한 메커니즘을 사용하여 끝점 유효성 검사기를 설치합니다. 엔터프라이즈에서는 그룹 정책 및 SMS(Systems Management Server)를 사용해 수행할 수 있습니다.
Global Assembly Cache Tool (Gacutil.exe)를 사용하여 전역 어셈블리 캐시에 강력한 이름의 어셈블리를 설치합니다.
다음 작업에 System.Configuration 네임스페이스 형식을 사용합니다.
정규화된 형식 이름을 사용하여 확장을 <behaviorExtensions> 섹션에 추가하고 요소를 잠급니다.
// Register our validator configuration element. ExtensionsSection extensions = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection; if (extensions == null) throw new Exception("not extensions section."); ExtensionElement validator = new ExtensionElement( "internetClientValidator", "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" ); validator.LockItem = true; if (extensions.BehaviorExtensions.IndexOf(validator) < 0) extensions.BehaviorExtensions.Add(validator);
동작 요소를 <commonBehaviors> 섹션의 EndpointBehaviors 속성에 추가하고 요소를 잠급니다. 서비스에 유효성 검사기를 설치하려면 유효성 검사기가 IServiceBehavior이어야 하며 ServiceBehaviors 속성에 추가되어야 합니다. 다음 코드 예제에서는 강력한 이름이 없다는 것만 제외하고 a단계와 b단계 이후의 올바른 구성을 보여 줍니다.
// Add a new section for our validator and lock it down. // Behaviors for client applications must be endpoint behaviors. // Behaviors for service applications must be service behaviors. CommonBehaviorsSection commonBehaviors = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection; InternetClientValidatorElement internetValidator = new InternetClientValidatorElement(); internetValidator.LockItem = true; commonBehaviors.EndpointBehaviors.Add(internetValidator);
machine.config 파일을 저장합니다. 다음 코드 예제에서는 3단계의 모든 작업을 수행하며 수정된 machine.config 파일의 복사본을 로컬에 저장합니다.
// Write to disk. machine.SaveAs("newMachine.config"); // Write our new information. SectionInformation cBInfo = commonBehaviors.SectionInformation; Console.WriteLine(cBInfo.GetRawXml()); Console.WriteLine(extensions.SectionInformation.GetRawXml()); Console.Read();
예제
다음 코드 예제에서는 일반 동작을 machine.config 파일에 추가하고 복사본을 디스크에 저장하는 방법을 보여 줍니다. InternetClientValidatorBehavior
는 Security Validation 샘플에서 가져온 것입니다.
Configuration machine = ConfigurationManager.OpenMachineConfiguration();
// Register our validator configuration element.
ExtensionsSection extensions
= machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
if (extensions == null)
throw new Exception("not extensions section.");
ExtensionElement validator
= new ExtensionElement(
"internetClientValidator",
"Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
);
validator.LockItem = true;
if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
extensions.BehaviorExtensions.Add(validator);
// Add a new section for our validator and lock it down.
// Behaviors for client applications must be endpoint behaviors.
// Behaviors for service applications must be service behaviors.
CommonBehaviorsSection commonBehaviors
= machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
internetValidator.LockItem = true;
commonBehaviors.EndpointBehaviors.Add(internetValidator);
// Write to disk.
machine.SaveAs("newMachine.config");
// Write our new information.
SectionInformation cBInfo = commonBehaviors.SectionInformation;
Console.WriteLine(cBInfo.GetRawXml());
Console.WriteLine(extensions.SectionInformation.GetRawXml());
Console.Read();
보안
구성 파일 요소를 암호화할 수도 있습니다. 자세한 내용은 참고 항목 단원을 참조하십시오.
참고 항목
기타 리소스
How To: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI
How To: Encrypt Configuration Sections in ASP.NET 2.0 Using RSA