【问题标题】:App Pool User Unable to Execute Stored Procedure应用程序池用户无法执行存储过程
【发布时间】:2013-04-02 18:43:00
【问题描述】:

背景

我正在使用 SQL Server 2008 R2 的全文搜索来检索一些文档,并希望使用 sys.dm_fts_parser 的结果来突出显示匹配的术语。

这样做通常需要应用用户不应该拥有的权限。有一个解决方案proposed on MSDN 以及一个deleted question/answer on StackOverflow(参见why it was deleted)。

问题

我正在尝试实施解决方案,但无法向 IIS 应用程序池用户授予 执行 权限。

我的尝试

在安全/登录下的 SSMS 中,我创建了一个用户 IIS APPPOOL\My App。我授予该用户 db_datareaderdb_datawriter 访问表的权限,并且效果很好。

再次在 SSMS 中:

  • 在 MyDB / 可编程性 / 存储过程下,我右键单击 dbo.usp_fts_parser
  • 选择属性、权限。
  • 点击搜索...
  • 添加IIS APPPOOL\My App
  • 在显式选项卡上,执行行我检查授予
  • 点击确定

问题

为什么这个授权不足以执行dbo.usp_fts_parser

备注

  • 我可以通过以管理员身份登录的 SSMS 执行它。
  • 如果我暂时将 sysadmin 服务器角色授予IIS APPPOOL\My App,则代码能够执行dbo.usp_fts_parser

【问题讨论】:

    标签: sql-server sql-server-2008-r2 database-permissions


    【解决方案1】:

    如果你看官方MSDN help for this system function那么你会发现它实际上需要,

    权限

    需要 sysadmin 固定服务器角色的成员身份和访问权限 指定停止列表的权利。

    就像说的那样,该用户必须是 sysadmin 固定服务器角色的成员。我认为没有任何解决方法。

    【讨论】:

    • 我引用的链接提供了一种解决方法。由于 SO 版本是由一位高级用户发布并获得 8 票赞成,我认为它可以工作。
    • 该帖子已被删除,可能这就是我没有看到解决方案的原因。但是在阅读了整个 MSDN 帖子之后,看起来我错了,解决方案确实存在。但我不明白是否存在解决方案,那么为什么要问这个问题?如果问题是“为什么是 SYSADMIN 角色”,那么已经有关于 MSFT CONNECT 的请求(现在已关闭且未修复,这意味着 MSFT 不会修复此问题)
    • 我认为您需要 10K 代表才能查看已删除的 SO 帖子,这就是我包含 MSDN 的原因。我尝试实施该解决方案,但仍然遇到相同的错误。该解决方案的前提是不具有 SYSADMIN 角色的 Web 用户可以调用模拟具有 SYSADMIN 角色的用户的存储过程,但我无法使其正常工作。一定是漏掉了一个关键步骤。
    【解决方案2】:

    这是最初发布在https://stackoverflow.com/questions/3816023/sys-dm-fts-parser-permission/3816407#3816407的答案:

    在您的数据库中:

    create procedure usp_fts_parser
        @query nvarchar(max)
    with execute as caller
    as
    select * from sys.dm_fts_parser(@query, 1033, 0, 0);
    go
    
    grant execute on usp_fts_parser to [<some low priviledged user>]
    go
    
    create certificate sign_fts_parser
        encryption by password = 'Password#1234'
        with subject = 'sign_fts_parser';
    go
    
    add signature to object::usp_fts_parser
    by certificate sign_fts_parser with password = 'Password#1234';
    go
    
    alter certificate sign_fts_parser
    remove private key;
    go
    
    backup certificate sign_fts_parser
    to file = 'c:\temp\sign_fts_parser.cer';
    go
    

    在主人:

    create certificate sign_fts_parser
    from file = 'c:\temp\sign_fts_parser.cer';
    go  
    
    create login login_sign_fts_parser
    from certificate sign_fts_parser;
    go
    
    grant control server to login_sign_fts_parser;
    go
    

    我刚刚在 SQL Server 2008 上测试了这些步骤,并且能够通过低权限登录执行 usp_fts_parser。与原始帖子答案的唯一区别是我在存储过程上添加了显式 GRANT EXECUTE 并删除了单相启用的可信赖步骤。在您的情况下,&lt;low priviledged user&gt; 应该是IIS APPPOOL\My App,假设您在您的 ASP 应用程序中使用模拟。

    调用sys.dm_fts_parser 所需的权限来自过程签名,通过导出和导入master 数据库的证书,该签名具有显式的控制服务器权限(可能的最高权限)。由于证书的私钥已被明确删除,因此无法滥用与此证书相关的高权限,因为它无法再次签署任何内容(私钥永远丢失)。详情请见Module Signing (Database Engine)

    请注意,每次修改存储过程时都必须重复上述步骤。过程中的任何 ALTER 都会导致相关签名的自动、静默删除。丢失模块签名意味着丢失从该签名派生的特权,因此对低特权用户的后续调用 sys.dm_fts_parser 将失败。

    【讨论】:

    • 感谢您的回答。我认为我的问题可能是每次修改存储过程时都会重复。我想我确实在遵循概述的步骤后编辑了 usp 以仅返回一列。 +1,并将在今天晚些时候进行测试。
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 2019-08-26
    • 2020-03-25
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多