减少应用程序使用的 SQL 服务器登录/用户数

Reduce number SQL server login / user used by application

我们的应用程序是在带有 SQL 服务器的 .net WinForms 中开发的,它有自己的用户身份验证和配置文件授权机制映射到 SQL 登录/用户/角色,部署在 DMZ 网络中,可访问仅供获得授权的人使用。

一个潜在客户的 IT 部门抱怨在 SQL 服务器中维护数百个登录名/用户/角色,他们只想要一个 SQL 登录名/用户附加到单个 SQL 服务器角色其余的安全事项必须在客户端应用程序中进行管理。

这完全取决于您需要的安全程度。

在谈论客户端应用程序时,您已经遇到这样的问题,即客户端工具——就其本质而言——容易被滥用;例如,如果我有一个客户端应用程序的副本,对我来说反编译/逆向工程无论它在做什么,并改变逻辑都是相对微不足道的——完全绕过客户端应用程序中的任何和所有安全性。您 可以 可能仍然在数据库服务器上进行审计,但老实说:在大多数情况下,除非您在 行为 中捕获恶意数据库访问,否则它将是很难知道发生了什么 - 客户端软件 可能 只是不执行或混淆地执行任何审计步骤。现在:如果您遇到这种情况并使用单一登录,客户端直接连接:问题变得更糟:这些登录详细信息将需要嵌入到应用程序中,以便应用程序可以代表共享凭据登录(这意味着:任何攻击者都可以掌握它们),如果您确实在行动中发现了一些东西:您会看到它是从这些共享凭据发生的 - 除非您可以查看 IP 数据等等

如果这不是您的攻击媒介:那么当然,只做您需要的 - 但您提到审计这一事实意味着这 可能 不可取。

相反,我建议考虑让客户端间接与数据库对话。如果客户端应用程序仅通过 Web 服务(您选择的任何一种)进行通信,那么客户端可以做的事情就会受到更多限制。您可以在 Web 服务层上使用现有的安全模型,然后一旦您对用户进行了身份验证等,就切换到受信任的子系统模型,以便使用单个凭证与数据库对话——可能是 [=39 的 AD 帐户=] 网络服务。 Web 服务器更难成为攻击和滥用的目标。您现在可以将所有逻辑、安全检查、审计等保留在 Web 服务层中,而不是客户端(您当然可以 复制 在客户端进行这些检查,以提供即时 UI 反馈不允许的操作,而不打扰网络服务)。这为您提供了两全其美的 可能允许更好的远程使用。但是,这几乎肯定意味着重写应用程序的整个数据层。