Utilisez l’authentification par défaut et séparez la dissimulation et l’emprunt d’identité dans l’appel DCOM

J’essaie de réaliser deux choses avec DCOM (Hors processus)

  1. Définissez l’authentification à l’échelle du processus à l’aide de CoInitializeSecurity et de son paramètre pAuthList.
  2. Utiliser le camouflage pour changer l’identité de l’appelant dans des situations spéciales (appels COM)

Mes pensées:

  1. La structure auth info contient les informations d’authentification par défaut (comme le nom d’utilisateur et le mot de passe pour RPC_C_AUTHN_WINNT) pour tous les nouveaux appels COM. Ainsi, au lieu du jeton de processus, les informations de la structure d’authentification doivent être utilisées par COM. Cependant, tous les appels / connexions COM utilisent toujours l’identité du processus au lieu de l’identité par défaut appliquée.

  2. En règle générale, on peut utiliser CoSetProxyBlanket pour modifier les informations d’authentification d’un proxy. Cela fonctionne pour moi. Ma question ici est de savoir si elle doit ou non fonctionner si je personnifie le jeton moi-même et appelle la fonction COM. J’ai lu dans divers articles MSDN qu’appliquer EOAC_DYNAMIC_CLOAKING à CoInitializeSecurity devrait le faire fonctionner. Cependant, mes appels COM “toujours empruntés” affichent toujours l’identité du processus côté serveur.

Le client ressemble à ceci (Delphi)

var authList : SOLE_AUTHENTICATION_LIST; authidentity : SEC_WINNT_AUTH_IDENTITY_W; authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO; pcAuthSvc : DWORD; asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE; Token : TJwSecurityToken; begin ZeroMemory( @authidentity, sizeof(authidentity) ); authidentity.User := 'Testbenutzer'; authidentity.UserLength := Length('Testbenutzer'); authidentity.Domain := ''; authidentity.DomainLength := 0; authidentity.Password := 'test'; authidentity.PasswordLength := 4; authidentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE; ZeroMemory( @authInfo, sizeof( authInfo ) ); // NTLM Settings authInfo[0].dwAuthnSvc := RPC_C_AUTHN_WINNT; authInfo[0].dwAuthzSvc := RPC_C_AUTHZ_NONE; authInfo[0].pAuthInfo := @authidentity; authList.cAuthInfo := 1; authList.aAuthInfo := @authInfo; OleCheck(CoInitializeSecurity( NULL, // Security descriptor -1, // Count of ensortinges in asAuthSvc NULL, // asAuthSvc array NULL, // Reserved for future use RPC_C_AUTHN_LEVEL_CONNECT, // Authentication level RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation level @authList, // Authentication Information DWORd(EOAC_DYNAMIC_CLOAKING), // Additional capabilities NULL // Reserved )); //create COM object int := CoSecurityTestObj.Create; int.TestCall; 

Le serveur a également défini l’indicateur EOAC_DYNAMIC_CLOAKING. Il utilise CoImpersonateClient pour obtenir le jeton de thread et le nom d’utilisateur. Il utilise également CoQueryClientBlanket pour obtenir l’authInfo (en tant que structure SEC_WINNT_AUTH_IDENTITY_W). Cependant, les deux appels renvoient toujours l’identité du processus du client.

En outre, l’usurpation d’identité manuelle ne fonctionne pas (2.):

 Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT); Token.ImpersonateLoggedOnUser; int := CoSecurityTestObj.Create; int.TestCall; 

Questions encore:

  1. Ai-je tort ou pourquoi la structure d’authentification par défaut (WinNT avec nom d’utilisateur et mot de passe) n’est-elle pas utilisée comme authentification par défaut dans chaque connexion / appel COM?

  2. Ai-je tort ou pourquoi l’emprunt d’identité manuel ne fonctionne-t-il pas? Sachez que j’ai testé séparément le numéro 2. Le numéro 1 ne peut donc pas interférer.

Ceci est un travail de base pour la bibliothèque de codes de sécurité Windows JEDI que j’élargis pour prendre en charge la sécurité COM. Donc, votre aide ira à GPL / MPL.

Les références:

Cape:

  1. http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
  2. http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
  3. http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html

CoInitializeSecurity et pAuthInfo

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/93.htm

Obtenir une couverture de sécurité (côté serveur)

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/92.htm

Avez-vous essayé d’appeler CoInitializeSecurity () avec RPC_C_AUTHN_LEVEL_CALL au lieu de RPC_C_AUTHN_LEVEL_CONNECT?

Généralement, lorsque je crée des clients DCOM, je crée COSERVERINFO et passe à CoCreateInstanceEx () avec des informations d’identification de sécurité, en me rappelant d’appeler CoSetProxyBlanket () sur toutes les interfaces.