您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 【Windows】 Vista服务详解
WindowsVista的服务本文档提供了一些WindowsVista服务的相关信息。对于想在这个版本的Windows上面开发服务程序的开发者们,本文档也提供了一些最优方法。这些信息应用在Windows操作系统上。微软可能会随时更改本文档内容,可在以下地址获取最新的英文版本。=71280Windows服务概述MicrosoftWindows服务就是程序,通常,它们虽Windows一起启动,并在后台运行,直到被关闭。严格一点说,服务就是所有用服务API实现的Windows程序。通常,服务处理一些低级别的任务,这些任务很少需要和用户交互。尽管服务对于用户通常是不可见的,但Windows功能又离不开他们。服务处理许多重要的操作系统功能,包括:1、联网。很多系统服务支持联网。比如动态主机配置协议(DynamicHostConfigurationProtocol,DHCP)客户端服务通过存储和更新系统的IP地址来管理网络配置。2、硬件。即插即用服务(PlugandPlay)使计算机可以识别硬件配置的变化并做出响应,例如用户添加或者卸载了一个硬件。3、远程访问。终端服务(TerminalServices)允许用户在远程登陆计算机。除了Windows自带的服务,大部分计算机还会运行很多第三方的服务。见到最多的就是防火墙和防病毒程序。服务怎样运行服务和一般程序最主要的区别是,服务被服务控制管理器(ServiceControlManager,SCM)管理。使用服务API实现服务,这些API处理服务和SCM之间的交互。SCM维护一个数据库,这个数据库放置了所有已安装服务的信息,并提供一个统一的方法来控制这些服务:1、开始和停止服务。2、管理正在运行的服务。3、维护服务相关的状态信息。服务有三种状态:已运行,已停止,已暂停。1、已运行是服务的一般运行状态。2、已停止的服务已经完全关闭,必须经过一个启动过程,才能再次进入已运行的状态。3、已暂停服务中止处理,但是还驻留在内存中,并且继续响应控制请求。以暂停的服务可以跳过启动过程直接进入以运行的状态。服务的一个关键的特征是它怎样被启动。SCM管理的数据库里有这样的信息。有三种启动模式:1、自动。在系统引导中,SCM自动启动这些服务。2、手动。想启动这类服务,必须利用控制面板中的管理工具。3、禁用。这些服务不能被启动。要想启动这类服务,用户必须把启动模式调整为自动或者手动当服务启动后,SCM利用控制请求来管理服务的状态。比如,SCM向服务发送控制请求,通知服务暂停,继续运行,或者准备关闭。SCM的数据库也包含了服务的安全设置。这些设置控制服务有多少权限去访问系统资源,也使得系统管理者可以控制每个服务的权限。WindowsVista中Windows服务的变化多年来,服务已经成为Windows一个重要的组成部分。它使得开发者们可以创建长时间运行的程序:1、可以随计算机自动启动。2、可以被暂停和重开。3、无论用户登陆与否,都能运行。4、可以运行在一个独立的账户环境下,这个账户可以不同于已登陆的账户和默认账户。这些特点使得服务可以长时间的运行,而不干扰在同一计算机上工作的用户。自从服务概念的引入,服务的运行环境已经发生了很大的变化。这些变化已经带来了一些很多问题:安全性、可靠性、性能、操作和管理。这一节,讨论一下对于WindowsVista做出的改进。安全性增强近些年,服务已经成为那些病毒制造者们的目标。最近的例子有:“Blaster”、“Sasser”、和“CodeRed”。对于这个现象,有很多原因:1、服务基本上都在长时间运行。通常,从系统启动到关闭,它们都在运行。2、服务通常都是面向网络的,这使得他们极易受到远程攻击。3、服务基本上以高权限账户运行,比如LocalSystem。这一节,讨论一下对于WindowsVista做出的改进,这些改进为了缓和服务的安全问题。这些改变有两个重要的目的:1、限制用户程序访问服务。会话0隔离(Session0isolation)要求服务和用户程序运行在隔离的会话里。2、“固化”服务使不安全服务破系统的可能性降低。有以下两个互补的方法来达到这个目的:最小权限,使得服务运行在它所需要的权限范围内,做不了其他的事情。服务隔离,利用唯一的服务标识,使服务如其他服务和程序隔离开。服务可以利用这个标识来限制其他服务和程序对它的资源的访问,也可以限制自己对其他服务和程序的资源访问。比如,服务隔离允许防病毒服务维护签名定义文件的专门入口。以最小权限运行Windows服务通常以LocalSystem账户运行,这个账户具有系统的最高权限。这样的服务成为病毒制造者很有吸引力目标。理想情况下,服务应该以低权限级的LocalService或者NetworkService账户运行,从而减小对系统潜在的破坏。但是,很多服务需要的一些权限只有LocalSystem能够支持。在WindowsVista之前就用的“all-or-nothing”模型意思是,服务得到了一些LocalSystem的权限后,它也同时具有了LocalSystem的所有其他权限。这意味着很多时候,服务所具有的权限不是它所需要的,产生对系统潜在的破坏性。WindowsVista允许服务以最小权限运行,解决了这个问题。服务不会再被标准账户支持的默认权限所限制。服务可以选择账户,这个账户有他们需要的权限,之后,服务还可以去掉所有它不需要的权限。这个功能可以用于所有的账户类型:LocalService,NetworkService,LocalSystem,一个域,或者一个本地账户。服务利用一些机制来声明他们所需要的权限,这些机制将在之后讨论。当SCM启动服务时:1、对于独立的服务,SCM逆着对照进程标记符检查权限需求列表,所有没有被要求的权限都会被从进程标识符上去掉。2、对于共享的服务,例如svchost的服务宿主,在这个组里的所有服务需要的权限合并成权限列表。SCM只将没有任何一个成员服务需要的权限从进程标识符上删除。3、如果服务没有申明需要的权限,SCM假设服务需要与账户相关的所有权限。这样确保了向后兼容性。但是,如果服务组中有一个这样的服务,组中的其他服务也都以账户默认的一组权限运行。如果进程标识符里没有服务要求的权限,SCM不会启动这个服务。比如,以NetworkService账户运行的程序可以将SeTcbPrivilege指定为需要的权限。但是,NetworkService进程标识符不支持SeTcbPrivilege,所以启动失败。怎么指定所需权限1、Sc.exe——管理服务的命令行工具——有两个新命令,支持为服务指定所需权限。privs这个命令为服务设定一个权限。privs的语法是:scserverprivs[Privileges]qprivs这个命令查询服务需要的权限,qprivs的语法是:scserverqprivs[servicename]buffersizePrivileges是一个字符串,包含权限列表,以斜杠分开(/)。例如,指定备份和恢复权限,将Privileges设置成“SeBackupPrivilege/SeRestorePrivilege”。2、利用程序指定需要的权限,以下面的值为参数调用ChangeServiceConfig2:将dwInfo参数设置为SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO使lpInfo指向一个SERVICE_REQUIRED_PRIVILEGES_INFO结构。这个结构包含了一个字符串,字符串列出了需要的权限。使用QueryServiceConfig2查询服务需要的权限。权限的变化将在服务下一次启动时生效。注意一点,不管是命令行工具还是函数,都会检查列表中的权限是否有效,但是它们不能确定服务是否支持指定的权限。这个工作是由SCM在试图启动一个服务的时候做的。注意:权限列表只能被那些具有SERVICE_CHANGE_CONFIG权限的调用程序更改。默认情况下,只有本地管理员,权力用户和服务器操作员可以在远程或者本地取得得到这个权限。具有SERVICE_QUERY_CONFIG权限的调用程序可以查询需要的权限的列表。默认情况下,只有本地管理员,权力用户和服务器操作员可以在远程取得得到这个权限,服务和交互的用户可以在本地取得这个权限。服务隔离许多服务需要访问一些特定的对象,而这些对象只有高权限账户才能访问。比如,服务可能要向注册表写值,而注册表只有管理员能够访问。在WindowsVista以前的系统中,服务以象LocalSystem这样的高权限账户运行,从而得到访问这些对象的权限。还有一个做法,就是降低这些对象的安全性,使具有低权限的服务已可以访问它们。这两个方式都有可能使攻击者或病毒得到系统的控制权。对于管理员,唯一可以降低这个风险的方法是,建立一个服务的专有账户,只让这个账户具有访问这些对象的权限。但是,这样又带来了管理效率的问题:大量的密码管理,因为管理员再也利用不到使用系统内置账户的好处了。为了缓和这个问题,WindowsVista引入了服务隔离,它给服务提供了一个访问特定对象的方法,既不需要以高权限运行,又不需要降低对象的安全。例如,服务隔离允许一个反病毒服务运行在比LocalSystem权限更低的账户下,但这个反病毒服务还能完全访问它的特征定义文件或者注册表,通常这些只有管理员可以访问。服务隔离是一个专门用来保护资源(比如访问文件或者注册表的访问)的对象,它有一个包含服务安全ID(servicesecurityID,SID)的权限控制表。我们把这个ID叫做“per-serviceSID”,它来源于服务的名字,对于服务是唯一的。SID被分配给服务之后,服务的所有者就可以更改所需的对象的权限控制列表(accesscontrollists,ACLs),使得服务可以访问这个对象。例如,具有管理权限的服务才能够访问注册表键值HKEY_LOCAL_MACHINE¥SOFTWARE。把per-serviceSID添加到这个键值的ACL里,服务就可以运行在权限更低的账户下,但还可以访问这个键值。如果per-serviceSID被启用,它被添加到服务的进程标识符里。注意,在服务的进程被添加到进程标识符里的同时,必须启用per-serviceSID。per-serviceSID也允许,向进程标识符里添加几个SID之后,把进程标识符转换成一个限制标识符。利用受限SID减少潜在破坏使用per-serviceSID,提供了良好的隔离程度,并且允许服务运行在更低的权限账户下。但是,它并不阻止服务访问账户可以访问的资源,因为进程标识符包含了账户的SID。考虑下面的情况:X服务以LocalService账户运行,并且启用了SID。除了可以访问已经明确给予它访问权限的那些对象,它还可以访问LocalService账户可以访问的所有对象。如果这个服务涉及安全问题,攻击者可能利用它访问与这个服务不相关的资源,从而破坏系统。为了缓和这个问题,降低涉及安全问题的服务对系统造成破坏的可能性,WindowsVista结合写限制标识符(write-restrictedtokens)和per-serviceSID为服务引入受限SID。服务启用受限SID时,服务的SID被添加到写限制服务进程标识符的正常和受限SID列表中。这样保证了,只有明确地将对象的写权限赋予受限列表中的SID时,服务才可以写对象。回到上面的例子,启用受限SID,X服务将没有权限写入访问LocalService账户可以访问的对象,因为服务X的per-serviceSID没有被明确地赋予这些对象的写权限。怎样指定per-serviceSID1、要指定per-serviceSID,SID的种类必须设定为SERVICE_SID_TYPE_UNRESTRICTED。如果服务不需要SID,可以不设置SID类型,或者把它设置为SER
本文标题:【Windows】 Vista服务详解
链接地址:https://www.777doc.com/doc-1582209 .html