任务12:检查匿名登录
在默认设置下,非授权用户是无法连接到任何 Windows 计算机以获得域用户名和共享名列表的。这是什么意思?好的,黑客以你的身份登录需要两条信息:你的用户名和你的密码。他可以简单地通过将便携式电脑接驳到你所在的网络然后向最近的计算机查询就可以获取你的用户名,这样就获得了攻击帐户所需信息的一半。(谢天谢地,还没有人发明无线的 Internet 便条,虽然我们知道有人正在钻研这一技术。)
那么你如何知道自己的计算机是否正在象分发万圣节糖果那样发送信息呢?你可以用 Security Analyzer 或者你也可以使用下面这段脚本:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "System\CurrentControlSet\Control\Lsa"
strValueName = "RestrictAnonymous"
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue
If dwValue = 0 Then
Wscript.Echo "Anonymous access is enabled."
Else
Wscript.Echo "Anonymous access is disabled."
End If
你这样问很有趣;通过脚本有一种方法可以关闭计算机上的匿名登录:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "System\CurrentControlSet\Control\Lsa"
strValueName = "RestrictAnonymous"
dwValue = 1
oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName,
dwValue
任务13:列出安装的服务
知道计算机上正在运行什么服务很有用。毕竟,有些阴险的病毒会将自己伪装成服务的形式,所以你必须知道是否有这种病毒正在你的计算机上运行。但是查看合法服务是否在一台计算机上运行也很有用处。对了,我们知道你告诉过你的用户不要在他们的机子上运行网站服务器或者 FTP 服务器,但是你如何知道他们是否听话呢?以下这段脚本会告诉你:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery _
("Select * from Win32_Service")
For Each objService in colRunningServices
Wscript.Echo objService.DisplayName, objService.State
Next
那么假如你发现有人运行了你不希望运行的服务时怎么办呢?我们可以从停止通用即插即用设备主机服务的脚本上得到启发(停止它们):
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name = 'upnhost'")
For Each objService in colRunningServices
objService.StopService()
Next
任务14:检查共享文件以及共享权限
难道你不知道吗:在你整个生命过程中,你都被告知和他人进行分享是多么的重要,但是现在我们发现共享(至少从计算机角度来说)事实上并不一定是件好事。
共享文件的功能绝对是利弊兼备的。文件共享能够让用户们在不用管理员帮忙以及不占用文件服务器储存空间的情况下就某个工作开展协作。但是,不幸的是,它同样允许人们将一些不应该共享的文件共享(例如侵权的 MP3 文件)。另外,网络共享提供了进入计算机的便捷通道。如果你共享了一个文件夹而没有正确地设置共享权限,那么......。
那么脚本是否能提示你计算机上是否有共享文件呢?你猜猜看:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share")
For each objShare in colShares
Wscript.Echo "Name: " & objShare.Name
Wscript.Echo "Path: " & objShare.Path
Wscript.Echo "Type: " & objShare.Type
Next
当然,许多机构都会选择彻底不共享文件,至少在客户端机器上是这样的。如果你也做了同样的决定,那么你就会发现脚本在这个问题上会很有用。Security Analyzer 会告诉你是否在计算机上找到了共享文件;但是,最后还是需要你连接到各台计算机上取消各个共享文件。而脚本不仅仅会识别出共享的文件夹,它还能够同时取消这些文件夹的共享。例如,这里有一段能够取消所有类型为 0 的文件共享(我们稍后就会解释这一点):
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colShares = objWMIService.ExecQuery _
("Select * from Win32_Share Where Type = 0")
For each objShare in colShares
objShare.Delete
Next
注意: 别慌,虽然这个方法叫做删除,但是它只是删除共享功能(也就是说,它只是停止在网络上共享这个文件夹而已)。虽然我们认为完全删除它们也是禁止在网络上共享它们的一条途径,但是它不会正真删除文件夹或者文件夹中的任何内容。
那么为什么是类型为 0 的文件呢?在 WMI 中,一个类型为 0 的共享文件代表的是一个普通的旧的共享文件。当然还有其它的共享文件,最常见的就是管理级共享文件(如C$)。前述脚本能够在分别保留其它共享文件(如管理级共享文件)的同时,停止共享普通文件夹。如果你要停止所有的共享文件,你只要不将 Where 语句包含在查询语句里即可:
Set colShares = objWMIService.ExecQuery("Select * from Win32_Share")
注意: 那么共享权限呢?如上文说到的,我们将会在以后的专栏中讨论。
任务15:检查 Windows 版本
安装了 Service Pack 1 意味着什么?如果你运行的是 Windows XP,那么说明你紧跟时代步伐,但是如果你使用的是 Windows 2000 的话,就说明你已经落伍了。(Windows 2000现在已经发展到 Service Pack 4 了)。这说明,如果你不知道计算机运行的是什么 Windows 版本的话,脚本返回的某些信息是没有意义的。这里就有一段脚本说明这一点:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
Wscript.Echo objOperatingSystem.Caption, objOperatingSystem.Version
Next
任务16:检查 Office 宏的安全性
Microsoft Office 让用户自己决定如何运行嵌入文件中的宏。你可以选择:
• 高。只允许运行来自受信任来源的宏。所有其它经过签署的和未经签署的宏都将被禁用。
• 中。你可以选择是否运行可能不安全的宏。
• 低。允许运行所有宏。
在将宏安全性设置为高的情况下,你可以在其它时间中阻止自动运行的宏(当你打开一个文档或者运行某个程序的时候自动运行的那些宏)对你的计算机做些不好的事情。毫无疑问,一开始就将 Office 设置成为高安全性是个不错的主意,如果能够经常检查高安全性是否还在运行将会更好。
检查宏安全性级别可能会有点灵活,因为指向你所要更改的注册值可能会因为你安装的 Office 版本的不同而相差很大。我们没有精力来讨论如何判断 Office 的版本(提示:使用 WMI 组的Win32_Product)然后决定合适的注册表路径,但是至少这里有一段能够从 Outlook 2000 中检索出宏安全级别的脚本。你应该能够轻易地根据你的需要和所安装的 Office 版本来改进这段脚本:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Office.0\Outlook\Security"
strValueName = "Level"
objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, strValueName,
dwValue
If dwValue = 3 Then
Wscript.Echo "Outlook macro security is set to high."
ElseIf dwValue = 2 Then
Wscript.Echo "Outlook macro security is set to medium."
Else
Wscript.Echo "Outlook macro security is set to low."
End If
上述这段脚本是用来检测 Outlook 的宏安全性级别的。那么,如果你想要检测 Word、Excel、PowerPoint 或者 Access的宏安全级别的时候该怎么办?好吧,你只需要根据需要更改注册表路径即可:
strKeyPath = "Software\Microsoft\Office.0\Word\Security"
strKeyPath = "Software\Microsoft\Office.0\Excel\Security"
strKeyPath = "Software\Microsoft\Office.0\PowerPoint\Security"
strKeyPath = "Software\Microsoft\Office.0\Access\Security"
任务17:检查 IE 安全区域
为了保护用户不受恶意网站的攻击,Internet Explorer 使用安全区域来管理在你访问某个网站时可能完成或无法完成的行为(比如运行脚本、安装 ActiveX 控件等等)。在默认设置下,这些安全区域提供不同的安全级别:你可以在本地内部网络区域执行在受限网站区域中不能执行的程序(比如运行脚本)。
如果你想要了解更多有关安全区域的情况,我们建议你阅读Internet Explorer 增强安全性设置白皮书(此白皮书是针对 Windows 2003 编写的,但是其中的内容对于其它 Windows 版本同样适用。)在这里,我们有一段能够报告本地内部网络区域(区域1)安全级别的脚本:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet
Settings\Zones"
strValueName = "CurrentLevel"
objReg.GetDWORDValue HKEY_CURRENT_USER,strKeyPath,strValueName,dwValue
Select Case dwValue
Case 73728
Wscript.Echo "The security zone is set to high security."
Case 69632
Wscript.Echo "The security zone is set to medium security."
Case 66816
Wscript.Echo "The security zone is set to medium-low security."
Case 65536
Wscript.Echo "The security zone is set to low security."
Case Else
Wscript.Echo "The security zone is set to custom security."
End Select
你也可以通过此段脚本检索有关受信任站点(区域2)、Internet(区域3)以及受限制站点(区域4)的安全信息。只需要相应更改注册表路径:
Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones
Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones
Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones
在绝大多数情况下,这个方法能够向你提供所需的信息。唯一会碰到的问题是用户是否已经更改了安全区域的一项或者多项设置。在那样的情况下,安全级别将会被报告为"用户自定义",但是你就无从知道这个新的用户自定义的安全级别是比原来的默认级别更加严格还是更加宽松。这也就是脚本再次派上用场的地方:你可以使用一段脚本来决定(或者配置)各个安全区域的安全设置。有关这方面的更多信息,请参阅Internet Explorer 增强安全性设置白皮书或者擦亮你的眼睛看看 Tweakomatic。(不,这不是拼写错误。我们真的将要发布一款名叫Tweakomatic的东西。你一定要相信我们迟早会这么做的。)
任务18:检查 Outlook 安全区域
Microsoft Outlook 同样使用 Internet Explorer 的安全区域来决定是否运行来自于 HTML 格式信息的脚本和活动内容。要避免在计算机上运行嵌入了 HTML 信息的脚本,你需要做两件事情:
• 确保在 Internet Explorer 安全区域内运行脚本的功能已经被禁用(特别是在受限制的站点区域内)。
• 确保 Outlook 使用那个安全区域
Outlook 安全区域记录在注册表中;同样,指向那个注册表值的确切路径取决于你在计算机上安装的 Office 版本。如果你使用 Office 2000,你可以使用以下脚本来决定 Outlook 的安全区域:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Office.0\Outlook\Options\General"
strValueName = "Security Zone"
objReg.GetDWORDValue HKEY_CURRENT_USER,strKeyPath,strValueName,dwValue
Select Case dwValue
Case 4
Wscript.Echo _
"Outlook is using settings from the Restricted Sites zone."
Case 3
Wscript.Echo "Outlook is using settings from the Internet
zone."
Case 2
Wscript.Echo "Outlook is using settings from the Trusted Sites
zone."
Case 1
Wscript.Echo "Outlook is using settings from the Local Intranet
zone."
Case Else
Wscript.Echo "The Outlook security zone could not be
determined."
End Select
在绝大多数计算机上,受限制的站点区域有最严格的安全限制。正因为如此,你可能会更进一步来为所有用户配置 Outlook 设置,以保证 Outlook 在 HTML 安全上使用受限制的站点。这里正好是一段实现以上功能的脚本:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Office.0\Outlook\Options\General"
strValueName = "Security Zone"
dwValue = 4
objReg.SetDWORDValue HKEY_CURRENT_USER, strKeyPath, strValueName, dwValue
返回页首
最后的思考
这里我们想再次强调一点:如果 Security Analyzer 能够符合你的需求,那么你就没有必要再写那些和 Security Analyzer 实现同样功能的脚本。(Scripting Guys 绝对坚持认为你不必去做你完全没有必要做的事情。)但是从另外一方面来说,Security Analyzer 只能够实现它编写设计的功能是它的一个局限性。之所以会如此是因为你觉得还有其他一些很重要的安全检查,而这些检查是 Security Analyzer 所不能做到的。例如,也许你想确定一下所有用户是否都使用受密码保护的屏保程序。Security Analyzer 能够做到吗?不能,但是你却可以通过编写一段很简单的脚本来实现:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg =GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
ValueName = "ScreenSaverIsSecure"
objReg.GetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName,
strValue
If strValue = "1" Then
Wscript.Echo "The screen saver is password protected."
Else
Wscript.Echo "The screen saver is not password protected."
End If
然后,当然了,你也可以再进一步对屏保程序进行密码保护:
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
Set objReg =GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Control Panel\Desktop"
ValueName = "ScreenSaverIsSecure"
strValue = "1"
objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, ValueName,
strValue
所以,也许你使用 Security Analyzer 来完成某些任务同时使用脚本来完成其它一些任务。问题的重点在于,你不应该用非此即彼的主张来看待安全问题:不是使用 Security Analyzer 就是通过编写脚本。相反,无论使用哪个都能起到很好的效果。毕竟,脚本通常用来辅助已经使用的工具而不是完全取代这些工具。选择你应该干的工作。
或者,至少随便做一些能够让你的管家去做的事情。
你对栏目有什么问题或意见吗?请写信到 [email protected]。找 Bentley