日期:2014-05-18  浏览次数:20463 次

关于数据库安全性和保护的一些知识
SQL code

1,用户:

数据库用户是数据库级别上的主体。每个数据库用户都是 public 角色的成员。
guest 用户
创建数据库时,该数据库默认包含 guest 用户。授予 guest 用户的权限由在数据库中没有用户帐户的用户继承。
不能删除 guest 
,2,应用程序角色:
应用程序角色是一个数据库主体,它使应用程序能够用其自身的、类似用户的权限来运行。使用应用程序角色,可以只允许通过特定应用程序连

接的用户访问特定数据。与数据库角色不同的是,应用程序角色默认情况下不包含任何成员,而且是非活动的。应用程序角色使用两种身份验证

模式。可以使用 sp_setapprole 启用应用程序角色,该过程需要密码。因为应用程序角色是数据库级主体,所以它们只能通过其他数据库中为 

guest 授予的权限来访问这些数据库。因此,其他数据库中的应用程序角色将无法访问任何已禁用 guest 的数据库。

在 SQL Server 中,应用程序角色无法访问服务器级元数据,因为它们不与服务器级主体关联。若要禁用此限制,从而允许应用程序角色访问服

务器级元数据,请设置全局标志 4616

连接应用程序角色
应用程序角色切换安全上下文的过程包括下列步骤:

用户执行客户端应用程序。


客户端应用程序作为用户连接到 SQL Server。


然后应用程序用一个只有它才知道的密码执行 sp_setapprole 存储过程。


如果应用程序角色名称和密码都有效,则启用应用程序角色。


此时,连接将失去用户权限,而获得应用程序角色权限。


通过应用程序角色获得的权限在连接期间始终有效。

在 SQL Server 的早期版本中,用户若要在启动应用程序角色后重新获取其原始安全上下文,唯一的方法就是断开 SQL Server 连接,然后再重

新连接。从 SQL Server 2005 开始,sp_setapprole 有了一个可创建 cookie 的选项。Cookie 包含启用应用程序角色之前的上下文信息。

sp_unsetapprole 可以使用此 Cookie 将会话恢复到其原始上下文。有关这个新选项和示例的信息,请参阅 sp_setapprole (Transact-SQL)。

安全说明: 
SqlClient 不支持 ODBC encrypt 选项。通过网络传输机密信息时,请使用安全套接字层 (SSL) 或 IPSec 对通道进行加密。如果必须使凭据

在客户端应用程序中持久化,请使用加密 API 函数来加密凭据。在 SQL Server 2005 及更高版本中,参数 password 将作为单向哈希进行存储

。 

3,SID和ID

如果要编写与 SQL Server 引擎进行交互的代码,则应该注意用作主体内部表示形式的两个号码。每个主体都具有一个 ID 和一个安全 ID 

(SID)。这些号码的含义和源取决于主体的创建方式,同时与主体是服务器主体还是数据库主体有关。

服务器级标识号
创建 SQL Server 登录名时,便会为它分配一个 ID 和一个 SID。这些号码在 sys.server_principals 目录视图中显示为 principal_id 和 

SID。ID (principal_id) 将登录名标识为服务器上的安全对象。创建登录名时由 SQL Server 分配此 ID。删除登录名时,将回收其 ID 号。

SID 标识登录名的安全上下文,并且在服务器实例中是唯一的。SID 的源取决于登录名的创建方式。如果通过 Windows 用户或组创建登录名,

则会为它指定源主体的 Windows SID;Windows SID 在域中是唯一的。如果通过证书或非对称密钥创建 SQL Server 登录名,则会为它分配源

自公钥的 SHA-1 哈希的 SID。如果按照需要密码的、早期样式的 SQL Server 登录名创建登录名,则服务器将生成一个 SID。

数据库级标识号
创建数据库用户时,便会为它分配一个 ID 和一个安全 ID (SID)。这些号码在 sys.database_principals 目录视图中显示为 principal_id 

和 SID。ID 将用户标识为数据库中的安全对象。删除数据库用户时,将回收其 ID。分配给数据库用户的 SID 在数据库中是唯一的。SID 的源

取决于数据库用户的创建方式。如果通过 SQL Server 登录名创建用户,则会为它指定登录名的 SID。如果通过证书或非对称密钥创建用户,则 

SID 源自公钥的 SHA-1 哈希。

最大数据库用户数
最大数据库用户数由用户 ID 字段的大小确定。用户 ID 的值必须为零或正整数。在 SQL Server 2000 中,将用户 ID 存储为 16 位的 

smallint(其中一位是符号)。因此,SQL Server 2000 中最大用户 ID 数是 2的15次方 = 32,768。在 SQL Server 2005 及更高版本中,将

用户 ID 存储为 32 位的 int(其中一位是符号)。这些附加的位可以分配 2的31次方 = 2,147,483,648 的 ID 号。

数据库用户 ID 划分为预分配的范围省略。
--图片在我空间

用户 ID 大小从 smallint(16 位)增加到 int(32 位)。如果传递的是 32 位用户 ID,则要求使用 16 位用户 ID 的 API 将返回错误结果

。当迁移为 SQL Server 2000 或早期版本创建的数据和应用程序时,应检查代码是否引用了以下不推荐使用的接口。

sysusers

syscacheobjects

sysmembers

sysobjects

syspermissions

sysprocesses

sysprotects

systypes

USER_ID

这些接口需要 16 位用户 ID。当使用 32 位用户 ID 时,这些接口将返回错误结果。


4,如何创建数据库用户:

使用 SQL Server Management Studio 创建数据库用户
在 SQL Server Management Studio 中,打开对象资源管理器,然后展开“数据库”文件夹。

展开要在其中创建新数据库用户的数据库。

右键单击“安全性”文件夹,指向“新建”,再单击“用户”。

在“常规”页的“用户名”框中输入新用户的名称。

在“登录名”框中,输入要映射到数据库用户的 SQL Server 登录名的名称。

单击“确定”。 

使用 Transact-SQL 创建数据库用户
在查询编辑器中,通过执行以下 Transact-SQL 命令连接至要在其中创建新数据库用户的数据库:
USE <database name> 
GO
通过执行以下 Transact-SQL 命令创建用户:
CREATE USER <new user name> FOR LOGIN <login name> ;
GO

5,如何创建 SQL Server 登录名:

创建使用 Windows 身份验证 (SQL Server Management Studio) 的 SQL Server 登录名
在 SQL Server Management Studio 中,打开对象资源管理器并展开要在其中创建新登录名的服务器实例的文件夹。

右键单击“安全性”文件夹,指向“新建”,然后单击“登录名”。

在“常规”页上的“登录名”框中输入一个 Windows 用户名。

选择“Windows 身份验证”。

单击“确定”。 

创建使用 SQL Server 身份验证 (SQL Server Management Studio) 的 SQL Server 登录名
在 SQL Server Management Studio 中,打开对象资源管理器并展开要在其中创建新登录名的服务器实例的文件夹。

右键单击“安全性”文件夹,指向“新建”,然后单击“登录名”。

在“常规”页上的“登录名”框中输入一个新登录名的名称。

选择“SQL Server 身份验证”。Windows 身份验证是更安全的选择。

输入登录名的密码。

选择应当应用于新登录名的密码策略选项。通常,强制密码策略是更安全的选择。

单击“确定”。 

通过 Transact-SQL 创建使用 Windows 身份验证的 SQL Server 登录名
在查询编辑器中,输入以下 Transact-SQL 命令:
CREATE LOGIN <name of Windows User> FROM WINDOWS;
GO 

通过 Transact-SQL 创建使用 SQL Server 身份验证的 SQL Server 登录名
在查询编辑器中,输入以下 Transact-SQL 命令:
CREATE LOGIN <login name> WITH PASSWORD = '<password>' ; 
GO

6,服务器级角色:


为便于管理服务