SQLServer数据权限与授权管理全解析
立即解锁
发布时间: 2025-08-23 01:46:43 阅读量: 1 订阅数: 5 

### SQL Server 数据权限与授权管理全解析
#### 1. 数据安全概述
数据安全大致可分为两个领域:
- **身份验证(Authentication)**:验证系统用户身份的行为。
- **授权(Authorization)**:给予用户访问系统控制资源的行为。
在许多情况下,这两个领域可以分别委托处理。只要身份验证部分正常工作,用户就可以在会话的其余部分被移交到授权机制。虽然 SQL Server 的身份验证本身是一个大话题,但开发者主要应关注身份验证之后的事情,即用户如何被授权访问数据以及如何保护数据不被未授权用户访问。
需要注意的是,在日常开发工作中,不应完全忽视身份验证问题。开发环境通常为了简化而设置宽松的安全策略,但一个完善的开发过程应包括一个应用完整身份验证限制的测试阶段,以确保向生产系统部署时不会出现用户无法登录的严重失败情况。
#### 2. 用户登录与应用登录
在许多数据库应用设计中,授权是在应用层而不是数据库层处理的。在这类应用中,用户通常使用自己的个人凭证连接并登录应用,但应用随后使用单个共享的应用登录连接到数据库。这个应用登录被授予执行数据库中与该应用相关的所有存储过程的权限,而由应用本身的授权例程来确定任何给定用户可以执行的操作。
这种方法有一些好处,例如能够利用不同会话之间的连接池。然而,这意味着 SQL Server 提供的处理每个用户安全的任何功能都不适用。如果应用中存在漏洞,或者与应用登录关联的凭证被泄露,用户就有可能对数据库执行该应用有权限执行的任何查询。
#### 3. 最小权限原则
在任何系统(数据库或其他系统)中锁定资源的关键本质上很简单:任何给定用户应该只在需要访问这些资源的时间内,访问所需的最少资源集。但在实践中,这更多是一个理想目标,而非实际的数据安全解决方案。许多系统不允许为用户分配的权限集轻松动态提升,并且微软 Windows 系列操作系统历史上没有将权限提升作为在运行时获得额外访问权限的手段。
许多多用户操作系统在需要访问某个用户拥有的资源时,实现了模拟其他用户的功能。模拟与重新身份验证略有不同,它允许进程临时提升其权限,承担被模拟主体的权利,而不是注销并重新发送凭证,从而避免强制停止任何正在运行的进程。操作系统级别的常见示例是 UNIX 的 `su` 命令,它允许用户临时承担另一个用户的身份,并在完成后轻松恢复。Windows 系统也可以在一定程度上处理模拟,如 `.NET WindowsIdentity` 类提供的功能。
Windows 系统通常使用访问控制列表(ACLs)提供权限。授予资源权限意味着将用户添加到列表中,之后用户可以反复访问该资源,即使在系统登录和注销之后也是如此。但如果攻击者控制了系统中的一个账户,这种访问控制就无法提供额外的安全性,因为攻击者将自动获得该账户有权限访问的所有资源的完全访问权限。
通过模拟控制访问,用户每次需要访问资源时都需要动态请求访问。此外,对资源的权限仅在模拟过程中保持。一旦用户恢复(即关闭模拟),额外的访问权限将不再被授予。这意味着如果一个账户被攻破,攻击者还必须攻破模拟上下文才能访问更安全的资源。
#### 4. 在 SQL Server 中创建代理
SQL Server 2008 允许在服务器级别和数据库级别创建可以通过代理使用的安全主体:
- **服务器级代理**:要创建一个代理登录(可用于委派服务器级权限,如 `BULK INSERT` 或 `ALTER DATABASE`),首先必须在 `master` 数据库中创建一个证书。创建证书的语法如下:
```sql
USE master;
GO
CREATE CERTIFICATE Dinesh_Certificate
ENCRYPTION BY PASSWORD = 'stR0n_G paSSWoRdS, pLE@sE!'
WITH SUBJECT = 'Certificate for Dinesh';
GO
```
创建证书后,可以使用 `CREATE LOGIN FROM CERTIFICATE` 语法创建代理登录:
```sql
CREATE LOGIN Dinesh
FROM CERTIFICATE Dinesh_Certificate;
GO
```
这个登录可以像任何其他登录一样被授予权限,但要使用这些权限,必须将该登录映射到一个数据库用户,这可以通过使用创建登录时使用的相同证书创建用户来完成:
```sql
-- 假设前面已创建 Dinesh_Certificate
CREATE USER DineshUser
FROM CERTIFICATE Dinesh_Certificate;
GO
```
- **数据库级代理**:可以通过向数据库添加一个与服务器登录无关的用户来创建在数据库级别操作的代理主体,使用 `CREATE USER WITHOUT LOGIN` 语法:
```sql
CREATE USER Bob
WITHOUT LOGIN;
GO
```
这个用户像任何数据库用户一样可以被分配所有权和其他权限,但不能以 Bob 的身份登录服务器进行身份验证。必须使用有效的服务器级登录登录,并使用与该登录关联的任何数据库用户对数据库进行身份验证,然后才能模拟 Bob,承担该用户被分配的任何权限。
#### 5. 数据安全的分层:洋葱模型
一般来说,攻击者为了访问有价值的资源必须穿透的层次越多,阻止其攻击的机会就越大。开发者应该为任何敏感数据构建多层保护,以确保如果一个安全措施被突破,其他障碍将阻止攻击者。
以下是 SQL Server 数据安全的层次结构:
```mermaid
graph LR
A[外部认证] --> B[SQL Server 声明性权限系统]
B --> C[用户访问特定数据库资源]
C --> D
```
0
0
复制全文
相关推荐










