0

我们正在为我们的系统构建一个管理应用程序,该应用程序的一项功能是为新用户创建新数据库。这个应用程序需要创建数据库、恢复数据库、创建用户、授予权限等 - 所以用户需要有一些非常强大的权限。

我们将这些服务承包给了一家外部公司,我们不想让他们不受限制地访问我们的系统,我们只希望他们能够做我们允许他们做的事情。因此,我们考虑将整个过程封装在一个存储过程中,将此 EXECUTE 授予特定域用户,并使用 EXECUTE AS 'SA' 运行它。

不幸的是,这是不可能的 - SA 不是数据库用户,当我们尝试将其定义为一个时,我们收到错误

Msg 15405, Level 16, State 1, Line 1
Cannot use the special principal 'sa'.

然后我们考虑使用 DBO 并设置跨数据库所有权链接,但这一切都开始令人头疼。有谁知道这样做的优雅方法?

4

3 回答 3

4

这完全可以通过模块签名实现。

  • 创建一个执行提升代码的过程。
  • 添加EXECUTE AS CALLER到程序
  • 创建证书和私钥
  • 签署程序
  • 删除私钥
  • 导出证书
  • 将证书导入[master]
  • 创建从证书派生的登录名
  • 授予证书派生登录所需的权限

请注意,对程序的任何更改都会使签名无效,并且需要重做该程序。删除私钥非常重要,因为否则供应商可以签署不同的程序并获得对任意代码的提升权限。有关示例,请参阅签署激活的过程。

于 2013-04-22T10:53:36.200 回答
2

要管理数据库中的内容,您可以使用EXECUTE AS OWNER并确保 dbo 拥有存储过程。那里没有问题

但是,CREATE DATABASE 等需要服务器级别的权限。注意:您不需要sysadmin权限。

使用 SQL Server 2012,您可以使用服务器角色,并GRANT CREATE DATABASE使用此服务器角色。对于早期版本,您可以将其直接授予登录名。或者dbcreator,如果您愿意,可以使用。

但是,如果您决定他们需要管理登录,securityadmin则具有与sysadmin

于 2013-04-22T10:52:43.313 回答
-2
create database admin;
GO

alter database admin set trustworthy on
GO

alter authorization on database::admin to [sa]
GO

use admin
GO

create procedure adminProc
with execute as 'dbo'
as
create database test
GO

create login tmp with password = 'tmp', check_policy = off
GO

create user tmp
GO

grant execute on adminProc to tmp
GO

execute as login = 'tmp'
GO

-- This fails
create database test

-- This works
exec adminProc
GO

revert
GO

drop database test
GO
于 2013-04-22T10:50:23.147 回答