SQL 具有服务帐户(不是用户帐户)的服务器集成安全性

SQL Server Integrated Security with a service account (not the user's account)

我们有一个 EXE 和一个 DLL reads/writes 到 SQL 服务器数据库。 EXE 和 DLL 在用户计算机上运行。

我们想使用集成安全连接到 SQL 服务器数据库,但不是使用用户的 windows id,而是使用 windows 服务帐户。这样,我们就不需要给用户写数据库的权限了。

由于用户在用户计算机上运行 EXE 和 DLL,是否可以将 SQL 服务器连接字符串设置为集成安全性,但使用 windows 服务帐户(不是用户帐户) ) ?

谢谢。

从技术上讲你可以,尽管这不是一个好主意。你没有描述的是你提出这个要求的理由。

This feels like an XY issue, by running a user application in the context of another security account, you are creating a security window that other processes might be able to hijack. You lose the ability to audit and control per-user access to the resource that you want to secure, instead of making things more secure, you have in most cases actually achieved the reverse.

Bold claim right... If the user is running the application, then they must have a saved or stored credential for the elevated security account, or that user must have knowledge of the elevated credential.

运行 不同帐户上下文中的后台服务是完全可以接受的,但是当您将模拟脚本编写到用户应用程序的执行方式中时,这会在您编写脚本的方式和凭据的方式中产生漏洞存储,或者一旦用户在您的应用程序中,任何文件访问对话框,如导出、文件打开、文件保存对话框,都可以让您的用户在您模拟的帐户的上下文中访问文件系统和网络。根据您的应用程序,这可能是好事,也可能是坏事,但在 UX 中经常被忽视。

进一步忽略的是,您的应用程序所做的一切,每条审计跟踪,每条日志,一切都将显示为服务帐户,而不是用户帐户。当出现安全漏洞需要追查的时候,不能把各个用户账号分开,每个人看起来都是这个服务账号,在这种情况下,延伸到SQL服务器审计和安全分析,整个环境将看起来像一个用户使用数据库,并且该用户可能在 SQL 服务器内拥有最高权限,这意味着只需要一个控制台就会受到损害,并且该控制台可能有权使用 运行 DDL声明,可能会严重造成一些麻烦。

I can't over-state this, everyone accessing the database over a single credential, is a very bad security practice and is laughing in the face of the very robust security mechanisms built into SQL Server.

相反,使用域安全对您有利。不要担心对数据库文件的写入权限,如果您希望您的用户插入一条记录,那么他们需要 windows 安全权限来修改文件是有道理的。我会更担心我知道谁在访问我的文件以及何时访问我的文件,这只有在他们有个人帐户时才会发生。

如果您担心的是管理开销,那么创建一个安全组并将必要的用户放入该安全组。然后,您可以管理文件级访问权限,将组分配给所需的文件。 在 SQL 服务器中,您可以进一步限制该用户 SQL 操作的访问级别

Remember that the alternative is probably to make the service account a DB Admin role or owner for the database, so any user of your app could drop the database.

如果要使用Integrated Security,那么用户必须已经被信任才能访问域资源,数据库只是另一个域资源,所以安全管理应该被同等对待。我们希望用户拥有唯一帐户的最大原因是,我们可以轻松地限制或撤销对个人的访问权限,而不必影响域中的所有用户。


将用户与直接访问数据库分开的最佳方法是设置分层 DAL 层,其中 DAL 部署为应用程序与之通信的独立服务,该服务可以 运行用于数据库操作的特定用户帐户的上下文。这通常涉及对您的应用程序设计进行重大更改,但它仍然会引入上面列出的所有问题 SQL 安全实施,是的,它可能会解决网络安全问题,但没有简单的方法来应用基于个人用户或角色的安全性在数据库级别,如果每个人都使用相同的帐户,这意味着您有责任在应用程序级别管理它。