원격 서비스의 보안
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
.NET Remoting 응용 프로그램의 개발자는 .NET Remoting뿐만 아니라 일반적인 분산 응용 프로그램의 보안을 잘 이해해야 합니다. 보안 구현을 사용하지 않으면 누구든지 원격 개체에서 메서드를 호출하거나 원격 개체와 주고 받을 때 기밀 정보를 가로챕니다. 이를 방지하려면 클라이언트(및 서버)를 인증하고 둘 사이의 통신을 암호화해야 합니다.
덜 단순한 문제도 있습니다. 대리자를 매개 변수로 사용하는 메서드를 정의하는 원격 개체를 고려해 보십시오. 악의적인 개발자가 대리자를 사용하여 서버 응용 프로그램에서 원하는 코드를 실행하도록 강제할 수 있습니다. 대리자가 정적 메서드를 래핑하는 경우 해당 대리자의 모든 호출은 원격이 아닙니다. 대리자를 호출한 응용 프로그램 도메인에서 코드가 호출됩니다. 예를 들어 Rogue 클라이언트는 원격 개체를 호출하고 정적 메서드를 래핑하는 대리자를 전달하여 이 취약성을 사용할 수 있습니다. 정적 메서드를 구현하는 어셈블리를 서버로 복사할 수 있으며 대리자를 호출하는 경우 정적 메서드가 서버에서 실행됩니다. 이를 방지하려면 항상 원격 개체에 사용된 대리자를 해커가 추측할 수 없는 사용자 지정 형식과 매개 변수로 선언해야 합니다. 또한 클라이언트가 형식을 정의하고 deserialize될 원격 개체로 전달할 수 없도록 해야 합니다.
이 섹션에서는 특정 디자인 결정에 따른 다양한 보안 방법에 대해 설명합니다. 여기서 모든 시나리오에 대해 설명하지는 않지만 이 항목은 좋은 시작 지점이 됩니다.
코드 액세스 보안
코드 액세스 보안은 보호된 리소스와 작업에 대한 코드의 액세스를 제한하는 메커니즘입니다. 일반적으로 코드가 보호된 리소스에 액세스할 때 스택 워크가 수행되어 모든 스택 프레임에 리소스 액세스 권한이 있는지 확인합니다. 원격 개체에서 호출할 때는 이 스택 워크가 원격 경계를 넘어 수행되지 않습니다. 따라서 클라이언트나 서버에서 원격 인프라를 실행하려면 FullTrust 권한이 필요합니다. FullTrust 권한은 기본적으로 코드 액세스 보안을 해제합니다. 원격 응용 프로그램을 권한 없이 사용하면 FullTrust 권한에 대한 무단 액세스가 제공됩니다.
참고: |
---|
여러 시스템 형식이 MarshalByRefObject를 확장하지만 런타임에 보안 검사를 수행하여 응용 프로그램 도메인 외부의 모든 요소가 원격으로 해당 형식의 개체를 호출할 수 없도록 합니다. AppDomain 및 System.Windows.Forms.Form은 이러한 시스템 형식의 두 가지 예입니다. |
원격 응용 프로그램의 보안 고려 사항
일반적으로 분산 응용 프로그램에서 처리해야 하는 두 가지 보안 영역이 있습니다. 통신 채널의 보안을 유지하고 부적절한 사용에 대비하여 응용 프로그램 보안을 유지해야 합니다.
통신 채널의 보안 유지는 메시지가 암호화되었는지, 전송 시 수정되지 않았는지 확인하는 과정을 포함합니다. 부적절한 사용에 대비한 응용 프로그램 보안 유지는 호출자를 인증하고 권한을 부여하는 과정을 포함합니다. 호출자 인증은 호출자가 실제로 해당 사용자인지 확인하는 작업을 의미합니다. 호출자 권한 부여는 호출자에게 특정 호출을 수행하거나 보호된 리소스에 액세스하는 데 필요한 권한이 있는지 확인하는 작업을 의미합니다.
기본 제공 채널은 다음과 같이 보안을 지원합니다.
HttpChannel - IIS(인터넷 정보 서비스)가 원격 개체를 호스팅하는 경우에만 인증을 지원합니다. 암호화는 IIS가 SSL을 사용하도록 구성된 경우에만 지원됩니다.
TcpChannel - 인증 및 암호화를 지원합니다.
IpcChannel - 인증을 지원합니다.
참고: |
---|
권한 부여는 코드에서 제공합니다. 기본 제공 채널은 코드가 수행하는 작업과 부여된 제한 사항을 모르기 때문에 권한 부여를 제공할 수 없습니다. |
주의: |
---|
.NET Framework Remoting에서는 기본적으로 인증 또는 암호화를 수행하지 않습니다. 따라서 원격으로 클라이언트 또는 서버와 상호 작용하기 전에 해당 클라이언트 또는 서버의 ID를 확인하는 데 필요한 모든 단계를 수행하는 것이 좋습니다. .NET Framework Remoting 응용 프로그램이 실행되려면 FullTrust 권한이 필요하기 때문에 인증되지 않은 클라이언트가 서버에 액세스할 수 있도록 허용된 경우에는 클라이언트가 완전히 신뢰된 것처럼 코드를 실행할 수 있습니다. 따라서 항상 클라이언트를 인증하고 통신 스트림을 암호화하십시오. |
참고 항목
참조
RemotingConfiguration
ChannelServices
Context
MethodCall
RemotingServices