在访问sql server 2008的过程当中,大体验证流程以下图:sql
当登陆操做一个数据库的时候,会通过三次验证:shell
1. 操做系统的验证 2. SQL SERVER登陆名的验证 3. 数据库用户名的验证
当使用windows身份认证模式的时候,使用的windows帐号会经过操做系统的验证,而后以sysadmin的服务器角色经过SQL SERVER 的验证,在访问一个具体的数据库的时候又以其映射的dbo用户名登陆相应的数据库。数据库
当使用SQL SERVER 身份认证模式的时候,首先会使用相似于IIS中的匿名帐号来经过windows验证,而后以其对应的服务器角色来经过SQL SERVER 的验证,在访问一个具体数据库的时候以其映射的数据库用户名来登陆相应的数据库。windows
操做系统层面:在windows方式验证的过程当中,由所使用的windows帐号。使用sql帐号验证的时候,应该是使用了一个相似于iis中的匿名帐号来经过windows验证的。安全
SQL SERVER 层面:由sql server的登陆用户的权限来控制,具体的权限由对应的服务器角色来决定。服务器
(SA是SQL SERVER的一个登陆用户名,而不是数据库的用户名)网站
数据库层面:由数据库的用户名的权限来控制,具体能够经过选择不一样的数据库角色或者自定义权限来实现。spa
(SQL SERVER的登陆用户名SA经过映射数据库的用户名来访问数据库内容 )操作系统
因此在SQL SERVER 中,对权限起决定性做用的就是服务器登陆名角色和数据库用户名角色。.net
固定服务器角色
(登陆SQL SERVER登陆用户的权限角色,如SA默认拥有sysadmin角色权限)
Dbcreator: 这个服务器角色的成员能够建立、更改、删除和还原任何数据库。 Diskadmin: 这个服务器角色用于管理磁盘文件,好比镜像数据库和添加备份设备。Processadmin:SQL Server 2008可以多任务化,也就是说能够经过执行多个进程作多个事件。 Securityadmin:这个服务器角色的成员将管理登陆名及其属性。他们能够受权、拒绝和撤销服务器级权限。也能够受权、拒绝和撤销数据库级权限。另外,它们能够重置SQL Server 2008登陆名的密码。 Serveradmin: 这个服务器角色的成员能够更改服务器范围的配置选项和关闭服务器。Setupadmin:为须要管理连接服务器和控制启动的存储过程的用户而设计。这个角色的成员能添加到setupadmin,能增长、删除和配置连接服务器,并能控制启动过程。 Sysadmin: 这个服务器角色的成员有权在SQL Server 2008中执行任何任务。 Public: 有两大特色,第一,初始状态时没有权限;第二,全部的数据库用户都是它的成员。 固定数据库角色:(数据库用户权限) 微软提供了9个内置的角色,以便于在数据库级别授予用户特殊的权限集合。 db_owner: 该角色的用户能够在数据库中执行任何操做。 db_accessadmin: 该角色的成员能够从数据库中增长或者删除用户。 db_backupopperator: 该角色的成员容许备份数据库。 db_datareader: 该角色的成员容许从任何表读取任何数据。 db_datawriter: 该角色的成员容许往任何表写入数据。 db_ddladmin:该角色的成员容许在数据库中增长、修改或者删除任何对象(便可以执行任何DDL语句)。 db_denydatareader: 该角色的成员被拒绝查看数据库中的任何数据,可是他们仍然能够经过存储过程来查看。 db_denydatawriter: 像db_denydatareader角色,该角色的成员被拒绝修改数据库中的任何数据,可是他们仍然能够经过存储过程来修改。 db_securityadmin: 该角色的成员能够更改数据库中的权限和角色。 public:在SQL Server 2008中每一个数据库用户都属于public数据库角色。当还没有对某个用户授予或者拒绝对安全对象的特定权限时,这该用户将据称授予该安全对象的public角色的权限,这个数据库角色不能被删除。
通常能够经过安全策略里面的ipsec或者windows防火墙来限制。
能够在SQL SERVER 配置管理器修改访问端口为不常见端口来防止通常性扫描
将登陆审核修改成“开启登陆成功和失败的日志”,这样方便数据库被入侵以后,对日志的查看。
如使用混合身份验证模式,建议禁用掉SA帐户,不然设置很是强的SA密码。
对于每个网站新建一个登录用户并关联一个数据库用户,设置强密码,给予服务器角色为:PUBLIC,给予对应的数据库角色为:db_owner(需更加安全的保护对应数据库的数据须要调节更加严格的权限,此处给予的为此数据库的最高权限,若此帐号泄露,此数据库中的数据不保,配合后续配置不影响服务器安全)
数据库须要往磁盘写文件,或者经过存储过程执行命令的权限由数据库服务器的运行帐户权限决定,使用NETWORK SERVICE帐户来运行数据库服务器是较安全的。
合理配置数据库运行,帐户在磁盘上的权限,必定不要随意给写权限,特别是网站目录及数据库存储目录之外的位置,这样即便是SA也不能往磁盘写文件。
因为在sql server 2008中sp_dropextendedproc 不能删除系统扩展存储过程,因此直接禁用常见危险存储过程。具体可根据实际状况来操做,由于有些存储过程是正常须要的。对于通常帐户而言,根本没有执行这些高危存储过程的权限,而对于SA帐户来讲,以上全部的操做都是可恢复的,我的以为SA帐户被入侵以后的关键控制点在于合理配置数据库服务运行帐号的权限。
zhangsan认为,升级吧!
若是网站被入侵(相似SQL注入),很显然其对应的帐号的数据库的数据确定是不保了。普通帐号(只给PUBLIC的帐户)是没法执行系统命令的,可能的方式是经过备份数据库来达到写马的操做,防护的最好方法是严格控制数据库运行帐号对磁盘的写权限
SA帐户被入侵后,通常会经过开启xp_cmdshell存储过程来执行系统命令。可是若是配置的数据库服务运行帐号NETWORK SERVICE,它可以执行的系统命令也就有限了,甚至能够取消NETWORK SERVICE对于cmd.exe的执行权限。还有就是须要合理配置NETWORK SERVICE的磁盘写入权限。
EXEC sp_configure 'show advanced options', 1; go RECONFIGURE; GO EXEC sp_configure 'xp_cmdshell', 1; go RECONFIGURE; GO
exec xp_cmdshell 'whoami'
(若是该存储过程能够执行说明可能已经被入侵)
常见危险存储过程:
xp_cmdshell xp_delete_file xp_regread xp_regwrite xp_dirtree
因为在sql server 2008中sp_dropextendedproc 不会删除系统扩展存储过程,故直接禁用便可
EXEC sp_configure 'show advanced options', 0; EXEC sp_configure 'xp_cmdshell', 0;