Gif*_*guy 2 security sql-server permissions
我有一个表,我希望它是只读的,除了一些需要UPDATE表中行权限的特定存储过程。
之后,我只希望一组选定的附加存储过程具有EXECUTE上述UPDATE过程的权限。
我一直在阅读有关GRANT,并DENY在MSDN / TechNet和我也一直念叨模式,但文档是如此模糊和非听上去很像是我无法搞清楚如何实现基于真实世界的安全目标提供的说明。
我可以看到,你可以GRANT或DENY个人的原则,一次一个权限-但我需要否定INSERT UPDATE和DELETE对所有原则的权限,除了到我授予几个存储过程UPDATE的权限(以及sa和/或db_owner我想) . 默认情况下,
我不希望任何新用户拥有UPDATE此表的权限,而且我真的很想避免每次创建/修改用户或其他对象时都必须手动拒绝权限。
默认情况下,不允许直接访问表或存储过程。必须明确授予访问权限,以便非特权用户具有访问权限。简化安全管理的最佳实践是授予角色权限,并通过角色成员资格控制访问。
如果您只想通过存储过程限制访问,请查看所有权链接 ( https://technet.microsoft.com/en-us/library/ms188676 )。这允许您向单个角色/用户授予执行权限,而不允许直接访问基础表,只要涉及的对象具有相同的所有者(默认为 dbo)。
在您的场景中使用所有权链接,您可以只SELECT授予对表的权限,只有对更新过程具有执行权限的用户才允许更新。不允许直接修改表。
编辑:
下面是一个所有权链接示例。请注意,两个用户都不能直接更新表,写用户只能使用存储过程更新表。所有权链接的含义是,当您授予对存储过程的执行权限时,只要对象具有相同的所有者,用户就可以访问所有封装对象而无需直接对象权限。
--create objects
CREATE TABLE dbo.MyTable(
MyTableID int IDENTITY NOT NULL
CONSTRAINT PK_MyTable PRIMARY KEY
, SomeData int
);
GO
CREATE PROC dbo.UpdateMyTable
@MyTableID int
, @SomeData int
AS
UPDATE dbo.MyTable
SET SomeData = @SomeData
WHERE MyTableID = @MyTableID;
GO
--create roles
CREATE ROLE TableReaderRole;
CREATE ROLE TableWriterRole;
GO
--grant permissions to roles
GRANT SELECT ON dbo.MyTable TO TableReaderRole;
GRANT EXECUTE ON dbo.UpdateMyTable TO TableWriterRole;
GO
--create user with only read permissions
CREATE USER SomeReadOnlyUser FOR LOGIN SomeReadOnlyUser;
ALTER ROLE TableReaderRole
ADD MEMBER SomeReadOnlyUser;
GO
--create user with both read and writer permissions
CREATE USER SomeAllowedWriteUser FOR LOGIN SomeAllowedWriteUser;
ALTER ROLE TableReaderRole
ADD MEMBER SomeAllowedWriteUser;
ALTER ROLE TableWriterRole
ADD MEMBER SomeAllowedWriteUser;
GO
Run Code Online (Sandbox Code Playgroud)
请注意,与所有权链接相关的是所有者而不是模式名称。如果表和过程在不同的模式中,只要模式具有相同的所有者(授权),所有权链就不会中断。对象所有者通常继承自架构所有者。
| 归档时间: |
|
| 查看次数: |
1647 次 |
| 最近记录: |