本人从事IDC工作有很长的一段时间了,由于时常与Windows 2003打交道,加上多年长期管理多台Windows 2003虚拟主机,所以对windows 2003的系统安全与IIS设置方面有着自己的独到地看法,现将我的认识与看法共享出来与大家一同分享。
     在实际生活中,我们有许多客户常抱怨自己的服务器老是被黑,我想在互联网上肯定也有很多管理服务器的同胞们时常在抱怨吧。为什么会这样呢?以我愚见,我认为系统的漏洞,只要你及时更新系统补丁,它的漏洞远比起您服务器的开发程序(诸如Web站点)要少得多。所以我写得这篇文章也是治标不治本的,或许只能对你的系统在被***过程中给***带来更大的考验,而在确保您的开发程序无漏洞的情况,此文档却能起到锦上添花的作用。
     好了,废话还是少说,现在直入主题,我对系统安全从二个方面着手,一是权限,二是服务。开放服务仅需要的权限,以最小的权限运行服务,不用的服务坚决禁用。这就是我对安全的认识。
     我这里说到的权限,包括系统权限与服务正常运行所需的权限,先讲系统权限,服务权限,我着重会在《Windows 2003系统安全+IIS下Web与FTP的完美结合(下)》中对Web服务的权限来加以阐述。
一、系统权限的设置
    在网上有好多设置系统权限的文档,很多,雷同性也很大,你照着这些文档去逐个设置,花上个把小时是情理之中的事,而且效果也未必很明显。下面,我这里着重讲述我写的系统权限设置方法,在讲之前,我们学习一个命令——Cacls命令,命令用法如下:
InBlock.gifC:\Users\tamenglang>cacls/?
InBlock.gif显示或者修改文件的访问控制列表(ACL)
InBlock.gifCACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm]
InBlock.gif        [/R user [...]] [/P user:perm [...]] [/D user [...]]
InBlock.gif        filename        显示 ACL。
InBlock.gif        /T                更改当前目录及其所有子目录中,指定文件的 ACL。
InBlock.gif        /L                 对照目标处理符号链接本身
InBlock.gif        /M                更改装载到目录的卷的 ACL
InBlock.gif        /S                 显示 DACL 的 SDDL 字符串。
InBlock.gif        /S:SDDL         使用 SDDL 字符串中指定的 ACL 替换ACL。/E、/G、/R、/P 或 /D 无效)。
InBlock.gif        /E                  编辑 ACL 而不替换。
InBlock.gif        /C                  在出现拒绝访问错误时继续。
InBlock.gif        /G user:perm    赋予指定用户访问权限。
InBlock.gif                             Perm 可以是: R    读取
InBlock.gif                                              W    写入
InBlock.gif                                              C    更改(写入)
InBlock.gif                                              F    完全控制
InBlock.gif        /R user            撤销指定用户的访问权限(仅在与 /E 一起使用时合法)。
InBlock.gif        /P user:perm    替换指定用户的访问权限。
                                Perm 可以是: N    无
InBlock.gif                                               R    读取
InBlock.gif                                               W    写入
InBlock.gif                                               C    更改(写入)
InBlock.gif                                               F    完全控制
我们先看一个实例,针对此实例来再加以分析:
InBlock.gifcacls    C:\    /t /c /g administrators:F system:F
InBlock.gifC:\ 表示C盘    
InBlock.gif/t 表示这里的C盘的根目录及其所有子目录
InBlock.gif/c 表示在出现拒绝访问错误时继续
InBlock.gif/g administrators:F system:F 表示赋予C盘的根目录及其所有子目录administrators与system的完全控制的权限,这里的F是完全控制,还有R表示读取,W表示写入,C表示更改
InBlock.gif再讲几个我们下面需要的参数,OK?
InBlock.gif/e 在原有权限的基本上增加用户的访问权限
InBlock.gif/r  撤销指定用户的访问权限(仅在与 /E 一起使用时合法)
    或许你看了上面的这个命令,您或许会有所纳闷,为什么我要花这么长的篇幅去介绍好像与系统权限没有关系的文字呢?其实不然,我写上面命令的目的是准备写一个批处理脚本,来快速地(不到一分钟的时间)来帮您设置好您的系统权限。
    现附上我新手写的系统盘加固脚本:
InBlock.gif@echo off
InBlock.gifecho 本程序是源自tamenglang.blog.51cto.com,tamenglang亲手创作,此程序会自动加固您的系统 …………………
InBlock.gifcacls    C:\ /t /c /g administrators:F system:F
InBlock.gifCacls "C:\Program Files\Common Files" /t /e /c /g everyone:R
InBlock.gifCacls "C:\WINDOWS\IIS Temporary Compressed Files" /t /e /c /g
everyone:C
InBlock.gifCacls    C:\WINDOWS\Microsoft.Net /t /e /c /g everyone:R
InBlock.gifCacls "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files" /t /e /c /g everyone:C
InBlock.gifCacls "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files" /t /e /c /g everyone:C
InBlock.gifCacls    C:\WINDOWS\Registration /t /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\Temp /t /e /c /g everyone:C
InBlock.gifCacls    C:\WINDOWS\assembly /t /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\WinSxS /t /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\Fonts /t /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\System32 /t /e /c /g everyone:R
InBlock.gifCacls    C:\windows\system32\msdtc /t /e /c /g networkservice:C
InBlock.gifCacls "C:\WINDOWS\system32\inetsrv\ASP Compiled Templates"
/t /e /c /g everyone:C
InBlock.gifCacls    C:\WINDOWS\System32\*.exe /e /c /r everyone
InBlock.gifCacls    C:\WINDOWS\System32\cmd.exe    /e /c /r system
InBlock.gifCacls    C:\WINDOWS\System32\net.exe    /e /c /r system
InBlock.gifCacls    C:\WINDOWS\System32\net1.exe /e /c /r system
InBlock.gifCacls    C:\WINDOWS\System32\msdtc.exe /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\System32\dllhost.exe /e /c /g everyone:R
InBlock.gifCacls    C:\WINDOWS\System32\svchost.exe /e /c /g everyone:R
 
此程序实现的功能如下:
InBlock.gifC:\                                           administrators,system完全控制
InBlock.gifC:\Program Files\Common Files                        everyone 读取
InBlock.gifC:\WINDOWS\IIS Temporary Compressed Files   everyone 更改
InBlock.gifC:\Windows\Microsoft.Net                              everyone 读取
InBlock.gifC:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files                                                          everyone 更改
InBlock.gifC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files                                                          everyone 更改
InBlock.gifC:\Windows\Registration                                everyone 读取
InBlock.gifC:\Windows\Temp                                         everyone 更改
InBlock.gifC:\Windows\assembly                                    everyone 读取
InBlock.gifC:\Windows\WinSxS                                      everyone 读取
InBlock.gifC:\Windows\Fonts                                         everyone 读取
InBlock.gifC:\Windows\System32                                    everyone 读取
InBlock.gifC:\windows\system32\msdtc                 NETWORK SERVICE 更改
InBlock.gifC:\WINDOWS\system32\inetsrv\ASP Compiled Templates   Everyone 更改
InBlock.gifC:\Windows\System32\*.exe                  去除 everyone 权限
InBlock.gifC:\windows\system32\msdtc.exe                   everyone 读取
InBlock.gifC:\Windows\System32\dllhost.exe                 everyone 读取
InBlock.gifC:\Windows\System32\svchost.exe                everyone 读取
系统权限的设置大致如上。
二、服务启动类型的设置
    下面我们需要设置的是将一些不常用的服务停止,我们的通常做的操作是到服务中(命令提示符下用services.msc命令)中加以禁用,为了方便起见,这里我也以脚本的形式对不常用的服务加以停止。现在我们还需要学上一个用于与服务控制管理器通信的命令行程序,即sc命令,命令的用法如下:
用法:
InBlock.gifsc <server> [command] [service name] <option1> <option2>...
InBlock.gif                选项 <server> 的格式为 "\\ServerName"
InBlock.gif                可以键入 "sc [command]"以获得命令的进一步帮助
InBlock.gif                命令:

InBlock.gif                    query--------查询服务的状态,或枚举服务类型的状态。
InBlock.gif                    queryex------查询服务的扩展或枚举服务类型的状态。
InBlock.gif                    start---------启动服务。
InBlock.gif                    pause-----------发送 PAUSE 控制请求到服务。
InBlock.gif                    interrogate-----发送 INTERROGATE 控制请求到服务。
InBlock.gif                    continue--------发送 CONTINUE 控制请求到服务。
InBlock.gif                    stop------------发送 STOP 请求到服务。
InBlock.gif                    config----------(永久地)更改服务的配置。
InBlock.gif                    description-----更改服务的描述。
InBlock.gif                    failure---------更改服务失败时所进行的操作。
InBlock.gif                    qc--------------查询服务的配置信息。
InBlock.gif                    qdescription----查询服务的描述。
InBlock.gif                    qfailure--------查询失败服务所进行的操作。
InBlock.gif                    delete----------(从注册表)删除服务。
InBlock.gif                    create----------创建服务(将其添加到注册表)。
InBlock.gif                    control---------发送控制到服务。
InBlock.gif                    sdshow----------显示服务的安全描述符。
InBlock.gif                    sdset-----------设置服务的安全描述符。
InBlock.gif                    GetDisplayName--获取服务的 DisplayName。
InBlock.gif                    GetKeyName------获取服务的 ServiceKeyName。
InBlock.gif                    EnumDepend------枚举服务的依存关系。
     因为我们要更改服务的启动类型,我们只需要了解sc config就可以了,sc config的用法如下:
InBlock.gif  sc <server> config [service name] <option1> <option2>...
InBlock.gif选项:
InBlock.gif注意: 选项名称包括等号。
InBlock.gif type= <own|share|interact|kernel|filesys|rec|adapt>
InBlock.gif start= <boot|system|auto|demand|disabled>
InBlock.gif error= <normal|severe|critical|ignore>
InBlock.gif binPath= <BinaryPathName>
InBlock.gif group= <LoadOrderGroup>
     因为我们这里要永久更改启动类型,只要用start选项加上disabled就可以了,好了,比方说我们要中止dhcp client这个服务,只需用如下命令:
InBlock.gifsc config Dhcp start= disable
     好了,为了系统安全,我们来对经常用不到的服务的启动类型来加以禁用设置吧
rem server
rem 微软:支持此计算机通过网络的文件、打印、和命名管道共享。如果服务停止,这些功能不可用。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。   

sc config LanmanServer start= disabled   
 
 
rem remote registry   
rem 微软:使远程用户能修改此计算机上的注册表设置。如果此服务被终止,只有此计算机上的用户才能修改注册表。如果此服务被禁用,任何依赖它的服务将无法启动。

sc config RemoteRegistry start= disabled   
 
 
rem TCP/IP NetBIOS Helper
rem 微软:提供 TCP/IP (NetBT) 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持,从而使用户能够共享文件、打印和登录到网络。   
sc config LmHosts start= disabled   
 
 
rem Print Spooler
rem 微软: 管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。如果此服务被禁用,任何依赖于它的服务将无法启用。

sc config Spooler start= disabled   
 
 
rem Computer Browser (计算机浏览器)   
rem 微软: 维护网络上计算机的更新列表,并将列表提供给计算机指定浏览。如果服务停止,列表不会被更新或维护。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。   

sc config Browser start= disabled 
 
 
rem Shell Hardware Detection   
rem 微软: 为自动播放硬件事件提供通知。   

sc config ShellHWDetection    start= disabled   
 
 
rem Secondary Logon
rem 微软: 启用替换凭据下的启用进程。如果此服务被终止,此类型登录访问将不可用。如果此服务被禁用,任何依赖它的服务将无法启动。 
sc config seclogon start= disabled   
 
 
rem Wireless Configuration
rem 微软: 启用 IEEE 802.11 适配器的自动配置。如果此服务停止,自动配置将不可用。如果此服务被禁用,所有明确依赖它的服务都将不能启动。
sc config WZCSVC start= disabled 
 
 
rem Distributed Link Tracking Client
rem 启用客户端程序跟踪链接文件的移动,包括在同一 NTFS 卷内移动,移动到同一台计算机上的另一 NTFS、或另一台计算机上的 NTFS。

sc config TrkWks start= disabled
 
 
rem Distributed Link Tracking Server
rem 启用同域内的分布式链接跟踪客户端服务,以便在同域内提供更高的可靠性和有效维护。

sc config TrkSvr start= disabled
 
 
rem Distributed Transaction Coordinator
rem 协调跨多个数据库、消息队列、文件系统等资源管理器的事务。如果停止此服务,则不会发生这些事务。

sc config MSDTC start= disabled
 
 
rem Cryptographic Services
rem 提供三种管理服务: 编录数据库服务,它确定 Windows 文件的签名;受保护的根服务,它从此计算机添加和删除受信根证书颁发机构的证书;和密钥(Key)服务,它帮助注册此计算机获取证书。如果此服务被终止,这些管理服务将无法正常运行。如果此服务被禁用,任何依赖它的服务将无法启动。
sc config CryptSvc start= disabled
 
 
rem DHCP Client (DHCP 客户端)   
rem 微软: 为此计算机注册并更新 IP 地址。如果此服务停止,计算机将不能接收动态 IP 地址和 DNS 更新。如果此服务被禁用,所有明确依赖它的服务都将不能启动。

sc config Dhcp start= disabled   
 
 
rem Help and Support   
rem 启用在此计算机上运行帮助和支持中心。如果停止服务,帮助和支持中心将不可用。如果禁用服务,任何直接依赖于此服务的服务将无法启动。
rem 依存:remote Procedure Call (RPC)   
sc config helpsvc start= disabled
三、组件的卸载
    现在我们需要将一些不常用的组件加以卸载,在卸载它们前,我们还需要认识一个命令,一个注册或卸载动态链接库文件(DLL)和嵌入式控件(OCX)的命令,它就是regsvr32。命令的格式如下:
Regsvr32 [ /u ][ /s ][ /n ][ /i [ :cmdline ] ] dll文件名
Regsvr32命令一共有四个参数,我们只需用到二个就可以了,分别是:
/s:注册或卸载成功后不显示操作成功的提示框
/u:卸载已安装的控件或DLL文件
    为了防止***利用这些动态链接库与组件,我们需要将W.Shell 组件和Shell.application 组件加以卸载,代码如下:
InBlock.gifrem 卸载W.Shell 组件和卸载Shell.application 组件
InBlock.gifregsvr32 /u /s wshom.ocx
InBlock.gifregsvr32 /u /s shell32.dll
    好了,系统的安全基本上都讲完了,其他的诸如防火墙的设置,IP策略的设置等,我都不加以介绍了,因为这样的设置要根据自己的需求进行设置的,上面的这些设置是我经常对windows 2003进行系统安全常用的,从实践效果来看还是比较明显的,我想对于您来说肯定也是能用得上的。不过, 建议您在使用之前先要对自己的系统与服务进行评估再加以设置,不然到时候出现问题不知道从何着手就不好了。呵呵,到时可不要投诉我哟。
    为了方便大家的总结与使用,现将上述所有的脚本综合如下,写成批处理脚本的形式,供大家借鉴与使用。
  @echo off    
InBlock.gifecho 本程序是源自tamenglang.blog.51cto.com,tamenglang亲手创作,此程序会自动加固您的系统 …………………    
InBlock.gif
cacls        C:\ /t /c /g administrators:F system:F    
InBlock.gifCacls "C:\Program Files\Common Files" /t /e /c /g everyone:R    
InBlock.gifCacls "C:\WINDOWS\IIS Temporary Compressed Files" /t /e /c /g everyone:C    
InBlock.gifCacls        C:\WINDOWS\Microsoft.Net /t /e /c /g everyone:R    
InBlock.gifCacls "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files" /t /e /c /g everyone:C    
InBlock.gifCacls "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files" /t /e /c /g everyone:C    
InBlock.gifCacls        C:\WINDOWS\Registration /t /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\Temp /t /e /c /g everyone:C    
InBlock.gifCacls        C:\WINDOWS\assembly /t /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\WinSxS /t /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\Fonts /t /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\System32 /t /e /c /g everyone:R    
InBlock.gifCacls        C:\windows\system32\msdtc /t /e /c /g
networkservice:C    
InBlock.gif
Cacls "C:\WINDOWS\system32\inetsrv\ASP Compiled Templates" /t /e /c /g everyone:C    
InBlock.gifCacls        C:\WINDOWS\System32\*.exe /e /c /r everyone    
InBlock.gifCacls        C:\WINDOWS\System32\cmd.exe        /e /c /r system    
InBlock.gifCacls        C:\WINDOWS\System32\net.exe        /e /c /r system    
InBlock.gifCacls        C:\WINDOWS\System32\net1.exe /e /c /r system    
InBlock.gifCacls        C:\WINDOWS\System32\msdtc.exe /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\System32\dllhost.exe /e /c /g everyone:R    
InBlock.gifCacls        C:\WINDOWS\System32\svchost.exe /e /c /g everyone:R
InBlock.gif
InBlock.gifecho 现在对您的服务器服务启动类型加以设置
InBlock.gif
rem server
rem 微软:支持此计算机通过网络的文件、打印、和命名管道共享。如果服务停止,这些功能不可用。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。   

sc config LanmanServer start= disabled   
 
 
rem remote registry   
rem 微软:使远程用户能修改此计算机上的注册表设置。如果此服务被终止,只有此计算机上的用户才能修改注册表。如果此服务被禁用,任何依赖它的服务将无法启动。

sc config RemoteRegistry start= disabled   
 
 
rem TCP/IP NetBIOS Helper
rem 微软:提供 TCP/IP (NetBT) 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持,从而使用户能够共享文件、打印和登录到网络。   
sc config LmHosts start= disabled   
 
 
rem Print Spooler
rem 微软: 管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。如果此服务被禁用,任何依赖于它的服务将无法启用。

sc config Spooler start= disabled   
 
 
rem Computer Browser (计算机浏览器)   
rem 微软: 维护网络上计算机的更新列表,并将列表提供给计算机指定浏览。如果服务停止,列表不会被更新或维护。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。   

sc config Browser start= disabled 
 
 
rem Shell Hardware Detection   
rem 微软: 为自动播放硬件事件提供通知。   

sc config ShellHWDetection    start= disabled   
 
 
rem Secondary Logon
rem 微软: 启用替换凭据下的启用进程。如果此服务被终止,此类型登录访问将不可用。如果此服务被禁用,任何依赖它的服务将无法启动。 
sc config seclogon start= disabled   
 
 
rem Wireless Configuration
rem 微软: 启用 IEEE 802.11 适配器的自动配置。如果此服务停止,自动配置将不可用。如果此服务被禁用,所有明确依赖它的服务都将不能启动。
sc config WZCSVC start= disabled 
 
 
rem Distributed Link Tracking Client
rem 启用客户端程序跟踪链接文件的移动,包括在同一 NTFS 卷内移动,移动到同一台计算机上的另一 NTFS、或另一台计算机上的 NTFS。

sc config TrkWks start= disabled
 
 
rem Distributed Link Tracking Server
rem 启用同域内的分布式链接跟踪客户端服务,以便在同域内提供更高的可靠性和有效维护。

sc config TrkSvr start= disabled
 
 
rem Distributed Transaction Coordinator
rem 协调跨多个数据库、消息队列、文件系统等资源管理器的事务。如果停止此服务,则不会发生这些事务。

sc config MSDTC start= disabled
 
 
rem Cryptographic Services
rem 提供三种管理服务: 编录数据库服务,它确定 Windows 文件的签名;受保护的根服务,它从此计算机添加和删除受信根证书颁发机构的证书;和密钥(Key)服务,它帮助注册此计算机获取证书。如果此服务被终止,这些管理服务将无法正常运行。如果此服务被禁用,任何依赖它的服务将无法启动。
sc config CryptSvc start= disabled
 
 
rem DHCP Client (DHCP 客户端)   
rem 微软: 为此计算机注册并更新 IP 地址。如果此服务停止,计算机将不能接收动态 IP 地址和 DNS 更新。如果此服务被禁用,所有明确依赖它的服务都将不能启动。

sc config Dhcp start= disabled   
 
 
rem Help and Support   
rem 启用在此计算机上运行帮助和支持中心。如果停止服务,帮助和支持中心将不可用。如果禁用服务,任何直接依赖于此服务的服务将无法启动。
rem 依存:remote Procedure Call (RPC)   
sc config helpsvc start= disabled
InBlock.gif    
InBlock.gifecho 现在此程序对您服务器的组件进行设置

InBlock.gifrem 卸载W.Shell 组件和卸载Shell.application 组件    
InBlock.gifregsvr32 /u /s wshom.ocx    
InBlock.gifregsvr32 /u /s shell32.dll