Partilhar via


Cloaking (COM)

O cloaking é uma funcionalidade de segurança COM que determina qual identidade o cliente apresenta ao servidor durante a imitação. Quando o cloaking é definido, o servidor intermediário mascara sua própria identidade e apresenta a identidade do cliente ao servidor que ele chama em nome do cliente. Basicamente; A identidade do cliente que é vista pelo servidor é a identidade associada ao proxy. A identidade do proxy é determinada por vários fatores, um dos quais é o tipo de camuflagem que é definido (se houver). O encobrimento não é suportado pelo provedor de segurança Schannel.

Os tópicos a seguir fornecem mais informações sobre cloaking:

Tipos de camuflagem

Existem dois tipos de camuflagem: camuflagem estática e camuflagem dinâmica:

  • Com o cloaking estático (EOAC_STATIC_CLOAKING), o servidor vê o token de thread a partir da primeira chamada de um cliente para o servidor. Para a primeira chamada, se a identidade de proxy foi definida anteriormente durante uma chamada para CoSetProxyBlanket, essa identidade de proxy é usada. No entanto, se a identidade do proxy não tiver sido definida anteriormente, o token de thread será usado. Se nenhum token de thread estiver presente, o token de processo será usado. Para todas as chamadas futuras, a identidade definida na primeira chamada é usada.
  • Com o encobrimento dinâmico (EOAC_DYNAMIC_CLOAKING), em cada chamada o token de thread atual (se houver um token de thread) é usado para determinar a identidade do cliente. Se não houver nenhum token de thread, o token de processo será usado. Isso significa que, durante a personificação, os servidores chamados em nome do cliente veem a identidade do cliente COM que originou a chamada, o que geralmente é o comportamento desejado. (É claro que, para que a representação seja bem-sucedida, o cliente deve ter dado ao servidor autoridade para representar definindo um nível de representação apropriado. Para obter mais informações, consulte Níveis de representação.) Este tipo de camuflagem é caro.

Como o encobrimento afeta a identidade do cliente

Quando uma chamada criptografada é feita e o servidor solicita ao cliente sua identidade, ele geralmente obtém a identidade vinculada ao proxy. (Às vezes, o serviço de autenticação executa uma tradução da identidade real, mas geralmente a identidade do proxy é a identidade que o servidor vê.) O proxy apresenta uma identidade para o servidor que depende do tipo de ocultação que está definido e outros fatores.

Para resumir, a identidade do cliente é uma função do sinalizador de ocultação definido, do token de processo, da presença ou ausência de um token de thread e se a identidade do proxy foi configurada anteriormente. A tabela a seguir mostra a identidade de proxy resultante (identidade do cliente) quando esses fatores variam.

Bandeiras de camuflagem Presença de Token de Thread Identidade de proxy definida anteriormente Identidade de proxy (identidade do cliente)
Cloaking não definido
Não se importa
Não se importa
Token de processo ou identidade de autenticação
EOAC_STATIC_CLOAKING
Atualidade
Não
Token de encadeamento
EOAC_STATIC_CLOAKING
Atualidade
Sim
Identidade de proxy atual
EOAC_STATIC_CLOAKING
Não presente
Não
Token de processo
EOAC_STATIC_CLOAKING
Não presente
Sim
Identidade de proxy atual
EOAC_DYNAMIC_CLOAKING
Atualidade
Não se importa
Token de thread
EOAC_DYNAMIC_CLOAKING
Não presente
Não se importa
Token de processo

O fluxograma a seguir ilustra como a identidade do proxy é determinada em diferentes situações.

Diagrama que mostra o fluxo para determinar a identidade do proxy.

Configuração de Camuflagem

Cloaking é configurado como uma marca de capacidade em uma chamada para CoInitializeSecurity, que define cloaking para todo o processo. A capacidade de ocultação é definida até que o cliente a altere por meio de uma chamada para IClientSecurity::SetBlanket (ou para CoSetProxyBlanket), que define a ocultação para o proxy.

Por padrão, a camuflagem não está definida. Para defini-lo, passe EOAC_STATIC_CLOAKING ou EOAC_DYNAMIC_CLOAKING para o parâmetro pCapabilities em CoInitializeSecurity ou SetBlanket.

Quando o cloaking estático é ativado usando CoInitializeSecurity, cada proxy obtém um token (thread ou processo) na primeira vez que se efetua uma chamada no proxy. Quando o mascaramento estático é habilitado usando o SetBlanket , o proxy captura o token na thread naquele momento. Se nenhum token de thread estiver disponível quando o método SetBlanket for chamado, o token de processo será usado para a identidade do proxy. Basicamente, SetBlanket corrige a identidade do proxy.

Com o cloaking dinâmico, a identidade do proxy é determinada da mesma maneira, independentemente de o cloaking dinâmico ser definido usando CoInitializeSecurity ou com SetBlanket. O token de thread atual é usado se houver um; caso contrário, o token de processo será usado.

Se o cloaking estiver definido para todo o processo por meio de uma chamada para CoInitializeSecurity e se pretender fazer chamadas com o token de processo, não faça impersonação ao realizar as chamadas.

Níveis de camuflagem e representação

Como mencionado anteriormente, o recurso de ocultação determina qual identidade é apresentada a um servidor durante a impersonação. O cloaking fornece uma maneira para um servidor projetar uma identidade diferente da sua para outro servidor que está chamando em nome do cliente. O nível de representação indica quanta autoridade o cliente deu ao servidor.

A representação sem camuflagem funciona, mas pode não ser a melhor escolha porque, em alguns casos, o servidor final precisa saber a identidade do chamador inicial. Isso não pode ser conseguido sem o uso de cloaking porque é difícil garantir que apenas clientes autorizados possam acessar um computador remoto. Quando a representação é usada sem ocultação, a identidade apresentada a um servidor a jusante é a do processo de chamada imediata.

No entanto, a camuflagem não é útil sem a personificação. A ocultação só faz sentido quando o cliente definiu um nível de personificação como 'impersonate' ou 'delegate'. (Com níveis de impersonação mais baixos, o servidor não pode fazer chamadas mascaradas.) Se o mascaramento é bem-sucedido depende do número de limites de computador ultrapassados e do nível de impersonação, que indica quanta autoridade o servidor possui para atuar em nome do cliente.

Em algumas situações, faz sentido o servidor ativar o cloaking quando o cliente define o nível de representação como RPC_C_IMP_LEVEL_IMPERSONATE. No entanto, estão em vigor algumas limitações. Se o cliente original definir o nível de representação como RPC_C_IMP_LEVEL_IMPERSONATE, o servidor intermediário (agindo como um cliente no mesmo computador) pode transcender apenas uma fronteira de computador. Isso ocorre porque um token de representação a nível de personificação só pode ser passado através de um limite de computador. Depois que o limite do computador for ultrapassado, somente os recursos locais poderão ser acessados. A identidade apresentada ao servidor depende do tipo de camuflagem que é definido. Se não for definido nenhum cloaking, a identidade apresentada a um servidor será a do processo que efetua a chamada imediata.

Para ultrapassar vários limites de computador, você deve especificar um sinalizador de capacidade de ocultação apropriado e uma representação de nível delegado. Com esse tipo de representação, as credenciais locais e de rede do cliente são fornecidas ao servidor, para que o token de representação possa cruzar qualquer número de limites do computador. Novamente, a identidade apresentada ao servidor depende do tipo de ocultação que é definido. Se nenhum encobrimento for definido com representação em nível de delegado, a identidade apresentada a um servidor será a do processo que faz a chamada.

Por exemplo, suponha que o Processo A chama B e B chama C. B definiu o encobrimento e A definiu o nível de representação para representar. Se A, B e C estiverem no mesmo computador, passar o token de representação de A para B e, em seguida, para C funcionará. Mas se A e C estiverem no mesmo computador, e B não, passar o token funcionará entre A e B, mas não de B para C. A chamada de B para C falhará porque B não pode chamar C durante o encobrimento. No entanto, se A definir o nível de representação para delegar, o token pode ser passado de B para C e a chamada pode ser bem-sucedida.

Cenários de camuflagem

Na ilustração a seguir, o Processo A chama B, chama C, chama D quando a camuflagem não está definida. Como resultado, cada processo intermediário vê a identidade do processo que o chamou.

Diagrama que mostra o processo quando a camuflagem não está definida.

Com o cloaking estático, o servidor vê a identidade de proxy que foi definida durante a primeira chamada do cliente para o servidor. A figura a seguir mostra um exemplo da identidade de proxy que está sendo definida durante uma chamada de B para C. Em uma chamada subsequente, o Processo D vê a identidade de B quando o encobrimento estático é definido por B e C.

Diagrama que mostra o processo de camuflagem estática.

Com a ocultação dinâmica, a identidade do chamador durante a representação é baseada no token do thread atual, caso exista. A ilustração a seguir mostra a situação em que B e C ativam a camuflagem dinâmica e D vê a identidade de A, mesmo após uma chamada anterior de B para C.

Diagrama que mostra o processo de camuflagem dinâmica.

Delegação e Impersonação