为特定模式中的用户创建表权限

joe*_*nce 6 schema security sql-server permissions

我想在数据库的 schema1 上向用户 A 授予 Create 、 alter 和 drop 权限。我想这个问题已经被问到了,我发现的是将更改授予架构并将创建表授予用户 A: GRANT ALTER, DELETE, EXECUTE, INSERT, SELECT, UPDATE ON SCHEMA::schema1 TO user A;

GRANT CREATE TABLE TO User A;

如果这是正确的,那么 userA 是否也可以在其他模式上创建表?

Dav*_*oft 7

我想在数据库的 schema1 上授予用户 A 创建、更改和删除权限

做到这一点的安全方法是让 A 拥有该架构。

授予用户更改另一个用户模式的能力,使该用户能够在该模式所有者拥有的任何表中选择、插入、更新和删除行。这称为“所有权链接”,它使视图和存储过程成为控制安全性的真正简单方法,因为对视图或存储过程具有权限的用户不需要被授予对底层表的权限,只要View/Proc 与 Table 拥有相同的所有者。

但是,在这种情况下,您可以轻松地使用所有权链创建安全漏洞。通常,您永远不希望用户能够创建由不同(尤其是特权)用户拥有的对象。

例如,仅授予 CREATE TABLE、ALTER 和 INSERT 权限会创建一个安全漏洞:

use master
--drop database security_test
go
create database security_test
go
use security_test 
go

create schema schema1 authorization dbo
go
create user A without login
go
grant create table to A
grant alter, insert on schema::schema1 to A
go
create table dbo.secret(id int, msg varchar(200))
insert into dbo.secret(id,msg) values (1, 'secret data')
go
execute as user='A'

create table schema1.foo(id int)

go
create trigger t on schema1.foo after insert
as
begin
  select * from dbo.secret 
end

go

insert into schema1.foo(id) values (1)


go

revert
Run Code Online (Sandbox Code Playgroud)

产出

id          msg
----------- -----
1           secret data
Run Code Online (Sandbox Code Playgroud)


小智 4

是的,您需要授予数据库级别的创建表权限。例如,如果用户被授予创建表所需的权限,但没有在特定架构中执行此操作所需的权限,则他们无法在那里创建表。