【问题标题】:SQL Server Integrated Security with a service account (not the user's account)带有服务帐户(不是用户帐户)的 SQL Server 集成安全性
【发布时间】:2021-07-29 22:50:00
【问题描述】:

我们有一个 EXE 和一个 DLL,可以读取/写入 SQL Server 数据库。 EXE 和 DLL 在用户的计算机上运行。

我们想使用 Integrated Security 连接到 SQL Server 数据库,但不是使用用户的 windows id,而是使用 windows 服务帐户。这样,我们就不需要授予用户对数据库的写入权限。

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

谢谢。

【问题讨论】:

  • 在您的 exe/dll 代码中,您可能正在寻找Impersonation。如果无法修改 exe/dll 可能是“运行方式”技巧?
  • 我无法要求用户执行“运行方式”。使用模拟,我是否需要在代码中以服务帐户身份登录? bool returnvalue = logonUser(用户名,domainname,console.readline(),logon32_logon_interactive,logon32_provider_default,sudeTokenhandle)? span>
  • 通常你有某种后端连接到数据库而不是前端。后端使用类似Integrated Security=true; Initial Catalog=AdventureWorks;Server=MSSQL1 的东西。用户 exe 使用不同帐户(“服务帐户”)的问题在于,此其他帐户的凭据需要在应用程序中,用户可以提取并直接连接到数据库。因此,如果您的意图是某种形式的安全性,那么使用其他帐户将无济于事。最好使用后端,这样用户就完全不知道数据库了
  • 你没有提到你为什么要这样做。您的要求实际上会损害网络安全性,但听起来您是基于希望使其更安全的前提
  • 同意。不幸的是,在这种情况下,没有后端,一切都在前端。

标签: c# .net sql-server connection-string integrated-security


【解决方案1】:

技术上你可以,虽然这不是一个好主意。您没有描述的是您对此要求的推理。

这感觉像是一个 XY 问题,通过在另一个安全帐户的上下文中运行用户应用程序,您正在创建一个其他进程可能能够劫持的安全窗口。您失去了审核和控制每个用户对您想要保护的资源的访问权限的能力,而不是让事情变得更安全,在大多数情况下,您实际上实现了相反的效果。

大胆声明正确...如果用户正在运行应用程序,那么他们必须为提升的安全帐户保存或存储凭据,或者该用户必须知道提升的凭据。

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

进一步被忽视的是,您的应用程序所做的一切、每个审计跟踪、每个日志、所有内容都将显示为服务帐户,而不是用户帐户。当出现安全漏洞需要追踪时,不能单独的用户账户分开,每个人都会看起来像一个服务账户,在这种情况下,它扩展到 SQL Server 审计和安全配置文件,整个环境看起来像一位用户使用数据库,并且一位用户可能在 SQL Server 中拥有最高权限,这意味着只需要一个控制台就可以被攻破,而一个控制台可能有权运行 DDL 语句并且可能会导致一些严重问题。

我不能过分强调这一点,每个人都通过单一凭据访问数据库,这是一种非常糟糕的安全做法,并且在面对 SQL Server 中内置的非常强大的安全机制时笑了。

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

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

请记住,替代方法可能是让服务帐户成为数据库的数据库管理员角色或所有者,这样您应用的任何用户都可以删除数据库。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2012-05-31
    • 2020-05-13
    相关资源
    最近更新 更多