为IIS配置安全的发布方法
为IIS配置安全的发布方法
IIS发布Web服务、网页、上传下载程序等的时候,对它的安全性都极为关注,比如:防止其他程序访问、下载你的发布资源,禁止非法用户上传东西等。
一、安全发布
WebService类、WebRequest类、WebClient类等都有一个共同的属性是Credentials 属性,它是访问 Internet 资源所需的身份验证凭据。
打开IIS选中发布目录,点击鼠标右键,选择快捷菜单“属性”,在主目录标签页中有脚本资源访问、读取、写入、目录浏览四个选择项。如果你只需要外网读取就把“读取”选上,如果允许写入要把“写入”选上,“目录浏览”不要选上,一般不让外网浏览目录,应用程序保护选择“中(共用的)”,如果是IIS6.0还要设置所在缓冲池的访问权限。进入计算机管理,添加一个用户snt,使它隶属于users,进入目录安全性标签页---〉匿名访问和验证控制---〉编辑,不要选择“匿名访问”,把“集成windows验证”选上。把发布目录所在的磁盘转换为NTFS格式。选中网站目录点击鼠标右键选择属性,进入安全标签页(如:默认网站指向目录为:c:\inetpub\wwwroot,则选中wwwroot),把snt用户和users组加上,使它们有“读取及运行、列出文件夹目录和读取”权限,如果需要上传资源到这个目录,还要选上“写入”权限。(注意:系统目录WINNT或WINDOWS也要分配users组具有“读取及运行、列出文件夹目录和读取”权限,因为II要访问Microsoft.NET目录和Temp目录等,Documents and Settings目录要加上snt用户,使它有“读取及运行、列出文件夹目录和读取、写入”权限)。如果配置可以上传的发布目录,要把IIS的扩展服务WebDev设为“允许”。
程序携代码时加入一下程序:
NetworkCredential networkCredential=new NetworkCredential(UserName,Password)
(WebService类或WebRequest类或WebClient类).Credentials=networkCredential
再用相关类访问发布资源就可以了。
示例:
[Visual Basic, C#, C++] 下面的示例收集来自用户的用户名和密码信息,并使用这些信息创建 NetworkCredential。使用此 NetworkCredential 设置 Credentials 属性。当进行请求时,将使用存储在该属性中的凭据对请求方的访问进行验证。
[Visual Basic]
' Create a new webrequest to the mentioned URL.
Dim myWebRequest As WebRequest = WebRequest.Create(url)
' Set 'Preauthenticate' property to true.
myWebRequest.PreAuthenticate = True
Console.WriteLine(ControlChars.Cr + "Please Enter ur credentials for the requested Url")
Console.WriteLine("UserName")
Dim UserName As String = Console.ReadLine()
Console.WriteLine("Password")
Dim Password As String = Console.ReadLine()
' Create a New 'NetworkCredential' object.
Dim networkCredential As New NetworkCredential(UserName, Password)
' Associate the 'NetworkCredential' object with the 'WebRequest' object.
myWebRequest.Credentials = networkCredential
' Assign the response object of 'WebRequest' to a 'WebResponse' variable.
Dim myWebResponse As WebResponse = myWebRequest.GetResponse()
[C#] // Create a new webrequest to the mentioned URL.
WebRequest myWebRequest=WebRequest.Create(url);
// Set 'Preauthenticate' property to true. Credentials will be sent with the request.
myWebRequest.PreAuthenticate=true;
Console.WriteLine("\nPlease Enter
Console.WriteLine("UserName");
string UserName=Console.ReadLine();
Console.WriteLine("Password");
string Password=Console.ReadLine();
// Create a New 'NetworkCredential' object.
NetworkCredential networkCredential=new NetworkCredential(UserName,Password);
// Associate the 'NetworkCredential' object with the 'WebRequest' object.
myWebRequest.Credentials=networkCredential;
// Assign the response object of 'WebRequest' to a 'WebResponse' variable.
WebResponse myWebResponse=myWebRequest.GetResponse()
二、匿名:无客户端身份验证
IIS 5.0 为独立提供了三个选项:低(IIS 进程)、中(池)和高(独立)。IIS 具有匿名 Internet 用户帐号的概念,默认为 IUSR_MACHINE,这是另一个在安装 IIS 时创建的本地帐号(类似于 IWAM_MACHINE)。对于给定的资源,如果启用了匿名选项,IIS 将会检查通过这个帐号是否可以成功的访问请求的资源(HTML 文件、ASP 脚本、GIF 文件等)。如果文件上的 DACL 允许访问匿名 Internet 用户帐号,IIS 将在该帐号的支持下执行客户端的请求,而不会尝试一个更加昂贵的身份验证选项。这意味着 IIS 将模拟这个匿名的 Internet 用户帐号并在模拟时打开文件。另一方面,如果 DACL 拒绝访问这个匿名 Internet 用户,那么 IIS 将迁移到列表中下一个身份验证选项。对于该资源如果没有启用其他选项,则访问将被拒绝。请注意,我已经很小心地用抽象术语来标识这个帐号。这是因为它并不总是 IUSR_MACHINE。当然,IIS 元数据库中每个单独的 Web 资源(Web 站点、虚拟目录、文件系统目录或者文件)都具有以下(可继承的)属性:
AnonymousUserName 这是一个有效的用户帐号名,当匿名 Internet 用户请求特定资源时,IIS 使用这个帐号为他们建立一个登录会话。
AnonymousUserPass 刚刚描述过的帐号的密码。
AnonymousPasswordSync 这是一个我即将描述的具有神奇性质的布尔属性。
默认情况下,元数据库(所有 Web 节点的根)中的 W3SVC 节点设置 AnonymousUserName 为 IUSR_MACHINE,并设置 AnonymousPasswordSync 为 True 。后面的这个属性非常神奇,当设置的时候,通过在 LSA 中调用一个特殊的子身份验证 DLL 可以使 INETINFO.EXE 在没有提供密码的情况下获得一个登录会话,这基本上为您提供了一个登录,而根本不需要检查密码。这是一个很好的特性。但是要注意:它只支持本地帐号。如果这个特性使你有所警觉的话,想想 INETINFO.EXE 是运行在 System 登录会话中的,因此是 TCB 的一部分。这是 TCB 的成员在本地机上随意行事的例子。
根据我自己使用 IIS 5.0 的经验,如果使用密码同步选项,那么为匿名用户产生的登录会话将是一个没有网络凭据的网络登录会话,由于 IIS 在没有提供密码的情况下获得登录会话,这将很有意义。另一方面,如果没有使用这个特性,并且明确的指定了一个密码,登录会话将是一个有网络凭据的交互式登录会话。当然,如果您使用一个本地帐号,这些网络凭据不会有太大帮助,除非您在另外一台机器上创建了一个匹配的用户名和密码。
另外还应注意,当两个或者多个资源共享同一匿名帐号设置(典型情况)时,IIS 尽量缓存一个单独的登录会话,并为所有这些资源模拟该会话,甚至跨越独立的应用程序边界。