1. SQL Server授权概述
SQL Server授权是指SQL Server管理员通过授权用户和角色,使得他们能够访问和操作SQL Server中特定的对象、命令或功能。授权的来源通常是角色或用户账户,而受到授权的对象包括:数据库、表、视图、存储过程、函数和其他数据库对象等。
1.1 角色授权
SQL Server的角色是一组授权的集合,可以将不同的权限分配到不同的角色中。而角色授权的优点在于仅授权给用户特定角色即可访问SQL Server中的多个对象,从而避免了对每一个用户进行授权的繁琐和重复工作。
--创建角色
CREATE ROLE "SalesRole";
--授权角色
GRANT SELECT ON "Sales" TO "SalesRole";
--将角色分配给用户
EXEC sp_addrolemember "SalesRole", "User01";
1.2 用户授权
除了角色授权外,还可通过用户账户完成SQL Server的授权。在SQL Server中,每个用户都有一个唯一的标识符来标识其身份和权限,只有被授权的用户才能访问特定的对象。通过用户授权可以更加具体的授权SQL Server中的特定对象给特定的用户。
--创建用户
CREATE LOGIN "User05" WITH PASSWORD='123456';
--为该用户授权
USE "AdventureWorks2016CTP3";
GRANT SELECT ON "Sales" TO "User05";
2. 数据库安全保障最佳实践
2.1 创建和使用强密码
密码永远是安全的基础。弱密码很容易被猜测甚至被破解,而强密码在长度、大小写字母和符号组合上比较复杂,使得其被破解的难度极大。为了提高数据库安全,我们需要创建和使用强密码。下面是创建和使用强密码的几个最佳实践:
密码长度:密码最好超过10个字符,这样可以有效提高密码的破解难度。
字母和符号:密码最好包含大小写字母、数字、符号等元素。尤其是符号越多,破解难度越大。
不要使用常用密码:例如"password"、"123456"等密码都是很常用的,也是最容易被破解的密码。
2.2 限制权限
限制权限是另一个数据库安全保障的重要实践。在SQL Server中,应该限制对数据的访问、修改、删除等权限,尤其是限制对敏感数据的权限,以避免非授权人员操作或非法操作。
--使用限制语句创建视图
CREATE VIEW "ContactInfo" AS
SELECT "ContactID",
"FirstName",
"MiddleName",
"LastName",
"EmailAddress",
"Phone"
FROM "Person"."Person";
--授权访问视图
GRANT SELECT ON "ContactInfo" TO "SalesRole";
2.3 使用加密传输
在传输数据时,需要使用更可靠的方法来保护数据的安全性。加密传输技术可以有效地防止数据泄露或遭到被攻击的风险。SQL Server中常用的加密传输技术有:SSL和TDS加密等。通过网络接口配置文件中的安全套接字层(Secure Sockets Layer,SSL)选项可启用或禁用SSL加密传输。
--启用SSL加密传输
SET SP_CONFIGURE 'network packet size', 4096
GO
RECONFIGURE WITH OVERRIDE
GO
SET SP_CONFIGURE 'remote access', 1
GO
RECONFIGURE
GO
2.4 使用SQL Server身份验证模式
SQL Server通常具有两种身份验证模式,分别是Windows身份验证和SQL Server身份验证。其中,Windows身份验证是SQL Server默认的身份验证模式,可以通过Windows域账户访问SQL Server数据库。而SQL Server身份验证要求用户提供登录名和密码才能访问数据库。在安全性要求高的环境中,建议使用SQL Server身份验证方式来提高SQL Server的安全级别。
--创建SQL Server身份验证的用户账户
USE "master";
CREATE LOGIN "User06" WITH PASSWORD='123456';
CREATE USER "User06" FOR "User06";
GRANT SELECT ON "Sales" TO "User06";
2.5 定期备份和恢复
数据备份和恢复是数据安全的最后防线。数据库的备份应该定期进行,并且多备份几份,以防止备份丢失。同时,应该进行测试恢复,测试恢复可发现潜在问题。
--备份数据库
BACKUP DATABASE "AdventureWorks2016CTP3"
TO DISK = 'E:\SQLServerBackups\AdventureWorks2016CTP3.bak'
WITH INIT;
--还原数据库
RESTORE DATABASE "AdventureWorks2016CTP3"
FROM DISK = 'E:\SQLServerBackups\AdventureWorks2016CTP3.bak'
WITH NORECOVERY;