Share via


은폐(COM)

은폐는 가장하는 동안 클라이언트가 서버에 대해 프로젝트하는 ID를 결정하는 COM 보안 기능입니다. 은폐가 설정되면 중간 서버는 자체 ID를 마스킹하고 클라이언트를 대신하여 호출하는 서버에 클라이언트의 ID를 제공합니다. 기본적; 서버에서 볼 수 있는 클라이언트 ID는 프록시와 연결된 ID입니다. 프록시의 ID는 여러 요인에 의해 결정되며, 그 중 하나는 설정된 은폐 유형(있는 경우)입니다. Schannel 보안 공급자는 은폐를 지원하지 않습니다.

다음 topics 은폐에 대한 자세한 정보를 제공합니다.

은폐 유형

은폐에는 정적 은폐와 동적 은폐의 두 가지 유형이 있습니다.

  • 정적 은폐(EOAC_STATIC_CLOAKING)를 사용하면 서버는 클라이언트에서 서버로의 첫 번째 호출에서 스레드 토큰을 확인합니다. 첫 번째 호출의 경우 이전에 CoSetProxyBlanket을 호출하는 동안 프록시 ID가 설정된 경우 해당 프록시 ID가 사용됩니다. 그러나 프록시 ID가 이전에 설정되지 않은 경우 스레드 토큰이 사용됩니다. 스레드 토큰이 없으면 프로세스 토큰이 사용됩니다. 이후의 모든 호출에 대해 첫 번째 호출에서 설정된 ID가 사용됩니다.
  • 동적 은폐(EOAC_DYNAMIC_CLOAKING)를 사용하면 각 호출에서 현재 스레드 토큰(스레드 토큰이 있는 경우)을 사용하여 클라이언트의 ID를 확인합니다. 스레드 토큰이 없으면 프로세스 토큰이 사용됩니다. 즉, 가장 중에 클라이언트를 대신하여 호출된 서버는 일반적으로 원하는 동작인 호출을 시작한 COM 클라이언트의 ID를 확인합니다. (물론 가장이 성공하려면 클라이언트가 적절한 가장 수준을 설정하여 가장할 수 있는 서버 권한을 부여해야 합니다. 자세한 내용은 가장 수준을 참조하세요.) 이 유형의 은폐는 비용이 많이 듭니다.

은폐가 클라이언트 ID에 미치는 영향

암호화된 호출이 수행되고 서버가 클라이언트에 ID를 요청하는 경우 일반적으로 프록시에 연결된 ID를 가져옵니다. (경우에 따라 인증 서비스는 실제 ID에서 변환을 수행하지만 일반적으로 프록시 ID는 서버에서 보는 ID입니다.) 프록시는 설정된 은폐 유형 및 기타 요인에 따라 서버에 ID를 제공합니다.

요약하자면, 클라이언트의 ID는 은폐 플래그 집합, 프로세스 토큰, 스레드 토큰의 존재 또는 부재 및 프록시 ID가 이전에 설정되었는지 여부의 함수입니다. 다음 표에서는 이러한 요소가 다를 때 발생하는 프록시 ID(클라이언트 ID)를 보여 줍니다.

플래그 은폐 스레드 토큰 현재 상태 프록시 ID 이전에 설정 프록시 ID(클라이언트 ID)
은폐가 설정되지 않음
상관없어
상관없어
프로세스 토큰 또는 인증 ID
EOAC_STATIC_CLOAKING
표시
No
스레드 토큰
EOAC_STATIC_CLOAKING
표시
Yes
현재 프록시 ID
EOAC_STATIC_CLOAKING
없음
No
프로세스 토큰
EOAC_STATIC_CLOAKING
없음
Yes
현재 프록시 ID
EOAC_DYNAMIC_CLOAKING
표시
상관없어
스레드 토큰
EOAC_DYNAMIC_CLOAKING
없음
상관없어
프로세스 토큰

다음 순서도는 프록시 ID가 다양한 상황에서 결정되는 방법을 보여 줍니다.

프록시 ID를 결정하기 위한 흐름을 보여 주는 다이어그램

은폐 설정

은폐는 전체 프로세스에 대한 은폐를 설정하는 CoInitializeSecurity 호출에서 기능 플래그로 설정됩니다. 그러면 클라이언트가 IClientSecurity::SetBlanket (또는 CoSetProxyBlanket)에 대한 호출을 통해 변경될 때까지 은폐 기능이 설정됩니다. 그러면 프록시에 대한 은폐가 설정됩니다.

기본적으로 은폐는 설정되지 않습니다. 설정하려면 coInitializeSecurity 또는 SetBlanketpCapabilities 매개 변수에 EOAC_STATIC_CLOAKING 또는 EOAC_DYNAMIC_CLOAKING 전달합니다.

CoInitializeSecurity를 사용하여 정적 은폐를 사용하도록 설정하면 프록시를 처음 호출할 때 각 프록시가 토큰(스레드 또는 프로세스)을 선택합니다. SetBlanket을 사용하여 정적 은폐를 사용하도록 설정하면 프록시는 해당 시점에 스레드에서 토큰을 선택합니다. SetBlanket을 호출할 때 사용할 수 있는 스레드 토큰이 없는 경우 프로세스 토큰이 프록시의 ID에 사용됩니다. 기본적으로 SetBlanket 은 프록시의 ID를 수정합니다.

동적 은폐를 사용하면 CoInitializeSecurity 또는 SetBlanket을 사용하여 동적 은폐가 설정되었는지 여부에 관계없이 프록시의 ID가 동일한 방식으로 결정됩니다. 현재 스레드 토큰이 있는 경우 사용됩니다. 그렇지 않으면 프로세스 토큰이 사용됩니다.

CoInitializeSecurity 호출을 통해 전체 프로세스에 대해 은폐가 설정되고 프로세스 토큰으로 호출하려는 경우 호출하는 동안 가장하지 마세요.

은폐 및 가장 수준

앞에서 설명한 것처럼 은폐 기능은 가장하는 동안 서버에 표시되는 ID를 결정합니다. 은폐는 서버가 클라이언트를 대신하여 호출하는 다른 서버에 자체 ID가 아닌 ID를 프로젝팅하는 방법을 제공합니다. 가장 수준은 클라이언트가 서버에 부여한 권한의 양을 나타냅니다.

은폐하지 않고 가장하는 것은 작동하지만, 경우에 따라 최종 서버가 초기 호출자의 ID를 알아야 하기 때문에 최선의 선택이 아닐 수도 있습니다. 권한 있는 클라이언트만 원격 컴퓨터에 액세스할 수 있는지 확인하기 어렵기 때문에 은폐를 사용하지 않고는 이 작업을 수행할 수 없습니다. 가장을 은폐하지 않고 사용하는 경우 다운스트림 서버에 표시되는 ID는 즉시 호출 프로세스의 ID입니다.

그러나 은폐는 가장하지 않으면 유용하지 않습니다. 은폐는 클라이언트가 가장 또는 대리자의 가장 수준을 설정한 경우에만 의미가 있습니다. (가장 수준이 낮을수록 서버는 은폐된 호출을 할 수 없습니다.) 은폐의 성공 여부는 교차된 컴퓨터 경계 수와 가장 수준에 따라 달라지며, 이는 서버가 클라이언트를 대신하여 얼마나 많은 권한을 수행해야 하는지를 나타냅니다.

경우에 따라 클라이언트가 가장 수준을 RPC_C_IMP_LEVEL_IMPERSONATE 설정할 때 서버가 은폐를 설정하는 것이 합리적입니다. 그러나 특정 제한 사항이 적용됩니다. 원래 클라이언트가 가장 수준을 RPC_C_IMP_LEVEL_IMPERSONATE 설정하는 경우 중간 서버(동일한 컴퓨터에서 클라이언트 역할을 함)는 하나의 컴퓨터 경계에만 은폐할 수 있습니다. 가장 수준 가장 토큰은 하나의 컴퓨터 경계에서만 전달될 수 있기 때문입니다. 컴퓨터 경계를 넘은 후에는 로컬 리소스에만 액세스할 수 있습니다. 서버에 표시되는 ID는 설정된 은폐 유형에 따라 달라집니다. 은폐가 설정되지 않은 경우 서버에 표시되는 ID는 즉시 호출하는 프로세스의 ID입니다.

여러 컴퓨터 경계를 은폐하려면 적절한 은폐 기능 플래그와 대리자 수준 가장을 모두 지정해야 합니다. 이러한 유형의 가장을 사용하면 클라이언트의 로컬 자격 증명과 네트워크 자격 증명이 모두 서버에 제공되므로 가장 토큰은 임의의 수의 컴퓨터 경계를 넘을 수 있습니다. 다시 말하지만 서버에 표시되는 ID는 설정된 은폐 유형에 따라 달라집니다. 대리자 수준 가장을 사용하여 은폐가 설정되지 않은 경우 서버에 표시되는 ID는 호출을 수행하는 프로세스의 ID입니다.

예를 들어 프로세스 A가 B를 호출하고 B 호출이 C를 호출한다고 가정합니다. B가 은폐를 설정했고 A가 가장 수준을 가장하도록 설정했습니다. A, B 및 C가 동일한 컴퓨터에 있는 경우 가장 토큰을 A에서 B로 전달한 다음 C로 전달하면 작동합니다. 그러나 A와 C가 동일한 컴퓨터에 있고 B가 아닌 경우 토큰을 전달하면 A와 B 간에 작동하지만 B에서 C로 전달되지는 않습니다. B가 은폐하는 동안 C를 호출할 수 없으므로 B에서 C로의 호출이 실패합니다. 그러나 A가 가장 수준을 위임으로 설정하면 토큰을 B에서 C로 전달할 수 있으며 호출이 성공할 수 있습니다.

은폐 시나리오

다음 그림에서 프로세스 A는 B를 호출하고, C를 호출하고, 은폐가 설정되지 않은 경우 D를 호출합니다. 결과적으로 각 중간 프로세스는 이를 호출한 프로세스의 ID를 확인합니다.

은폐가 설정되지 않은 경우의 프로세스를 보여 주는 다이어그램

정적 은폐를 사용하면 서버는 클라이언트에서 서버로의 첫 번째 호출 중에 설정된 프록시 ID를 확인합니다. 다음 그림에서는 B에서 C로 호출하는 동안 설정되는 프록시 ID의 예를 보여줍니다. 후속 호출에서 프로세스 D는 B 및 C에서 정적 은폐를 설정할 때 B의 ID를 확인합니다.

정적 은폐 프로세스를 보여 주는 다이어그램

동적 은폐를 사용하면 가장하는 동안 호출자의 ID는 현재 스레드 토큰(있는 경우)을 기반으로 합니다. 다음 그림에서는 B와 C가 동적 은폐를 설정하고 D가 B에서 C로의 이전 호출에도 불구하고 A의 ID를 보는 상황을 보여 줍니다.

동적 은폐 프로세스를 보여 주는 다이어그램

위임 및 가장