다음을 통해 공유


은폐(COM)

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

다음 항목에서는 은폐에 대한 자세한 정보를 제공합니다.

은폐 유형

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

  • 정적 은폐(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
EOAC_STATIC_CLOAKING
선물
아니요
스레드 토큰
EOAC_STATIC_CLOAKING
선물

현재 프록시 ID
EOAC_STATIC_CLOAKING
없음
아니요
프로세스 토큰
EOAC_STATIC_CLOAKING
없음

현재 프록시 ID
EOAC_DYNAMIC_CLOAKING(EOAC_동적 은폐)
선물
상관없어
스레드 토큰
EOAC_동적_클로킹
없음
상관없어
프로세스 토큰

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

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

클로킹 설정

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

기본적으로 은폐는 설정되지 않습니다. 설정하려면 EOAC_STATIC_CLOAKING 또는 EOAC_DYNAMIC_CLOAKING을 pCapabilities 매개 변수에 전달하십시오 CoInitializeSecurity 또는 SetBlanket.

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에서 C로의 이전 호출에도 불구하고 B와 C가 동적 은폐를 설정하고 D가 A의 ID를 보는 상황을 보여 줍니다.

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

위임 및 사칭