technologies powertrain locations empresa careers aptiv security delphi com

security - powertrain - Usar autenticación predeterminada y ocultación/suplantación por separado en la llamada DCOM



delphi products (1)

¿Has intentado llamar a CoInitializeSecurity () con RPC_C_AUTHN_LEVEL_CALL en lugar de RPC_C_AUTHN_LEVEL_CONNECT?

Por lo general, cuando creo clientes DCOM, creo COSERVERINFO y paso a CoCreateInstanceEx () con credenciales de seguridad, recordando llamar a CoSetProxyBlanket () en todas las interfaces.

Intento lograr dos cosas con DCOM (Fuera de proceso)

  1. Establezca la autenticación de todo el proceso utilizando CoInitializeSecurity y su parámetro pAuthList.
  2. Usar encubrimiento para cambiar la identidad de la persona que llama en situaciones especiales (llamadas COM)

Mis pensamientos:

  1. AFAIK la estructura de información de autenticación contiene la información de autenticación predeterminada (como nombre de usuario y contraseña para RPC_C_AUTHN_WINNT) para todas las llamadas COM nuevas. Entonces, en lugar del token de proceso, la información en la estructura de autenticación debería ser utilizada por COM. Sin embargo, todas las llamadas / conexiones COM siempre usan la identidad del proceso en lugar de la predeterminada.

  2. Por lo general, uno puede usar CoSetProxyBlanket para cambiar la información de autenticación de un proxy. Esto funciona para mí Mi pregunta aquí es si debe o no funcionar si me hago pasar por el token y llamo a la función COM. He leído en varios artículos de MSDN que aplicar EOAC_DYNAMIC_CLOAKING a CoInitializeSecurity debería hacerlo funcionar. Sin embargo, mis llamadas COM suplantadas manualmente siempre muestran la identidad del proceso en el lado del servidor.

El cliente se ve así (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 entries 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;

El servidor también ha establecido el indicador EOAC_DYNAMIC_CLOAKING. Utiliza CoImpersonateClient para obtener el token de hilo y el nombre de usuario. También usa CoQueryClientBlanket para obtener authInfo (como estructura SEC_WINNT_AUTH_IDENTITY_W). Sin embargo, ambas llamadas siempre devuelven la identidad del proceso del cliente.

También suplantar manualmente no funciona (2.):

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

Preguntas de nuevo:

  1. ¿Estoy equivocado o por qué la estructura de información de autenticación predeterminada (WinNT con nombre de usuario y contraseña) no se utiliza como autenticación predeterminada en cada conexión / llamada COM?

  2. ¿Estoy equivocado o por qué no funciona la suplantación manual? Tenga en cuenta que probé el número 2. por separado, por lo que el número 1. no puede interferir.

Este es un trabajo básico para la Biblioteca de códigos de seguridad de JEDI Windows, que amplío para admitir la seguridad COM. Entonces tu ayuda será GPL / MPL.

Referencias

Encubierto:

  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 y pAuthInfo

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

Obtener manta de seguridad (lado del servidor)

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