基于 Windows Server 2003 下的 IIS 6.0 来搭建 ASP 及 .NET 网站虚拟主机服务环境,需要进行这么几步:

  • Windows Server 2003 操作系统的安装、安全设置及性能优化;
  • 相关软件的安装配置;
  • IIS 6.0 服务环境的设置,包括 HTTP 服务和 FTP 服务;
  • 虚拟主机用户帐户的建立、用户目录的建立、权限的设置。

下面分别研究。

安装系统环节要注意的主要是可选组件,没必要的统统去掉,添加作为 HTTP Server 所必需的组件,包括 应用程序服务器 -> ASP.NET,这个一旦勾选,相关的支持组件会自动被勾选,之后还要增加 应用程序服务器 -> Internet 信息服务(IIS) -> 文件传输协议(FTP)服务 和 应用程序服务器 -> Internet 信息服务(IIS) -> 互联网服务 -> Active Server Pages,这里重要的一点是,不必把整个组件组全部勾选,比如不必xx选中整个 Internet 信息服务(IIS),而只需要单独勾选上面指出的就行了。添加的越多安全隐患也就越大,尤其是 Web 远程管理之类的功能。

作为和 .NET 网站配套为用户提供服务的一个重要软件就是 Microsoft SQL Server 2005 数据库服务软件,一并装之。

微软家族的产品安装完成后必须要不厌其烦地坚决执行一项任务:Windows Update 或 Microsoft Update,我用正版我骄傲,升级无忧!这期间涉及到相当多的补丁,还有补丁的补丁,非关键更新{zh0}也都安装,而且有些也是必须安装的,比如 .NET Framework 系列。

PS: 如果你是本着 “学习和研究” 的精神去 “学习和研究” Windows Server 2003 和 Microsoft SQL Server 2005,那就得本着 “学习和研究” 的精神去 “学习和研究” 一下 Windows Update 或 Microsoft Update 的xx。好在互联网上已经有很多牛人 “学习和研究” 过了,你可以很方便的 “学习和研究” 一下他们 “学习和研究” 的结果。

接下来要进行安全和性能方面的调整,互联网上有很多关于 Windows 2003 安全设置的文章,其中一篇在 ,其实没必要xx照本宣科,根据文章中的精神和自己的实际情况和环境,酌情进行一些调整就行了。尤其文中提到的关于服务的调整,可以根据自己的要求和体会选择哪些自动、哪些手动、哪些禁用。其实 是很不错的一个软件,其中关于系统的安全和性能的调整选项也很多,可以借用一下。

之后可以安装一些必要的软件,其中一个就是远程管理软件。出于安全考虑,我禁用掉了作为众矢之的的操作系统自带的远程桌面。取而代之的是安装基于 VNC 协议的软件,这些软件中,我觉得免费软件 是个表现很不错的选择。软件很小巧,而且性能好效率高,功能也很多,比如剪贴板共享,互传文件,这都是必不可少的最实用的功能。安装的时候注意要一并安装 Video Hook Driver,以便 UltraVNC 能高效地直接同显卡进行沟通,提高显示的质量和效率。

这些只是小小前奏,下面的环节更加重要。

作为为用户提供网站上传服务的 FTP Sevice,很多人选择 。我觉得有时也不是很有必要,Serv-U 大多是用于专用 FTP 服务的,而仅仅作为网站管理员在某些时候上传一下网站文件,我觉得 IIS 6.0 自带的 FTP 服务组件就足够用了。另外,Serv-U 作为一个名气很大的软件,针对它的攻击手段也是数不胜数的,网上基于 Serv-U 的提权工具都泛滥成灾了。

IIS 6.0 的 FTP 配置非常方便,可以一劳永逸。IIS 6.0 的 FTP 有一个功能叫做 隔离用户(PS: 这一功能 Linux 下的多个xx的 FTPD 软件早在 N 年前就已经具备了,而微软直到 IIS 6.0 才有),通过这个功能,用户只能限制在自己的主目录。而 IIS 实现这一功能的方式是这样的(引自官方帮助文档):

创建隔离用户的新 FTP 站点

  1. 在 IIS 管理器中,展开本地计算机,右键单击“FTP 站点”文件夹,指向“新建”,然后单击“FTP 站点”。
  2. 在“FTP 站点描述”和“IP 地址和端口设置”对话框中提供所需的信息,然后单击“下一步”。
  3. 在“FTP 用户隔离”对话框中,单击“隔离用户”,然后单击“下一步”。
  4. 完成向导的其余步骤。
  5. 右键单击创建的新 FTP 站点,然后单击“属性”。
  6. 单击“安全帐户”选项卡。如果选中了“允许匿名连接”复选框,则在“用户名”和“密码”框中键入用于验证匿名用户的用户名和密码。
  7. 如果允许匿名访问,请在 FTP 站点主目录下创建 LocalUserLocalUser\Public 子目录。
  8. 如果本地计算机用户使用他们各自的帐户用户名登录(而不是作为匿名用户),请在 FTP 站点根目录下创建 LocalUserLocalUser\username 子目录,以允许每个用户连接该 FTP 站点。
  9. 如果不同域的用户使用显式 domain\username 凭据登录,请在该 FTP 站点根目录下为每个域都创建一个子目录(使用域名)。在每个域目录下,为每个用户创建一个目录。例如,要支持用户 Sales\user1 访问,请创建 Sales 和 Sales\user1 目录。

这种方式也有不足的地方,官方文档中也有介绍:

注意 当使用该模式创建了上百个主目录时,服务器性能会下降。

所以这种方式只适合用作小规模虚拟主机的 FTP 服务,用户多了还是换别的方式好,不过我个人觉得这个性能的影响不会太大,因为毕竟这个 FTP 只是提供给网站管理员上传网站的,而这种动作并不会太频繁。

因此,根据官方文档的指示,只需新建一个 FTP 站点,把主目录指向放置虚拟主机网站文件的目录,比如此主目录为 D:\,这个 D 盘的就是安装系统是分出来专门放置网站的盘符。创建 D:\LocalUser 目录,这里要注意一点,FTP 站点主目录指向的应该是 LocalUser 目录的上级目录,也就是 D:\,而不能指向 D:\LocalUser。

FTP 设置主要有这么一些:

  • 可以把监听端口改成自己随便选的数字,而不用默认的21端口,可以避免被一些暴力扫描盯上。当然得另行通知网站管理员新的 FTP 端口。
  • FTP 站点链接数可以根据实际情况或需要做调整,或者不限制。
  • 如果需要启用日志记录以便将来反查一些恶意事件,为了防止时间一长,日志把系统盘占满,可以把日志文件目录从默认的系统目录移到另一个专用目录,比如 E:\LogFiles 之类的。这时可能要特别注意一个问题,如果新的目录写入有问题,可能要对目录的权限做调整,这可以参考设置中指向的原来的那个目录的权限来操作。
  • 确认允许匿名连接没有被启用。
  • 勾选上主目录的写入权限,不然用户就无法上传了。
  • 在目录安全性里,可以勾选拒绝访问,然后下面添加内网 IP 地址段,这样的意思是来自列出的 IP 地址段之外的所有 IP 地址都将被拒绝访问。这种方式适合像我这种向单位各用户提供虚拟主机服务的情况,可以设置成只允许内网用户访问 FTP。

到这里 FTP 服务就搞定了,后面添加任何虚拟主机和帐户时都不再需要重新设置了。比如添加一个帐户名为 user 的帐户后,只要在 D:\LocalUser 目录下建立一个同名目录(user)即可,IIS 6.0 的 FTP 会自动将这个目录识别为该用户的根目录。

下面要进行 IIS 6.0 HTTP Server 的设置了。

首先可以右键点击 网站,选属性,调整这里的总设置,相当于默认设置。可能需要调整的有:

  • 同样是上面如果启用日志记录的设置。
  • 主目录 选项卡里点下面的应用程序设置里的 配置 按钮,弹出的对话框中到 选项 选项卡中勾选 启用父路径,这是为了向传统的 ASP 引用文件方式做兼容。
  • 由于 文档 选项卡中的默认内容文档只有 Defult.xxx,可以根据需要添加 index.asp、index.aspx,index.html,index.htm,并调整优先次序。
  • 自定义错误 指向了一些文件页面,这里{zh0}恢复成默认值,也就是仅向客户端传递错误号和错误信息关键字符串,安全和性能方面会好一些。
  • 停用 IIS 6.0 自动建好的默认站点。

之后还需要在 Web 服务扩展 中开启 Active Server Pages

IIS 6.0 还有一个地方很多人可能都希望调整一下,那就是上传数据的大小限制。先停止 IIS 服务,然后找到 C:\WINDOWS\system32\inetsrv\MetaBase.xml 文件,定位里面的 ASPMaxRequestEntityAllowed 处。默认为 204800 即 204800 字节(200KB),修改为想要的数字如:2048000(即 2MB)。修改后重启 IIS 服务即可。

接下来要进行一个与 ASP 相关的极其重要的安全设置,那就是给 Shell.ApplicationWScript.ShellWScript.Network 这三个危险组件做手术。有人采用注销、禁用或删除的方式来对待这三个组件,我觉得这样太残忍了!这三个组件是操作系统所有的,并不是单独属于 ASP 的,只不过微软当初在设计 ASP 时,愚蠢地赋予了 ASP 调用包括这三个组件在内的一些系统组件的超能力。而xx谋杀这三个组件有可能导致将来为了某些正常目的而需要调用时出现问题。所以{zh0}的做法是通过注册表把这三个组件更名,将来要调用的时候用新名字来调用即可,而这个新名字只有你知道,所以相当于密码加密了。

比如,在注册表里搜索 Shell.Application,将所有找到的匹配更名为 Shell.Application_xxx,并且把 Shell.Application.1 一并改掉,如改成 Shell.Application.1_xxx。三个组件都做这样的修改,这只是{dy}步,我们要双管齐下,修改对应的 CLASS ID。在刚才的搜索里,记录下来每个组件对应的 CLSID 的值,然后把所有这些值改掉,但要注意一致性,比如 Shell.Application 的 CLSID 可能是 {13709620-C279-11CE-A49E-444553540000},可以把它都改成 {13709620-C279-11CE-A49E-444553541234}。

这里还要对网站主目录进行一些总的权限设置,以便下级的各网站目录能够直接继承我们定制的权限。

  • 右键点网站主目录(本文即 D:\LocalUser)选 属性,打开的对话框中定位到 安全 选项卡,然后点下面的 高级 按钮。
  • 首先取消勾选下面的 允许父项的继承权传播到该对象和所有子对象,弹出的对话框中点 复制 按钮,把原有的继承权限复制成本目录自己的权限。
  • 之后只保留 Administrators、CREATOR OWNER、SYSTEM,其余帐户如 Guests、Users之类的全部删除,据说还要添加 ASPNET 帐户的读取和运行权限,这个可以在实际运行中从日志中或错误中判断是否真正需要。

{zh1},在系统中添加一个用户组 vHost,所有的网站管理帐户都放在这里面,这样的好处是方便将来统一对这个组进行一些权限设置。

IIS 的统一设置完成了,在下面的添加帐号和网站时,还有一系列复杂的操作要做。

以实例说明,比如要添加一个基于域名 test.domain.com 的虚拟主机,对应的管理帐户是 test,依次做以下操作:

创建三个帐户:test、test_iusr、test_iwam,其中 test 帐户用于网站管理员上传主页的帐号,test_iusr 为 IIS 进程访问此网站对应的专用 IIS 来宾帐户,test_iwam 为启用相关程序(如应用程序池、.NET程序)的专用 IIS 进程帐户。把三个帐户隶属于中的 Users 组去掉,然后分别设置隶属于至:test -> vHost 组、test_iusr -> Guests 组(当然也可以创建一个专用的 iusr 组)、test_iwam -> IIS_WPG 组。三个帐户分别设置密码,其中的 test 帐户密码告知网站管理员用于上传网站。

在网站主目录(本文中就是上面提提到的 D:\LocalUser)下建立 test 目录。接下来要设置此目录的权限。

  • 首先确定这里目前只有继承自父目录 LocalUser 的权限,其它的删除。
  • 添加 test 帐户,勾选 修改 权限,系统会自动把其它相关的必要权限勾选。这个操作是为了赋予网站管理员用此帐户上传网站的权限。
  • 添加 test_iusr 帐户,这个帐户的权限设置有两种:
    • 一种是同 test 帐户一样,一劳永逸,内部的目录都将有写入和修改权限,用户的网站如果需要操作 Access 数据库文件或者上传文章的图片附件之类都能顺利进行。当然这样也有缺陷,因为整个网站的所有目录和文件都被赋予了 test_iusr 的写入和修改权限,有一定的隐患。
    • 另一种是只赋予 test_iusr 默认的读取和运行权限。之后根据用户的需要,把网站中的 Access 数据库和图片附件上传目录单独赋予 test_iusr 写入权限(这方面比不上 Linux 下的 FTPD 软件了,Linux 下的 FTPD 软件一般都有让用户自行通过 FTP Client 做 CHMOD 操作的功能)。
  • 添加 test_iwam 帐户,赋予默认的读取和运行权限。

在 Internet 信息服务(IIS)管理器中,新建应用程序池 AppPool_test。之后对此应用程序池设置属性,对话框中切换到 标识 选项卡,点选第二个单选按钮 配置,指定成刚才新建的 test_iwam 帐户。

新建网站,对话框中 此网站的主机头 填入 test.domain.com,以启用基于域名的虚拟主机功能,路径 指向前面新建的目录 D:\LocalUser\test,后面的 权限 中勾选 运行脚本。接着修改新建好的网站的属性,对话框中 主目录 选项卡最下面的 应用程序池 指定刚才新建的 AppPool_test,目录安全性 选项卡 编辑 身份验证和访问控制,把匿名访问的帐户改成上面的 test_iusr,ASP.NET 选项卡中把 ASP.NET 版本换成用户网站需要的版本。

自此一个虚拟主机就搭建完成,也完成了一个网站的创建。{zh1}可以对网站做一些安全测试,比如放个 ASP 探针来检查一些设置,或者运行个木马看看那些危险组件之类的会不会被利用。

步骤比较繁琐,尤其重要的就是创建三个帐户,以及对网站的几个专用账户的设置、应用程序池的设置、目录权限的设置。这样做并不是无懈可击,只不过把每个网站的权限全部分离,不再使用 IIS 统一的 IIS来宾帐号和 IIS 进程帐号。由于 ASP 语言门槛低,虽然不乏很多优秀的程序员,但也充斥着大量的低素质编程人员,网站做得漏洞百出,可以很轻易地被利用。权限分离的好处就是,即使某个网站被黑,黑客也没办法利用这个网站的这几个专用帐户去侵害其它网站。接下来我所要做的就是通知被黑网站的管理员进行彻底的自查了。