COM安全的基础是Windows安全,在Windows中,安全的最小边界是进程,所以进程内组件通常不需要考虑安全,但是如果编写进程外组件,客户是否有权访问进程外的组件,就需要通过安全检查。
COM安全主要包括认证、访问控制和令牌管理:
认证的作用------
检验发送消息者的身份的确就是他所声称的那个身份,并且消息也的确是他发送的。
我们可以选择认证协议,可以选择认证级别。下面的代码片断选择了Kerberos认证协议,并选择了在第一个方法调用时客户的安全凭证需要在服务器上认证
SOLE_AUTHENTICATION_SERVICE AuthSvc[1];
AuthSvc[0].dwAuthnSvc=RPC_C_AUTHN_GSS_KERBEROS;
AuthSvc[0].dwAuthzSvc=NULL;
AuthSvc[0].pPrincipalName=NULL;
hr=::CoInitializeSecurity(pAccessCtl.p,1,AuthSvc,NULL,RPC_C_AUTHN_LEVEL_CONNECT,RPC_C_IMP_LEVEL_IDENTIFY ,NULL,EOAC_ACCESS_CONTROL,NULL);
访问控制的作用------
1) 允许谁启动服务器进程
在注册表中组件的APPID键中有一项LaunchPermission,记录了系统中可以启动服务器进程的账号的二进制码,通常我们创建了EXE形式的组件后,注册表中并没有这一项,需要通过DCOMNCNFG.EXE来设置。如果启动进程时找不到这一项,会从HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Ole/中寻找DefaultLaunchPermission的值。如果连DefaultLaunchPermission都找不到,系统将拒绝任何激活请求。
2) 检验访问者是否具有权限访问服务器的对象
在注册表中组件的APPID键中有一项AccessPermission,记录了系统中可以访问服务器进程的账号的二进制码。同样我们可以通过DCOMNCNFG.EXE进行设置。如果跨进程调用时COM没有找到AccessPermission,就会查找机器范围内有无默认设置,通常找不到,这时,COM会创建一个新的访问控制列表,只允许SYSTEM账号访问。
启动服务器的进程权限检查总是通过注册表来设置,而访问进程的权限也可以通过调用
CoInitializeSecurity函数来解决。我们可以通过将IAccessControl接口作为第一个参数传递给该函数,同时指定dwCapabilities参数为EOAC_ACCESS_CONTROL。