在Unix中,当代表某个用户执行某些操作时,系统程序通常会调用seteuid(UID)(附带setegid())以先切换到该用户,执行操作,然后在完成切换回超级用户使用seteuid(0)。我的时间是seteuid(),它的大小是一到几微秒(意思是,相对于需要像操作文件或运行CGI程序那样的动作,它相当便宜)。
我不熟悉Windows API。我们在Windows上做同样的事情(但使用ImpersonateLoggedOnUser()+ RevertToSelf()API函数)?一般来说,这些功能有多快?
答案 0 :(得分:2)
大致相同,但要记住一个重要的区别:您提到的Windows API需要HANDLE才能使用有效令牌。
换句话说,即使以SYSTEM(或任何具有SeTcbPrivilege的进程)运行,您也需要模拟 登录用户 。
用户可以通过多种方式登录:
在大多数情况下,创建进程会使其继承当前令牌。
在IIS中使用Kerberos,NTLM或HTTP BASIC auth并不重要。它都是由Windows验证的,因此您可以获得令牌。另一方面,Tomcat中的HTTP BASIC身份验证不会为您提供Windows令牌,因此模拟是无法实现的。
现在有了棘手的部分。
当您考虑它时,令牌实际上只是一个具有授权(DACL)和审计(SACL)访问控制列表的内存结构。它由Authentication Package(AP)创建。是AP创建令牌。有点像Unix中的PAM,可以用自定义代码替换AP。
事实上,存在一个开源setuid认证包。将CVS移植到Windows NT的人完成了编写creates a token out of thin air的AP的工作,只要您拥有SeTcbPrivilege(根等效)。我从未尝试过,但它可以在本地计算机上为没有用户的用户提供令牌。代码相当陈旧(它只会创建提升的令牌)但除此之外,它还是LGTM。没有身份验证,没有密码或智能卡,因此使用该令牌运行的进程将无法使用它来向另一台计算机进行身份验证。
总结:
一个建议:我的Programming Windows Security副本全部是黄色的咖啡,其中的便利贴已经挂掉并撕裂了页面。有关该主题的最佳文本,如果您想了解Windows安全性,必须阅读。