关于数据库安全性和保护的一些知识
SQL code1,用户:数据库用户是数据库级别上的主体。每个数据库用户都是 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 或早期版本创建的数据和应用程序时,应检查代码是否引用了以下不推荐使用的接口。sysuserssyscacheobjectssysmemberssysobjectssyspermissionssysprocessessysprotectssystypesUSER_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> ;GO5,如何创建 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>' ; GO6,服务器级角色:为便于管理服务器上的权限,SQL Server 提供了若干“角色”,这些角色是用于分组其他主体的安全主体。“角色”类似于 Microsoft Windows 操作系统中的“组”。服务器级角色也称为“固定服务器角色”,因为您不能创建新的服务器级角色。服务器级角色的权限作用域为服务器范围。您可以向服务器级角色中添加 SQL Server 登录名、Windows 帐户和 Windows 组。固定服务器角色的每个成员都可以向其所属角色添加其他登录名。下表显示了服务器级角色及其能够执行的操作。服务器级角色名称 说明 sysadmin sysadmin 固定服务器角色的成员可以在服务器上执行任何活动。默认情况下,Windows BUILTIN\Administrators 组(本 地管理员组)的所有成员都是 sysadmin 固定服务器角色的成员。 serveradmin serveradmin 固定服务器角色的成员可以更改服务器范围的配置选项和关闭服务器。 securityadmin securityadmin 固定服务器角色的成员可以管理登录名及其属性。他们可以 GRANT、DENY 和 REVOKE 服务器级别的权限。 他们还可以 GRANT、DENY 和 REVOKE 数据库级别的权限。此外,他们还可以重置 SQL Server 登录名的密码。 processadmin processadmin 固定服务器角色的成员可以终止在SQL Server 实例中运行的进程。 setupadmin setupadmin 固定服务器角色的成员可以添加和删除链接服务器。 bulkadmin bulkadmin 固定服务器角色的成员可以运行 BULK INSERT 语句。 diskadmin diskadmin 固定服务器角色用于管理磁盘文件。 dbcreator dbcreator 固定服务器角色的成员可以创建、更改、删除和还原任何数据库。 7,数据库级别的角色:为便于管理数据库中的权限,SQL Server 提供了若干“角色”,这些角色是用于分组其他主体的安全主体。它们类似于 Microsoft Windows 操作系统中的组。数据库级角色的权限作用域为数据库范围。SQL Server 中有两种类型的数据库级角色:数据库中预定义的“固定数据库角色”和您可以创建的“灵活数据库角色”。固定数据库角色是在数据库级别定义的,并且存在于每个数据库中。db_owner 和 db_securityadmin 数据库角色的成员可以管理固定数据库角色成员身份。但是,只有 db_owner 数据库角色的成员能够向 db_owner 固定数据库角色中添加成员。msdb 数据库中还有一些特殊用途的固定数据库角色。您可以向数据库级角色中添加任何数据库帐户和其他 SQL Server 角色。固定数据库角色的每个成员都可向同一个角色添加其他登录名。重要提示: 请不要将灵活数据库角色添加为固定角色的成员。这会导致意外的权限升级。 下表显示了固定数据库级角色及其能够执行的操作。所有数据库中都有这些角色。数据库级别的角色名称 说明 db_owner db_owner 固定数据库角色的成员可以执行数据库的所有配置和维护活动,还可以删除数据库。 db_securityadmin db_securityadmin 固定数据库角色的成员可以修改角色成员身份和管理权限。向此角色中添加主体可能会导致意外的 权限升级。 db_accessadmin db_accessadmin 固定数据库角色的成员可以为 Windows 登录名、Windows 组和 SQL Server 登录名添加或删除数据 库访问权限。 db_backupoperator db_backupoperator 固定数据库角色的成员可以备份数据库。 db_ddladmin db_ddladmin 固定数据库角色的成员可以在数据库中运行任何数据定义语言 (DDL) 命令。 db_datawriter db_datawriter 固定数据库角色的成员可以在所有用户表中添加、删除或更改数据。 db_datareader db_datareader 固定数据库角色的成员可以从所有用户表中读取所有数据。 db_denydatawriter db_denydatawriter 固定数据库角色的成员不能添加、修改或删除数据库内用户表中的任何数据。 db_denydatareader db_denydatareader 固定数据库角色的成员不能读取数据库内用户表中的任何数据。 msdb 角色msdb 数据库中包含下表显示的特殊用途的角色。msdb 角色名称 说明 db_ssisadmin db_ssisoperator db_ssisltduser 这些数据库角色的成员可以管理和使用 SSIS。从早期版本升级的 SQL Server 实例可能包含使用 Data Transformation Services (DTS)(而不是 SSIS)命名的旧版本角色。有关详细信息,请参阅 使用 Integration Services 角色。 dc_admin dc_operator dc_proxy 这些数据库角色的成员可以管理和使用数据收集器。有关详细信息,请参阅数据收集器的安全性。 PolicyAdministratorRole db_ PolicyAdministratorRole 数据库角色的成员可以对基于策略的管理策略和条件执行所有配置和维护活动。有关详细信息,请参阅使用基于策略的管理来管理服务器。 ServerGroupAdministratorRole ServerGroupReaderRole 这些数据库角色的成员可以管理和使用注册的服务器组。有关详细信息,请参阅创建服务器组。 使用服务器级角色下表说明了用于服务器级角色的命令、视图和函数。功能 类型 说明 sp_helpdbfixedrole 元数据 返回固定数据库角色的列表。 sp_dbfixedrolepermission 元数据 显示固定数据库角色的权限。 sp_helprole 元数据 返回当前数据库中有关角色的信息。 sp_helprolemember 元数据 返回有关当前数据库中某个角色的成员的信息。 sys.database_role_members 元数据 为每个数据库角色的每个成员返回一行。 IS_MEMBER 元数据 指示当前用户是否为指定 Microsoft Windows 组或 Microsoft SQL Server 数据库角色的成员。 CREATE ROLE命令 在当前数据库中创建新的数据库角色。 ALTER ROLE命令 更改数据库角色的名称。 DROP ROLE命令 从数据库中删除角色。 sp_addrole命令 在当前数据库中创建新的数据库角色。 sp_droprole命令 从当前数据库中删除数据库角色。 sp_addrolemember命令 为当前数据库中的数据库角色添加数据库用户、数据库角色、Windows 登录名或 Windows 组。 sp_droprolemember命令 从当前数据库的 SQL Server 角色中删除安全帐户。 public 数据库角色每个数据库用户都属于 public 数据库角色。如果未向某个用户授予或拒绝对安全对象的特定权限时,该用户将继承授予该对象的 public 角色的权限。