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
- Como o encobrimento afeta a identidade do cliente
- Configuração Cloaking
- Níveis de camuflagem e imitação
- Cenários de camuflagem
- Tópicos relacionados
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.
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.
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.
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.