问题:用户连接到计算机上的服务,例如IIS网站或SQL Server数据库。 网站或数据库需要访问networking资源,如文件共享(最常见)或不同服务器上的数据库。 权限被拒绝。
这是因为服务运行的用户首先没有networking权限,或者如果是,则没有访问远程资源的权限。
我一遍又一遍地遇到这个问题,厌倦了没有一个真正的坚实的方式来处理它。
以下是我所知道的一些解决方法:
运行IIS作为被授予高权限的自定义创build的域用户
如果权限一次被授予一个文件共享,那么每次我想从一个新的共享中读取数据时,我都不得不要求networkingpipe理员为我添加它。 最终,许多网站阅读了很多股票,这将变得非常复杂。 如果权限只是打开了广泛的用户访问我们的域中的任何文件共享,那么这似乎是一个不必要的安全表面区域呈现。
这也适用于在IIS上运行的所有站点,而不仅仅是需要访问的选定站点或虚拟目录,还有一个表面区域问题。
做同样的事情,但使用应用程序池或单独设置凭据
不需要像特定用户一样运行整个IIS实例:每个站点,应用程序和文件夹都可以设置为在特定的应用程序池或手动select的凭据集下运行。 这解决了表面积问题的一小部分,但是并没有真正解决关于pipe理许可粒度的问题,并且在许多资源上这样做。
仍然使用IUSR帐户,但给它networking权限,并在远程资源(不是域用户,本地用户)上设置相同的用户名
这也有它的问题。 例如,有一个文件共享我正在使用,我有充分的权利来共享,但我无法login到机器。 所以我必须find正确的pipe理员,并要求他为我做。 任何时候都必须改变,这是对pipe理员的另一个要求。
允许IIS用户以匿名方式连接,但将用于匿名访问的帐户设置为高权限帐户
这比给予IIS IUSR完全权限还要差,因为这意味着我的网站首先不能使用任何types的安全性。
使用Kerberos进行连接,然后进行委托
这原则上听起来不错,但有各种各样的问题。 首先,如果您使用的是虚拟网站,而您连接到网站的域名不是基本计算机名称(正如我们经常使用的那样),则必须使用Microsoft的Web服务器在Web服务器上设置服务主体名称SetSPN实用程序。 这很复杂,显然很容易出错。 此外,您必须要求您的networking/域pipe理员更改Web服务器和域帐户的安全策略,以使其“受信任进行委派”。 如果你没有完全正确地得到一切,突然你想要的Kerberos身份validation是NTLM,而你只能模拟而不是委托,因此不能以用户的身份到达networking。 此外,此方法可能会有问题,因为有时您需要网站或数据库具有连接用户不具有的权限。
创build一个服务或COM +应用程序来获取网站的资源
服务和COM +包使用他们自己的一组凭据运行。 以高特权用户身份运行是可以的,因为他们可以做自己的安全性并拒绝不合法的请求,将控制权交给应用程序开发人员,而不是networkingpipe理员。 问题:我正在使用一个COM +程序包,它在Windows Server 2000上完全实现这一function,可将高度敏感的图像传送到安全的Web应用程序。 我尝试将网站移动到Windows Server 2003,并突然被拒绝实例化COM +对象的权限,很可能是registry权限。 我徘徊了很多,并没有解决问题,部分原因是我不愿意给予IUSR帐户完整的registry权限。 这看起来像只是作为一个高权限用户运行IIS一样的坏习惯。
注意:这其实很简单。 在您select的编程语言中,您可以使用返回所需对象实例(例如ADODB.Connection)的函数创build一个类,然后构build一个dll,将其注册为COM +对象。 在您的Web服务器端代码中,您将创build该类的一个实例并使用该函数,并且由于它在不同的安全上下文中运行,因此对networking资源的调用将起作用。
将驱动器号映射到共享
这在理论上是可行的,但在我看来,这不是一个好的长期战略。 尽pipe可以使用特定凭证创build映射,而这可以由networkingpipe理员完成,但这也意味着可能会有太多的共享驱动器(小粒度),或者授予整个文件太多的权限服务器(大粒度)。 此外,我还没有想出如何映射驱动器,使IUSR获得驱动器。 映射一个驱动器是针对当前用户的,我不知道IUSR账户密码是否以它的身份login并创build映射。
将本地资源移到Web服务器/数据库
有些时候我已经完成了这个工作,特别是Access数据库。 数据库是否必须在文件共享上存在? 有时,将数据库移动到Web服务器或SQL数据库服务器是最容易的(所以链接的服务器可以工作)。 但我不认为这是一个很好的全面解决scheme。 当资源是服务而不是文件时,它将不起作用。
将服务移到最终的Web服务器/数据库
我想我可以在我的SQL Server数据库上运行一个Web服务器,所以网站可以使用模拟连接到它,并让我高兴。 但是,我们是否真的想要在我们的数据库服务器上的随机额外的Web服务器,所以这可能吗 没有。
在IIS中的虚拟目录
我知道虚拟目录可以帮助使远程资源看起来像是本地的,并且这支持为每个虚拟目录使用自定义凭据。 我还没有想出来,但是,这将如何解决系统调用的问题。 用户可以直接访问文件共享,但这并不能帮助传统的ASP代码访问资源。 我可以使用URL而不是文件path来读取网页中的远程数据文件,但这不会帮助我连接到Access数据库,SQL服务器数据库或任何其他使用连接的资源库,而不是只能读取所有的字节,并与他们一起工作。
我希望能够创造出某种“服务隧道”。 想想VPN如何使远程资源看起来像是本地的。 使用更丰富的别名机制(可能是基于代码的),为什么在定义的安全上下文中甚至不能发生数据库连接? 为什么不是一个特殊的Windows组件,可以让您指定每个用户有哪些资源可用以及哪些备用凭证用于连接? 文件共享,数据库,网站,你的名字。 我想我几乎在谈论一个专门的本地代理服务器。
无论如何,这是我的名单。 如果我想到更多,我可能会更新它。 有人对我有什么想法吗?
我今天的问题是,再次,我需要一个网站连接到文件共享上的Access数据库。 再来一次…
我个人build议通过身份validation和.net模拟,每个应用程序使用一个独特的域帐户。 就像你说的这个域pipe理员的瓶颈一样,但是每次更改访问权限都必须经过一个pipe理员,实际上是一件好事。
据推测,一旦股票build立每个应用程序(一个明确的build立过程的一部分?),他们不会真的改变太多?
pipe理员可以有一个明确的stream程,包括访问授权的文档,以及来自pipe理的签名授权。 这样,如果你碰巧在监pipe环境下工作,一切都保持良好和安全,并且非常适合外部审计。
通过SQL复制/日志传送和/或文件同步,使所有这些networking/远程资源本地化(微软的同步框架是一个选项,虽然cygwin + rsync的symplicity是更吸引人,国际海事组织)。
当然,所有这些都取决于数据更改的频率和/或您是需要双向同步还是简单镜像。
如果您不想使用Kerberos,则可以在访问资源时模拟用户,使用在使用基于表单的身份validation进行身份validation时创build的令牌。 这应该使用SSL证书,至less在login过程中。
假设你没有通过从前端到后端共享的身份validation的安全要求,我会考虑如何获取这个应用程序需要在一个安全根目录下访问的networking资源。 像DFS共享可能是完美的。
其次,我会将安全性分配给AD安全组,而不是单个服务帐户或计算机。
从那里我可能会使用服务帐户和计算机名称,因为它们是有意义的。 EG,您可能只需将数据库服务器的服务帐户(DOMAIN / MACHINENAME $)添加到该组中,但是如果您拥有一组Web应用程序服务器,则可以使用公共服务帐户。