客户机安全机制网络传输级别安全实例级别安全数据库级别安全数据库对象级别安全
这些层级由高到低,所有的层级之间相互联系,用户只有通过了高一层级的安全验证,才能继续访问数据库中低一层级的内容。
数据库管理系统需要运行在某一特定的操作系统平台下,客户机操作系统的安全性直接影响到SQLServer2019的安全性。在用户使用客户计算机通过网络访问SQLServer2019服务器时,用户首先要获得客户计算机操作系统的使用权限。保证操作系统的安全性是操作系统管理员或网络管理员的任务。由于SQLServer2019采用了集成WindowsNT网络安全性机制,因此提高了操作系统的安全性,但与此同时也加大了管理数据库系统安全的难度。
SQLServer2019对关键数据进行了加密,即使攻击者通过了防火墙和服务器上的操作系统到达了数据库,还要对数据进行破解。SQLServer2019有两种对数据加密的方式:数据加密和备份加密。数据加密:可以执行所有的数据库级别的加密操作,省去了应用程序开发人员创建定制的代码来实现数据的加密和解密的开发工作。数据在写到磁盘时进行加密,从磁盘读的时候解密。使用SQLServer来管理加密和解密,可以保护数据库中的数据。备份加密:对备份进行加密可以防止数据泄露和被篡改。
对象安全性检查时,数据库管理系统的最后一个安全等级。创建数据库对象时,SQLServer2019将自动把该数据库对象的用户权限赋予该对象的所有者,对象的所有者可以实现该对象的安全控制。数据库对象访问权限定义了用户对数据库中数据对象的引用、数据操作语句的许可权限,这通过定义对象和语句的许可权限来实现。
数据库所有者(DBO)是数据库的创建者,每个数据库只有一个数据库所有者。DBO有数据库中的所有特权,可以提供给其他用户访问权限。
数据库对象包含数据表、索引、视图、触发器、规则和存储过程,创建数据库对象的用户是数据库对象的所有者,数据库对象的所有者可以授予其他用户访问其拥有的数据库对象的权限。
最高权限的数据库用户
可以进行数据库的一切操作
使用许可可以增强SQLServer数据库的安全性,SQLServer许可系统指定哪些用户被授予使用哪些数据库对象的操作,指定许可的能力由每个用户的状态(系统管理员、数据库所有者或者数据库对象所有者)决定。
域是一组计算机的集合,它们可以共享一个通用的安全数据库。
4个访问级别:网络/操作系统、SQLServer服务器、数据库、数据库对象
角色中包含了SQLServer2019预定义的一些特殊权限,可以将角色分别授予不同的主体。使用角色可以提供有效而复杂的安全模型,以及管理可保护对象的访问权限。SQLServer2019中包含4类不同的角色,分别是:固定服务器角色、固定数据库角色、用户自定义数据库角色和应用程序角色。
SQLServer支持2种身份验证模式:
Windows验证模式:基于Windows的安全模式身份验证
混合验证模式:使用账号+密码的方式进行验证
注意:创建用户时(或后)需要为用户分配角色和基本的权限
实例:
CREATELOGINpanda_testWITHPASSWORD='987963'MUST_CHANGE,CHECK_EXPIRATION=ON,CHECK_POLICY=ON;实例:
CREATELOGIN[用户名]FROMWINDOWS[WITHDEFALUT_DATABASE=database|DEFALUT_LANGUAGE=language]实例1:
CREATELOGIN[MT-CC1\SQLUSERNAME]FROMWINDOWS;实例2:
实例:创建数据库账户
固定服务器角色、数据库角色、自定义数据库角色、应用程序角色
注意:服务器角色的权限范围是整个服务器。
固定服务器角色列表:
数据库角色是针对某个具体数据库的权限分配,数据库用户可以作为数据库角色的成员,继承数据库角色的权限,数据库管理人员也可以通过管理角色的权限来管理数据库用户的权限。
实际的数据库管理过程中,某些用户可能只对数据库进行插入、更新和删除的操作,但是固定数据库角色中不能提供这样一个角色,因此,需要创建一个自定义的数据库角色。
定义应用程序角色
CREATEAPPLICATIONROLE应用程序角色WITHPASSWORD='password',[DEFAULT_SCHEMA=schema_name];实例:
sp_setapprole'应用程序角色名','';注意:需要激活应用程序角色后才可以使用实例:
DROPAPPLICATIONROLE应用程序角色名;实例:
GRANT语句用来对用户授予权限,DENY语句用于防止主体通过GRANT获得特定权限,REVOKE语句用于删除已授予的权限。默认状态下,只有sysadmin、dbcreater、db_owner、db_securityadmin等成员有权执行数据控制语言。
在数据库中添加一个新用户之后,该用户可以查询系统表的权限,而不具有操作数据库对象的任何权限。GRANT语句可以授予对数据库对象的操作权限,这些数据库对象包括数据表、视图、存储过程、聚合函数等,允许执行的权限包括查询、更新、删除等。
GRANT[ALL|指定权限][ON表|数据库对象]TO用户名,...[WITHGRANTOPTION];注意:WITHGRANTOPTION表示该用户可以将自有的权限赋予别人
注意:使用ALL参数相当于授予以下权限:如果安全对象为数据库,则ALL表示BACKUPDATABASE、BACKUPLOG、CREATEDATABASE、CREATEDEFAULT、CREATEFUNCTION、CREATEPROCEDURE、CREATERULE、CREATETABLE和CREATEVIEW。如果安全对象为标量函数,则ALL表示EXECUTE和REFERENCES。如果安全对象为表值函数,则ALL表示DELETE、INSERT、REFERENCES、SELECT和UPDATE。如果安全对象是存储过程,则ALL表示EXECUTE。如果安全对象为表,则ALL表示DELETE、INSERT、REFERENCES、SELECT和UPDATE。如果安全对象为视图,则ALL表示DELETE、INSERT、REFERENCES、SELECT和UPDATE。
实例:将Mary存储过程的EXECUTE权限授予pr_Names
GRANTUPDATE,DELETEONstu_infoTOguestWITHGRANTOPTION;实例:向Monitor角色授予对test数据库中stu_info表的SELECT、INSERT、UPDATE和DELETE权限
GRANTSELECT,INSERT,UPDATE,DELETEONtuinfoTOMonitor实例:
拒绝权限出于安全性的考虑,可能不太希望让一些人来查看特定的表,此时可以使用DENY语句来禁止对指定数据表的查询操作,数据库管理员可以用DENY语句来禁止某个用户对指定对象的访问。即限制该用户对指定对象的所有访问权限。
DENY[ALL|其他权限][ON表|其他数据库对象]TO用户名CASCADE;实例:禁止guest用户对stu_info数据表的操作更新
DENYUPDATEONstuinfoToguestCASCADE;实例:拒绝授予guest用户对test_db数据库中stu_info表的INSERT和DELETE权限
DENYINSERT,DELETEONstuinfoTOguest回收权限既然可以授予用户权限,同样可以收回用户的权限,例如收回用户的查询、更新或者删除权限。REVOKE语句用于删除已授予的权限。
REVOKE[ALL|其他权限][ON表]FROM用户名;实例:收回guest用户对stu_info数据表的删除权限
REVOKEDELETEONstuinfoFROMguest;实例:撤销Monitor角色对test_db数据库中stu_info表的DELETE权限
REVOKEDELETEONOBJECT::stu_infoFROMMonitorCASCADE权限分配技巧对角色分配权限而不是直接分配权限将权限分配给角色,而不是指定的账户。基于角色管理权限比直接操作权限便于日后维护。
为了减少管理的开销,在对象级安全管理上应该在大多数场合赋予数据库用户以广泛的权限,然后再针对实际情况在某些敏感的数据上实施具体的访问权限限制。
TransparentDataEncryption(TDE)solutionAlwaysEncrpytedsolution
注意:开启加密方案后,记得在connectionString上加上EncryptionSetting=Enabled;