windows安全模型--令牌(token)和安全描述符

      当一个程序访问一个资源时,需要有相应的访问权限。windwos安全模型中,有两个角色,一个就是访问者(进程),一个是被访问者(资源)。

      资源,也可以称为安全对象,是广义的,可以是文件,目录,注册表,管道,命名句柄,进程,线程。每个安全对象都有一个安全描述符,里面有ACL(访问列表)。ACL由若干条ACE组成。每一条ACE标记了一条访问规则,就是一个SID(一会可以在访问者中看到它)被允许或拒绝做某个操作(如读、写、执行)。可以看出,每个资源(安全对象)记录了谁(SID,可以是多个)可以执行什么样的操作。

      访问者,也就是进程中的线程。每个进程都一个令牌(TOKEN),令牌里面包含了若干个SID(一个用户SID,若干个组SID)。每个线程默认直接继承进程的token,线程还可以通过模拟,改变自己的token,让自己拥有别的用户的token。进程token,就是记录了进程是谁(SID,可以是多个)

      进程 =  资源,分别在windows安全模型等号的两端,可以看成 token = 安全描述符,再进一步,多个SID = SID 可以做什么操作。这个等式,就可以看出windows是如何去匹配一个程序是否可以访问一个资源了。进程在访问资源时,是访问者,具有token。同样,进程也可以是资源被别的进程访问,所以进程也具有安全描述符。

      在vista以后的系统,管理员组里的用户,启动的进程,在没有提升之前,其token中只包含了deny-only 的管理员组SID。deny-only的SID只会去匹配ACL中拒绝类型的ACE,不会去匹配允许类型的ACE。也就是说,在提成之前,进程的token中的管理员组SID,对进程的权限只能起到减法的作用。

      token中,还记录了若干个特权。特权是指执行一些特殊操作时,需要具有的权限。比如,要进程要执行关机命令,则改进程的token中需要有关机特权。特权是可以添加的。特权和上面说的资源访问,关系并不大。

      上面只是粗糙描述了安全匹配模型。在windows进行SID和ACL匹配之前,会先做完整性比较。完整性分四个级别:低,中,高,系统。服务具有系统完整性。资源也有完整性级别。通常情况下,两者的完整性都是中。低完整性的进程不能访问高完整性的资源。

你可能感兴趣的:(windows,编程)