使用证书的存储过程上的 SQL Server 签名
Posted
技术标签:
【中文标题】使用证书的存储过程上的 SQL Server 签名【英文标题】:SQL Server signature on stored procedure using certificate 【发布时间】:2014-05-27 21:11:06 【问题描述】:我对 at this link 的例子感到困惑。 here 有一个类似的例子,但我更喜欢第一个。简要总结一下我的困惑:
-
根据证书创建用户 (examplecertuser)。
将权限授予从证书创建的用户 (examplecertuser)。
使用证书将签名添加到存储过程。
然后使用与先前无关的单独登录名 (testuser) 完成测试。这是我不明白的。
我不确定创建 examplecertuser 的原因或它的用途。更重要的是,由于登录 (testuser) 和证书创建用户 (examplecertuser) 之间没有建立连接,这意味着 ANY LOGIN 能够运行存储过程。我通过创建另一个登录名并让它也运行存储过程来验证这一点。
根据我阅读的所有建议,我正在研究这一点以避免数据库所有权链接。我的目标是授予用户运行跨多个数据库的存储过程的能力,但将它们限制为仅运行该存储过程。使用我看到的示例,我想我将授予每个人运行存储过程的能力,而无法限制其他人使用它。
用更直接的格式重新表述问题,“你如何使用链接中的示例只允许选定的登录名运行存储过程?”用户(examplecertuser)似乎是授权的关键,但我没有看到用户和登录之间的任何链接。
【问题讨论】:
【参考方案1】:代码签名使您能够在某些情况下(而不是任何时候)授予基础对象的权限。例如,假设我有一个包含敏感信息的表格。我不希望任何人从中选择(即编写“select * from myTable”),但我可以通过存储过程授予他们访问权限(因此我可以限制他们可以使用业务逻辑选择的内容)。所以我完成了签署存储过程的练习。我仍然可以向单个用户授予(或拒绝)对该过程的执行权限。但是,当检查存储过程访问的基础对象的权限时,它将应用模块签名用户(示例中的 examplecertuser)的权限。
关于您的具体问题
-
只有被授予存储过程执行权限的用户才能运行它
要让此权限跨多个数据库,您需要在每个数据库中创建证书和关联用户。
【讨论】:
当您说“我仍然可以向单个用户授予(或拒绝)对该过程的执行权限”时,这可能是在我链接的示例之外吗?这可以解释为什么它对我没有意义。正如示例代码所示,任何登录都可以运行存储过程,这似乎与选择性授权的整个过程背道而驰。现在想想,一个更直接的问题应该是“如何使用链接中的示例只允许选定的登录名运行存储过程?” 嗯...“遗漏”不太准确。在“将所有内容放在一起”部分中,GRANT EXECUTE ON example_sp TO public GRANT EXECUTE ON unsigned_sp TO public
这两行为数据库中的每个人提供运行该过程的访问权限。您不必向公众授予执行权限;您可以授予任何您想要的人(只要他们是数据库主体)。
但是在同一节中,相同的权限被赋予了另一个无法执行的 SP (unsigned_sp)。所以 GRANT EXECUTE TO PUBLIC 不是允许登录运行 SP 而是从证书创建的用户。并且由于该用户或证书与登录名之间没有连接,因此所有登录名都能够运行由证书签名的 SP。如果相反,将权限授予登录(testuser),那么需要证书吗?我开始认为这个例子不适合这个概念。
您将基础对象(示例中为 testtbl)的权限与过程混为一谈。签名的全部意义在于这些可能是不相交的。 proc 上的所有 EXECUTE 权限意味着被授权者可以执行该过程。在该示例中,运行 unsigned_sp 的人还需要对 testtbl 的 SELECT 权限(因为它以 EXEC('SELECT...')
运行。通过签名,您可以说“仅对于使用此证书签名的程序,我才允许授予 SELECT 权限” .
好的,我想我终于明白了。如果您有一个希望每个人都运行的查询,我引用的示例可能会很有用。例如,“从假期表中选择所有公司假期”。但是,如果您想“从假期表中选择所有个人假期”,您将限制哪个登录名可以执行该 SP。如果 SP 需要跨数据库,那么您将证书从 DB 链接到 DB,并为其提供所需的访问权限。证书是隧道(任何人都可以使用隧道),而SP需要通过登录成为网守(只有部分登录才能开门)。以上是关于使用证书的存储过程上的 SQL Server 签名的主要内容,如果未能解决你的问题,请参考以下文章
将 nesjs 应用程序连接到 SQL Server Express 时出错:无法连接到 localhost:1433 - 自签名证书
Subversion Server SSL 证书验证失败:和其他原因