标题:加固基于Windows平台的WEB服务器 出处:gOxiA=苏繁=SuFan Blog 时间:Mon, 17 Oct 2005 17:40:24 +0000 作者:gOxiA 地址:https://goxia.maytide.net/read.php/700.htm 内容: 加固基于Windows平台的WEB服务器       基于Windows平台下IIS运行的网站总给人一种感觉就是脆弱。早期的IIS确实存在很多问题,不过我个人认为自从Windows Server 2003发布后,IIS6及Windows Server 2003新的安全特性、更加完善的管理功能和系统的稳定性都有很大的增强。虽然从Windows Server 2003上可以看到微软不准备再发展ASP,特别是不再对Access数据库的完好支持,但是面对它的那些优势迫使我不得不舍弃Windows 2000 Server。况且我也不需要运行太多的ASP+Access,因为我的程序都是PHP+MySQL(说实话我不喜欢微软的ASP和ASPNET),而且我确实信赖Windows Server 2003!       服务器、网站,看到这些词大家都会想到什么,不只是性能更加关注的是它的安全问题。很多人都无法做到非常完美的安全加固,因为大部分的资料都来源互联网,而互联网的资料总不是那么详尽,毕竟每个服务器的应用环境及运行程序不同。       我从事互联网这个行业只有2年时间,其间遇到了很多问题,我所管理的服务器部分是开放式(PUBLIC)的,它是向互联网的用户敞开的,所以我所面临的问题就更加的多!安全性首当其要,其次是系统的稳定性,最后才是性能。要知道服务器上存在很多格式各样的应用程序,有些程序本身就有缺陷,轻者造成服务器当机,严重的会危及到服务器的整个数据安全。       举个例子,有一台运行着300多个网站的Windows 2000 Server,一段时间里它经常Down机,发现内存泄漏特别快,几分钟时间内存使用立刻飙升到900M甚至高达1.2G,这个时候通过远程是无法访问服务器了,但是服务器系统本身却还在运行着。这个问题着实让我头疼了很长一段时间,因为如果要排查故障就要从这些网站入手,而网站的数量阻碍了我的解决进度。后来通过Filemon监控文件读取来缩小排查范围,之后对可疑网站进行隔离,最终找到故障点并解决。要知道一段小小的代码就可以让运行IIS5的Windows 2000 Server 挂掉!而在Windows Server 2003下,应用程序的级别低中高级变更为了程序池,这样我们就可以对一个池进行设置对内存和CPU进行保护。它的这一特性让我减轻了很多的工作量并且系统也稳定了很多。       另外严重的就是安全性的问题了,无论任何文章都有一个宗旨就是尽量在服务器少开放端口,并开放必要的服务,禁止安装与服务器无关的应用程序。在Windows 2000 Server中,目录权限都是Everyone,很多服务都是以SYSTEM权限来运行的,如Serv-U FTP 这款出色的FTP服务器平台曾经害苦了不少人,它的溢出漏洞可以使入侵者轻松的获取系统完全控制权,如果做到呢?就是因为Serv-U FTP服务使用SYSTEM权限来运行,SYSTEM的权利比Administrator的权利可大的多,注册表SAM项它是可以直接访问和修改的,这样入侵者便利用这一特性轻松在注册表中克隆一个超级管理员账号并获取对系统的完全控制权限。       我的目标:加固WEB服务器系统,使之提高并完善其稳定性及安全性。       系统环境:Windows Server 2003 Enterprise Edition With Service Pack 1(以下简称W2k3SP1),WEB平台为IIS6,FTP平台为Serv-U FTP Server ·安装配置操作系统 安装操作系统,在安装前先要先去调整服务器的BIOS设置,关闭不需要的I/O,这样节省资源又可以避免一些硬件驱动问题。务必断开服务器与网络的连接,在系统没有完成安全配置前不要将它接入网络。在安装过程中如果网卡是PNP类型的,那么应当为其网络属性只配置允许使用TCP/IP协议,并关闭在TCP/IP上的NETBIOS,为了提供更安全的保证,应该启用TCP/IP筛选,并不开放任何TCP端口。完成操作系统的安装后,首次启动W2K3SP1,会弹出安全警告界面,主要是让你立刻在线升级系统更新补丁,并配置自动更新功能,这个人性化的功能是W2K3SP1所独有的,在没有关闭这个警告窗口前,系统是一个安全运行的状态,这时我们应当尽快完成系统的在线更新。 修改Administrator和Guest这两个账号的密码使其口令变的复杂,并通过组策略工具为这两个敏感账号更名。修改位置在组策略中Computer Configuration-Windows Settings-Security Setting-Local Policies-Security Options下,这样做可以避免入侵者马上发动对此账号的密码穷举攻击。 服务器通常都是通过远程进行管理的,所以我使用系统自带的组件“远程桌面”来对系统进行远程管理。之所以选择它,因为它是系统自带的组件缺省安装只需要去启用它就可以使用,支持驱动器映射、剪切板映射等应用,并且只要客户端是WindowsXP PRO都会自带连接组件非常方便,最主要还有一点它是免费的。当然第三方优秀的软件也有如:PCAnyWhere,使用它可以解决Remote Desktop无法在本地环境模式下工作的缺点。为了防止入侵者轻易地发现此服务并使用穷举攻击手段,可以修改远程桌面的监听端口: 1. 运行 Regedt32 并转到此项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp 注意:上面的注册表项是一个路径;它已换行以便于阅读。 2. 找到“PortNumber”子项,您会看到值 00000D3D,它是 3389 的十六进制表示形式。使用十六进制数值修改此端口号,并保存新值。 要更改终端服务器上某个特定连接的端口,请按照下列步骤操作:• 运行 Regedt32 并转到此项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\connection 注意:上面的注册表项是一个路径;它已换行以便于阅读。 3. 找到“PortNumber”子项,您会看到值 00000D3D,它是 3389 的十六进制表示形式。使用十六进制数值修改此端口号,并保存新值。 注意:由于在终端服务器 4.0 版中尚未完全实现备用端口功能,因此只是“在合理的限度内尽量”提供支持,如果出现任何问题,Microsoft 可能要求您将端口重设为 3389。 原文来源:微软知识库KB187623。当然为了达到更加安全的访问,还可以采用IPSec来保护远程桌面的连接访问。 禁用不必要的服务不但可以降低服务器的资源占用减轻负担,而且可以增强安全性。下面列出了可以禁用的服务: ·Application Experience Lookup Service ·Automatic Updates ·BITS ·Computer Browser ·DHCP Client ·Error Reporting Service ·Help and Support ·Network Location Awareness ·Print Spooler ·Remote Registry ·Secondary Logon ·Server ·Smartcard ·TCP/IP NetBIOS Helper ·Workstation ·Windows Audio ·Windows Time ·Wireless Configuration 打开服务器本地计算机策略(gpedit.msc),参考以下选择和修改对服务器进行加固: 1.  设置帐号锁定阀值为5次无效登录,锁定时间为30分钟; 2.   从通过网络访问此计算机中删除Everyone组; 3.  在用户权利指派下,从通过网络访问此计算机中删除Power Users和Backup Operators; 4.  为交互登录启动消息文本。 5.  启用 不允许匿名访问SAM帐号和共享; 6.  启用 不允许为网络验证存储凭据或Passport; 7.  启用 在下一次密码变更时不存储LANMAN哈希值; 8.  启用 清除虚拟内存页面文件; 9.  禁止IIS匿名用户在本地登录; 10.              启用 交互登录:不显示上次的用户名; 11.              从文件共享中删除允许匿名登录的DFS$和COMCFG; 12.              禁用活动桌面。 强化TCP协议栈: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "SynAttackProtect"=dword:00000001 "EnablePMTUDiscovery"=dword:00000000 "NoNameReleaseOnDemand"=dword:00000001 "EnableDeadGWDetect"=dword:00000000 "KeepAliveTime"=dword:00300000 "PerformRouterDiscovery"=dword:00000000 "TcpMaxConnectResponseRetransmissions"=dword:00000003 "TcpMaxHalfOpen"=dword:00000100 "TcpMaxHalfOpenRetried"=dword:00000080 "TcpMaxPortsExhausted"=dword:00000005 ·安装和配置IIS 进入Windows组件安装,找到应用程序服务器,进入详细信息,勾选ASP.NET后,IIS必须的组件就会被自动选择,如果你的服务器需要运行ASP脚本,那么还需要进入Internet信息服务(IIS)-万维网服务下勾选Active Server Pages。完成安装后,应当在其他逻辑分区上单独建立一个目录用来存储WEB网站程序及数据。 一台WEB服务器上都运行着多个网站,他们之间可能互不相干,所以为了起到隔离和提高安全性,需要建立一个匿名WEB用户组,为每一个站点创建一个匿名访问账号,将这些匿名账号添加到之前建立的匿名WEB用户组中,并在本地计算机策略中禁止此组有本地登录权限。 最后优化IIS6应用程序池设置: 1.  禁用缺省应用程序池的空闲超时; 2.  禁用缓存ISAPI扩展; 3.  将应用程序池标识从NetworlService改为LocalService; 4.  禁用快速失败保护; 5.  将关机时间限制从90秒改为10秒; 6.  内存回收下最大使用的内存改为300M; 注:应根据当前服务器运营的业务进行评估并对某些网站配置应用程序池,这样可以降低当机率,并且也保证网站的可访问率,同时在出现故障时可以方便的排查。 ·安装和配置Serv-U FTP Server 这里之所以要将Serv-U FTP Server作为部署案例,是因为Serv-U使用者之多,操作及管理方便。并且从Serv-U的配置上大家应该能够理解到我开头说提到的服务运行权限。Serv-U的安装不再复述,很多人在安装后就开始直接使用,自从Serv-U的溢出漏洞出现使我开始重新认识和思考关于服务的运行权限问题,通常Serv-U是以SYSTEM权限来运行服务的,这样的好处是我们可以轻松的访问系统任何一个角落,包括注册表(在Serv-U溢出后,可以直接访问注册表中账号存储设定的关键项SAM),但是后果也是非常可怕的,所以分析了目前的服务器情况,为了方便起见我创建了一个具有管理员身份的账号来运行Serv-U,这样做是为了不需要重复的去设置目录权限,同时解决低级权限所可能造成的兼容性问题。但是为了保证这个账号的安全,需要禁止它具有远程桌面访问权利,禁止有本地登录的权利。 ·TCP/IP端口筛选 vs IPSec策略 在确定我们所要开放的服务之后就要去配置端口,是使用TCP/IP筛选 还是 IPSec?其实我很少用到IPSec,因为它是IP安全设置,除了我要禁止一个用户来访问我或配置一个特定的连接访问我几乎不去用IPSec。也去是因为我太懒了,只会记得要开放什么端口。 在我看来,TCP/IP端口筛选和IPSec是相辅相成的,普通的应用我认为还是用端口来的方便,毕竟它可以做到只开放哪些端口,之后针对其中特定的端口用IPSec作安全加固,这样我倒是认为更好。一些朋友喜欢在事先做好一个IPSec模板,之后将其应用在其他服务器上,这样做我认为真的不对,毕竟每台服务器的应用都不会完全相同,这样做只会造成更多的故障,我就经常遇到这样的问题,一些客户总是抱怨他们的服务器出现莫名其妙的问题,最后通过我的排查分析发现很多问题都是因为同时使用TCP/IP端口筛选和IPSec造成的,而罪魁祸首则是那些好心人发布的IPSec模板,我没有恶意诋毁他们这些好心人的意思,而最终是要痛斥那些不作自身评估,技术意识贫乏的服务器管理员们,我曾经就让这些朋友们搞得哭笑不得,并开始厌恶我当前的工作。在当前案例中,我开放的端口是:TCP80、TCP25、TCP20、TCP21、TCP3389、TCP4000~4020。开放4000~4020是为了支持Serv-U的PASV模式(同时需要在Serv-U中设置这段被动端口范围),当然你也可以用其他端口,没有特殊要求,记得我之前部署的一台服务器开放的就是这个端口范围,一个自称黑客的朋友联系了我所在的公司经理,并在其QQ上友情提示了服务器的这个所谓的端口漏洞,记得好像是这么说的:“你们的服务器不堪一击,在服务器上还开放了QQ和它的端口。”后来好像还提到如果公司愿意付费可以帮助解决安全问题,现在想起来心里都在暗笑,不过我接到警告信息都会非常重视,因为我明白一个道理:没有绝对的安全!!!不过后来服务器确实受到了攻击,不是被入侵而是被那个黑客小小的DDos了一下。这种一种非常有效的攻击方式,提高TCP/IP协议栈,甚至使用软件、硬件防火墙也只是在相对情况下可以抵御它,所以请各位遵守网络公德,不要使用DDos!!! ·目录权限的分配 1.  除系统所在分区之外的所有分区都赋予Administrators和SYSTEM有完全控制权,之后再对其下的子目录作单独的目录权限,如果WEB站点目录,你要为其目录权限分配一个与之对应的匿名访问帐号并赋予它有修改权限,如果你想使网站坚固,可以分配只读权限并对特殊的目录作可写权限,作为一个开放式的服务器,这样的工作量是非常巨大的,所以我认为将威胁控制缩小到在这个网站中就已经够了。 2.  系统所在分区下的根目录都要设置为不继承父权限,之后为该分区只赋予Administrators和SYSTEM有完全控制权。 3.  因为服务器只有管理员有本地登录权限,所在要配置Documents and Settings这个目录权限只保留Administrators和SYSTEM有完全控制权,其下的子目录同样。另外别忘记还有一个隐藏目录也需要同样操作。因为如果你安装有PCAnyWhere那么他的的配置信息都保存在其下,使用webshell或FSO可以轻松的调取这个配置文件,那么你的系统就为黑客敞开了大门。 4.  配置Program files目录,为Common Files目录之外的所有目录赋予Administrators和SYSTEM有完全控制权。 5.  配置Windows目录,其实这一块主要是根据自身的情况如果使用默认的安全设置也是可行的,不过还是应该进入SYSTEM32目录下,将cmd.exe、ftp.exe、net.exe、scrrun.dll、shell.dll这些杀手锏程序赋予匿名帐号拒绝访问。     OK!该做得都做了,好像没有遗漏什么,如果真有也许是我故意的,也许是我太累了。不知不觉,写了几个小时才写完,效率真的是非常低下,并且明白其中一定有错误和语句不同的地方,总之自己是尽力了。 Generated by Bo-blog 2.1.1 Release