Ocultamiento (COM)

El ocultamiento es una funcionalidad de seguridad COM que determina la identidad que el cliente proyecta hacia el servidor durante la suplantación. Cuando se establece el ocultamiento, el servidor intermedio enmascara su propia identidad y presenta la identidad del cliente al servidor al que llama en nombre del cliente. Básicamente; la identidad de cliente que ve el servidor es la identidad asociada al proxy. La identidad del proxy viene determinada por varios factores, uno de los cuales es el tipo de ocultación que se establece (si existe). El proveedor de seguridad de Schannel no admite el ocultamiento.

En los temas siguientes se proporciona más información sobre el ocultamiento:

Tipos de cloaking

Hay dos tipos de ocultación: ocultación estática y ocultación dinámica :

  • Con el ocultamiento estático (EOAC_STATIC_CLOAKING), el servidor ve el token de subproceso desde la primera llamada de un cliente al servidor. Para la primera llamada, si la identidad de proxy se estableció anteriormente durante una llamada a CoSetProxyBlanket, se usa esa identidad de proxy. Sin embargo, si la identidad de proxy no se estableció anteriormente, se usa el token de subproceso. Si no hay ningún token de subproceso presente, se usa el token de proceso. Para todas las llamadas futuras, se usa la identidad establecida en la primera llamada.
  • Con el ocultamiento dinámico (EOAC_DYNAMIC_CLOAKING), en cada llamada al token de subproceso actual (si hay un token de subproceso) se usa para determinar la identidad del cliente. Si no hay ningún token de subproceso, se usa el token de proceso. Esto significa que los servidores a los que se llama en nombre del cliente durante la suplantación ven la identidad del cliente COM que originó la llamada, que suele ser el comportamiento deseado. (Por supuesto, para que la suplantación se realice correctamente, el cliente debe haber dado a la autoridad del servidor que suplantar estableciendo un nivel de suplantación adecuado. Para obtener más información, vea Niveles de suplantación). Este tipo de ocultación es caro.

Cómo afecta el ocultamiento a la identidad de cliente

Cuando se realiza una llamada cifrada y el servidor solicita al cliente su identidad, normalmente obtiene la identidad vinculada al proxy. (A veces, el servicio de autenticación realiza una traducción de la identidad real, pero generalmente la identidad de proxy es la identidad que ve el servidor). El proxy presenta una identidad al servidor que depende del tipo de ocultación que se establece y otros factores.

En resumen, la identidad del cliente es una función del conjunto de marcas de ocultación, el token de proceso, la presencia o ausencia de un token de subproceso y si la identidad del proxy se ha establecido anteriormente. En la tabla siguiente se muestra la identidad de proxy resultante (identidad de cliente) cuando estos factores varían.

Ocultar marcas Presencia de token de subproceso Identidad de proxy establecida anteriormente Identidad de proxy (identidad de cliente)
No se ha ajustado el cloaking
No te importa
No te importa
Procesar token o identidad de autenticación
EOAC_STATIC_CLOAKING
Presente
No
Token de subproceso
EOAC_STATIC_CLOAKING
Presente

Identidad de proxy actual
EOAC_STATIC_CLOAKING
No está presente
No
Token de proceso
EOAC_STATIC_CLOAKING
No está presente

Identidad de proxy actual
EOAC_DYNAMIC_CLOAKING
Presente
No te importa
Token de subproceso
EOAC_DYNAMIC_CLOAKING
No está presente
No te importa
Token de proceso

En el diagrama de flujo siguiente se muestra cómo se determina la identidad del proxy en diferentes situaciones.

Diagrama que muestra el flujo para determinar la identidad del proxy.

Establecer el ocultamiento

El ocultamiento se establece como una marca de funcionalidad en una llamada a CoInitializeSecurity, que establece el ocultamiento de todo el proceso. A continuación, la funcionalidad de ocultación se establece hasta que el cliente la cambia a través de una llamada a IClientSecurity::SetBlanket (o a CoSetProxyBlanket), que establece el ocultamiento del proxy.

De forma predeterminada, no se establece el ocultamiento. Para establecerlo, pase EOAC_STATIC_CLOAKING o EOAC_DYNAMIC_CLOAKING al parámetro pCapabilities en CoInitializeSecurity o SetBlanket.

Cuando se habilita el ocultamiento estático mediante CoInitializeSecurity, cada proxy recoge un token (subproceso o proceso) la primera vez que realiza una llamada en el proxy. Cuando se habilita el ocultamiento estático mediante SetBlanket, el proxy recoge el token en el subproceso en ese momento. Si no hay ningún token de subproceso disponible cuando se llama a SetBlanket , el token de proceso se usa para la identidad del proxy. Básicamente, SetBlanket corrige la identidad del proxy.

Con el ocultamiento dinámico, la identidad del proxy se determina de la misma manera, independientemente de si el ocultamiento dinámico se establece mediante CoInitializeSecurity o con SetBlanket. El token de subproceso actual se usa si hay uno; de lo contrario, se usa el token de proceso.

Si el ocultamiento se establece para todo el proceso a través de una llamada a CoInitializeSecurity y desea realizar llamadas con el token de proceso, no se suplanta al realizar llamadas.

Niveles de ocultación y suplantación

Como se mencionó anteriormente, la funcionalidad de ocultación determina qué identidad se presenta a un servidor durante la suplantación. El ocultamiento proporciona una manera de que un servidor proyecta una identidad distinta de la suya a otro servidor al que llama en nombre del cliente. El nivel de suplantación indica la cantidad de autoridad que el cliente ha dado al servidor.

La suplantación sin ocultar funciona, pero puede que no sea la mejor opción porque, en algunos casos, el servidor final debe conocer la identidad del autor de la llamada inicial. Esto no se puede lograr sin usar el ocultamiento porque es difícil asegurarse de que solo los clientes autorizados puedan acceder a un equipo remoto. Cuando se usa la suplantación sin ocultar, la identidad presentada a un servidor de bajada es la del proceso de llamada inmediato.

Sin embargo, el ocultamiento no es útil sin suplantación. El ocultamiento solo tiene sentido cuando el cliente ha establecido un nivel de suplantación de suplantación o delegado. (Con niveles de suplantación inferiores, el servidor no puede realizar llamadas ocultas). Si el ocultamiento se realiza correctamente depende del número de límites de equipo cruzados y del nivel de suplantación, lo que indica cuánta autoridad tiene que actuar el servidor en nombre del cliente.

En algunas situaciones, tiene sentido que el servidor establezca el ocultamiento cuando el cliente establece el nivel de suplantación en RPC_C_IMP_LEVEL_IMPERSONATE. Sin embargo, algunas limitaciones están en vigor. Si el cliente original establece el nivel de suplantación en RPC_C_IMP_LEVEL_IMPERSONATE, el servidor intermedio (que actúa como cliente en el mismo equipo) solo puede ocultarse a través de un límite de equipo. Esto se debe a que un token de suplantación de nivel de suplantación solo se puede pasar a través de un límite de equipo. Una vez que se haya cruzado el límite del equipo, solo se puede acceder a los recursos locales. La identidad presentada al servidor depende del tipo de ocultación establecida. Si no se establece ningún ocultamiento, la identidad presentada a un servidor será la del proceso que realiza la llamada inmediata.

Para ocultar varios límites de equipo, debe especificar tanto una marca de funcionalidad de ocultación adecuada como una suplantación de nivel delegado. Con este tipo de suplantación, las credenciales de red y local del cliente se proporcionan al servidor, por lo que el token de suplantación puede cruzar cualquier número de límites de equipo. De nuevo, la identidad presentada al servidor depende del tipo de ocultación establecida. Si no se establece ningún ocultamiento con suplantación de nivel de delegado, la identidad presentada a un servidor es la del proceso que realiza la llamada.

Por ejemplo, supongamos que el proceso A llama a B y B llama a C. B ha establecido el ocultamiento y A ha establecido el nivel de suplantación para suplantar. Si A, B y C están en el mismo equipo, pasará el token de suplantación de A a B y, a continuación, a C funcionará. Pero si A y C están en el mismo equipo, y B no es, pasar el token funcionará entre A y B, pero no de B a C. Se producirá un error en la llamada de B a C porque B no puede llamar a C mientras se oculta. Sin embargo, si A establece el nivel de suplantación para delegar, el token se puede pasar de B a C y la llamada puede realizarse correctamente.

Escenarios de ocultación

En la ilustración siguiente, El proceso A llama a B, llama a C, llama a D cuando no se establece el ocultamiento. Como resultado, cada proceso intermedio ve la identidad del proceso que lo llamó.

Diagrama que muestra el proceso cuando no se establece el ocultamiento.

Con el ocultamiento estático, el servidor ve la identidad de proxy que se estableció durante la primera llamada del cliente al servidor. En la ilustración siguiente se muestra un ejemplo de la identidad de proxy que se establece durante una llamada de B a C. En una llamada posterior, Process D ve la identidad de B cuando B y C establecen el ocultamiento estático.

Diagrama que muestra el proceso de ocultación estática.

Con el ocultamiento dinámico, la identidad del autor de la llamada durante la suplantación se basa en el token de subproceso actual, si hay uno. En la ilustración siguiente se muestra la situación en la que B y C establecen el ocultamiento dinámico y D ve la identidad de A, a pesar de una llamada anterior de B a C.

Diagrama que muestra el proceso de ocultación dinámica.

Delegación y suplantación