本篇文章是SQL Server安全系列的第十篇,详细内容请参考原文


不像一些其他industrial-strength数据库服务,SQL Server缺乏一个内置保护个别数据记录的机制,称为行级安全。这一篇将探讨为什么你可能想使用这种低层次粒度的数据访问以及如何实现行级安全。
行级安全
在发布SQL Server 2000和SQL Server 2005之间,微软对于安全变得非常严肃。比尔盖茨在2002年初所写的Trustworthy Computing备忘录,让SQL Server 2005接受大量的安全检查。一个新的安全策略是使授权计划远比以前的版本更细粒度化,让你细粒度的(fine-grained)控制谁可以对哪些对象操作。
增加安全粒度的一个明显的遗漏是它没有延伸到行级。你有很多在表级别的访问控制选项,但SQL Server在表内没有内置的访问控制机制,通常称为行级安全。在许多情况下这是一个问题,特别是当有保护数据的要求。例如,一个医学数据库中的患者表可能包含所有临床患者的数据,但只有医疗系统管理员有权限访问所有患者信息,而医生和护士只能访问他们直接照顾的患者信息。有许多其他的情况,需要允许访问一个表中记录的子集,甚至下降到单元(cell)级别。但SQL Server没有内置的行级别安全手段。
提示:表包含行和列,微软使用单元(cell)代表某一行某一列上的数据。有必要这样划分,因为有些场景需要保护表中的个别单元(cell)。在后面的章节中你会学习更多这方面的知识。
行级安全为数据库表中的个别记录提供细粒度的(fine-grained)访问控制权。所需的结果是,记录被一个查询的执行上下文过滤,这样用户只访问她有权限的记录。这种过滤使用相同的安全功能在SQL Server控制访问其他数据库和服务器对象和操作这些对象。
由于SQL Server缺少内置行级安全,开发人员和管理员不得不想出各种巧妙的创意和技术来解决这个问题。虽然这些技术往往需要一点点额外的工作来建立,但是为了发挥细粒度的(fine-grained)控制访问表中记录的子集而不是整张表来说它是值得的。
该技术根据你的需求可以是相对简单的或可以是复杂的,结合访问控制的安全标签和分类级别。安全标签描述了数据项的敏感性,你将在这一篇了解到这项技术。
我们现在的假设是,行级安全最好在数据库级别实现。你可以在应用程序级别上控制访问数据库对象,但你必须在每一个使用该数据库的应用程序中实现安全层。在数据库实现行级安全意味着对应用程序是透明的,甚至应用程序开发人员不需要知道有发生过访问控制。
在云主机数据库需要的驱动下,微软终于开始专注SQL Server的行级安全。他们首先添加行级安全到SQL Azure数据库,它将会是SQL Server 2016的一部分。
视图实现行级安全
正如你所知,SQL Server 2016会实现内置行级安全。但在它发布以及将你的数据迁移过去之前,我们只能通过自己的方法实现。让我们以一种常见的技术来看看行级安全的简单实现。尽管它很简单,它可以是一个更复杂的方法的基础。比如一个公司的客户记录包含敏感信息,如信用额度。只有系统管理员(或高管)和分配给客户的公司代表,能够查看客户数据,所有这一切都是简单地存储在一个单一的Customer表。
代码10.1先创建一个示例数据库(RowLevelSecurityDB),创建一张表(Customer),然后往表中插入部分测试数据。一切都是相当简单的,表中包含UserAccess字段。这是数据库代码用于限制访问的字段。记住,这是一个简单的例子,有很多其他的方法来做这些。

IF DB_ID('RowLevelSecurityDB') IS NOT NULL DROP DATABASE RowLevelSecurityDB;
CREATE DATABASE RowLevelSecurityDB;
GO
USE RowLevelSecurityDB;
GO

-- Create the sample table that we want to protect with row-level security
CREATE TABLE Customer (
    CustId INT, 
    Name NVARCHAR(30), 
    City NVARCHAR(20), 
    CreditLimit MONEY,
    SocialSecurityNumber NCHAR(11), 
    FelonyConvictions INT,
    UserAccess NVARCHAR(50)
);
GO

-- Add some data to the Customer table
INSERT INTO dbo.Customer
       (CustId, Name, City, CreditLimit, SocialSecurityNumber, FelonyConvictions, UserAccess)
VALUES (1, N'Don Kiely', N'Fairbanks', 5.00, N'123-45-6789', 17, N'UserOne'),
       (2, N'Kalen Delaney', N'Seattle', 500000.00, N'987-65-4321', 0, N'UserOne'),
       (3, N'Tony Davis', N'Cambridge', 5000.00, N'', 0, N'UserTwo'),
       (4, N'E.T. Barnette', N'Fairbanks', 0.00, N'555-66-7777', 47, N'UserOne'),
       (5, N'Soapy Smith', N'Sitka', 0.00, N'222-33-4444', 32, N'UserTwo'); 
View Code

相关文章: