扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:ccidnet 来源:database.ccidnet.com 2007年8月31日
关键字: 安全 微软 数据库 SQL Server
首先,你必须遵守的SQL Server标准化规则
什么是标准化?
标准化就是涉及数据模型,以便有效地在数据库中存储数据。最终结果就是消除了冗余数据,只有与属性相关的数据被存储在表中。
例如,我们要为客户在同一个表中存储城市、州和邮政编码数据,其他客户也有同样的数据。通过这种方式,我们就会为在同一个城市的所有客户重复输入相同的城市、州,以及邮政编码数据。为了不一次又一次地存储同样的数据,我们应该将数据标准化,然后创建一个名为city的相关表。City这个表用来存储城市、州、邮政编码,以及ID号,这个ID号与客户表中的ID号相关,这样我们就可以删除客户表中的三个列,然后只添加一个新的ID列。
标准化规则分解为几种形式。当谈论到数据库设计的时候,人们经常倾向于使用第三范式(3NF)。这是大多数数据库设计人员想要得到的:在概念阶段,数据是分段的,并且尽可能的标准化,但是为了实用的目的,这些分段在数据模型的修改中发生变化。可以在数据模型的不同部分引入各种范式来处理你可能面对的独特的情况。
无论你是否听说过标准化,你的数据库都会遵循一些规则,除非你所有的数据都是存储在一个庞大的表中。下面我们看一下三个范式中的第一范式,以及决定不同范式的规则。
第一范式的规则(1NF)
消除重复的组。下面这个表在软件列中包含了重复的数据组。
Computer Software
1 Word
2 Access, Word, Excel
3 Word, Excel
为了遵循第一范式,我们在每个记录中只存储了一种软件类型。
Computer Software
1 Word
2 Access
2 Word
3 Excel
3 Word
3 Excel
第二范式的规则
消除第一范式中的冗余数据。下面这个表包含了冗余的软件名字。
Computer Software
1 Word
2 Access
2 Word
3 Excel
3 Word
3 Excel
为了消除存储的冗余数据,我们创建了两个表。第一个表存储参考SoftwareID ,指向新表中惟一的软件名称。
Computer SoftwareID
1 1
2 2
2 1
3 3
3 1
3 3
SoftwareID Software
1 Word
2 Access
3 Excel
第三范式的规则
消除第一、第二范式中不依赖于键值的列。在这个表中,同时含有有关计算机和用户的数据。
Computer User Name User Hire Date Purchased
1 Joe 4/1/2000 5/1/2003
2 Mike 9/5/2003 6/15/2004
为了消除不依赖于键的列,我们创建了以下的表。现在,存储在computer表中的数据只与计算机相关,存储在user表中的数据只与用户相关。
Computer Purchased
1 5/1/2003
2 6/15/2004
User User Name User Hire Date
1 Joe 5/1/2003
2 Mike 6/15/2004
User User Name User Hire Date
1 Joe 5/1/2003
2 Mike 6/15/2004
SQL Server标准化必须要做什么?
说实话,答案是没有。SQL Server,与其他的关系型数据库管理系统一样,毫不关心你的数据模型是否遵循任何一个范式。你可以创建一个表,所有数据都存储在一个表里面,或者你也可以创建许多个小的,没有关系的表来存储数据。SQL Server支持你决定做的任何事情。你可能遇到的惟一的一个限制因素就是SQL Server在一个表内支持的最大列数。
SQL Server没有强迫或者加强任何你以任何一种范式创建数据库方面的规则。你可以混和并匹配你需要的任何规则,但是尽可能地在你设计数据库的时候就将其标准是一个好主意。人们倾向于花费大量时间创建一个标准化的数据模型,但是一旦需要添加新的列或者表的时候,他们就会忘记最初在努力创建一个优美的干净的模型方面所做的努力。
为了辅助数据模型的设计,你可以使用SQL Server企业管理器中自带的DaVinci 工具。
标准化优点:
1、 更小的数据库:消除了重复的数据之后,你可以缩减数据库的整体规模。
2、 更好的性能。
A、 缩小的表:拥有更加调整良好的表可以让你的表拥有较少的列,并且在每个数据页中装载更多的记录。
B、 每个表拥有更少的索引意味着更快的维护任务,例如索引的重建。
C、 只在需要的时候进行表连接。
标准化的缺点:
1、 需要连接的表更多:通过将你的数据散布到更多的表中,增加了连接表的需求。
2、 表中包含更多的代码,而不是数据:重复的数据以代码的形式存储,而不是有意义的数据。因此,总是需要查看表中的数值。
3、 数据模型查询困难:数据模型为了应用程序而进行优化,而不是为了特别的查询。
总结
你的数据模型设计同样是艺术的和科学的。最好地平衡两者以支持将要使用数据库的应用程序,并且以有效的和结构化的方式存储数据。对于基于事务的系统,高度标准化的数据库设计是必经之路;它确保了整个数据库中数据的一致性,并且能很好的运行。对于基于报告的系统,标准化程度较低的数据库通常是最好的方式。你可以消除连接许多个表的需求,并且查询也更快了。另外,数据库对于特别的报告需求也会用户友好得多。
SQL Server用户安全清单
作为数据库管理员,安全一般来说不是最基本的问题。连通性和可用性是更直接一些的关注点,但是如果你不想让你的安全管理员对你大发雷霆,那么安全就应该添加到考虑范围之内。下面是SearchSecurity.com 的编辑Mike Chapple 推荐给安全管理员锁定SQL Server时使用的清单;它同样也可以被数据库管理员纳入考虑范围。
-------------------------------------------------------------------------------
以下是你今天就可以执行的4个动作,能够帮助你确保SQL Server安全:
限制数据库管理员的数量。这是一个常识性的规则,但是经常被违反。确保只有需要管理权力(并且知道怎么去使用这个权力!)的一个人具有数据库管理员权限。SQL Server与Windows的紧密耦合使得数据库管理员权力被想当然地释放给所有的域管理员。这是一个严重的错误。
应用最小权限规则。确保具有管理权限(和用户级别访问权限,实际上)只拥有最小的必要的权限子集来执行他们的工作任务。
避免将密码硬编码,这就像一场灾难。数据库开发人员喜欢在他们的程序中将密码硬编码,因为这种方式非常简单。不要让他们那么做!使用SQL Server的集成认证模式来约束Windows的安全,或者强迫用户自己到数据库上去认证。如果你听到了下面这句话,“我们没法改变密码或者XYZ被破解了,”那么你可以认为自己看到了一面大红旗在面前飘荡!
利用角色。SQL Server提供了一些预先定义的用户角色,它们具有一些特定的管理权限。你还可以为你的特定环境需求创建定制的角色。在你的数据库上分配权限给这些角色,然后根据人们工作职责的变化从这些角色中添加和删除用户/群。这有利于非常严格的安全环境,并且允许你对访问权限控制的记录。
我们的安全检查列表:
1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一下。
2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异种的环境中使用。
3. 给 "sa" 和 "probe" 帐户设定强壮的密码来加强其安全性。设定一个强壮的密码并将其保存在一个安全的地方。 注意: probe帐户被用来进行性能分析和分发传输。 当在标准的安全模态中用的时候 , 给这个帐户设定高强度的密码能影响某些功能的使用。
4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。 这个帐户应该有最小的权利 ( 注意作为一个服务运行的权利是必须的)和应该包含( 但不停止)在妥协的情况下对服务器的攻击。 注意当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的 ACLs同时被处理。
5. 确定所有的 SQL 服务器数据,而且系统文件是装置在 NTFS 分区,且appropraite ACLs 被应用。 如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。
6.如果不使用Xp_cmdshell就关掉。 如果使用 SQL 6.5, 至少使用Server Options中的SQLExecutieCmdExec 账户操作限制非sa用户使用XP_cmdshell.
在任何的 isql/ osql 窗口中( 或查询分析器):
use master
exec sp_dropextendedproc'xp_cmdshell'
如果你不需要 xp_cmdshell 那请停用它。请记住一个系统系统管理员如果需要的话总是能把它增加回来。这也好也不好 - 一个侵入者可能发现它不在,只需要把他加回来。考虑也除去在下面的 dll但是移除之前必须测试因为有些dll同时被一些程序所用。 要找到其他的程序是否使用相同的 dll:
首先得到该 dll 。
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name='xp_cmdshell'
其次,使用相同的 dll发现其他的扩展储存操作是否使用该dll。
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text='xplog70.dll'
用户可以用同样的办法处理下面步骤中其他你想去掉的进程。
7. 如不需要就停用对象连接与嵌入自动化储存程序 ( 警告 - 当这些储存程序被停用的时候 , 一些企业管理器功能可能丢失). 这些包括:
Sp_OACreate
Sp_OADestroy
Sp_OAGetErrorInfo
Sp_OAGetProperty
Sp_OAMethod
Sp_OASetProperty
Sp_OAStop
如果你决定停用该进程那么请给他们写一个脚本这样在以后你用到他们的时候你能够把他们重新添加回来 。 记住, 我们在这里正在做的是锁定一个应用程序的功能 - 你的开发平台应该放到其他机器上。
8. 禁用你不需要的注册表存取程序。(同上面的警告)这些包括:
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regremovemultistring
注意 :我过去一直在这里列出 xp_regread/ xp_regwrite但是这些程序的移除影响一些主要功能包括日志和SP的安装,所以他们的移除不被推荐。
9.移除其他你认为会造成威胁的系统储存进程。 这种进程是相当多的,而且他们也会浪费一些cpu时间。 小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试,确认这样不会影响到任何的系统功能。在下面是我们所推荐的有待你评估的一些列表:
sp_sdidebug
xp_availablemedia
xp_cmdshell
xp_deletemail
xp_dirtree
xp_dropwebtask
xp_dsninfo
xp_enumdsn
xp_enumerrorlogs
xp_enumgroups
xp_enumqueuedtasks
xp_eventlog
xp_findnextmsg
xp_fixeddrives
xp_getfiledetails
xp_getnetname
xp_grantlogin
xp_logevent
xp_loginconfig
xp_logininfo
xp_makewebtask
xp_msver xp_perfend
xp_perfmonitor
xp_perfsample
xp_perfstart
xp_readerrorlog
xp_readmail
xp_revokelogin
xp_runwebtask
xp_schedulersignal
xp_sendmail
xp_servicecontrol
xp_snmp_getstate
xp_snmp_raisetrap
xp_sprintf
xp_sqlinventory
xp_sqlregister
xp_sqltrace
xp_sscanf
xp_startmail
xp_stopmail
xp_subdirs
xp_unc_to_drive
xp_dirtree
10. 在企业管理器中"安全选项" 之下禁用默认登录。(只有SQL 6.5) 当使用整合的安全时候,这使未经认可的不在 syslogins 表中使用者无权登陆一个有效的数据库服务器。
11. 除去数据库的guest账户把未经认可的使用者据之在外。 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。
12. 若非必须,请完全地禁用SQL邮件功能。它的存在使潜在的攻击者递送潜在的 trojans ,病毒或是简单实现一个DOS攻击成为可能
13. 检查master..Sp_helpstartup看有无可疑的木马进程。 确定没有人已经在这里放置秘密的后门程序。 使用 Sp_unmakestartup 移除任何可疑进程。
14. 检查master..Sp_password看有无trojan代码。比较你的产品scripts和一个新安装的系统的默认scripts而且方便的保存。
15. 记录所有的用户存取访问情况。 从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项:
xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\ Microsoft\MSSQLServer\MSSQLServer',N'AuditLevel',REG_DWORD,3
16. 重写应用程序使用更多用户定义的储存和察看进程所以一般的对表的访问可以被禁用。 在这里你也应该看到由于不必经常进行查询计划操作而带来的性能提升。
17. 除去不需要的网络协议。
18. 注意SQL 服务器的物理安全。把它锁在固定的房间里,并且注意钥匙的安全。只要有机会到服务器面前,就总是会找到一个方法进入。
19. 建立一个计划的任务运行:
findstr/C:" Login Failed"\mssql7\log\*.*'
然后再重定向输出到一个文本文件或电子邮件,因此你监测失败的登录尝试。这也为系统管理员提供一个好的记录攻击的方法。 也有很多用来分析NT日志事件的第三者工具。 注意: 你可能需要将路径换成你安装SQL的路径。
20. 设定非法访问和登陆失败日志警报。到 企业管理器中的"Manager SQL Server Messages "搜寻任何有关无权访问的消息 ( 从查找"login failed"和"denied"开始). 确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 , 发送一个电子邮件或信息到一个能够对问题及时响应的操作员。
21. 确定在服务器和数据库层次上的角色都只被授给了需要的用户。 当 SQL Server 安全模型 7 有许多增强的时候, 它也增加额外的许可层,我们必须监控该层,确定没有人被授予了超过必需的权限。
22. 经常检查组或角色全体会员并且确定用组分配权限,这样你的审计工作能够简化。 确定当你在的时候 , 公众的组不能从系统表执行选择操作。
23. 花些时间审计用空密码登陆的请求。 使用下面的代码进行空密码检查:
使用主体
选择名字,
password
from syslogins
where password is null
order by name
24. 如果可能,在你的组织中利用整合的安全策略。 通过使用整合的安全策略,你能够依赖系统的安全,最大简化管理工作从维护二个分开的安全模型中分离开来。这也不让密码接近连接字串。
25. 检查所有非sa用户的存取进程和扩充存储进程的权限。 使用下面的查询定期的查询哪一个进程有公众存储权限。(在SQL Server中 使用 "type" 而不是 "xtype"):
Use master
select sysobjects.name
from sysobjects,sysprotects
where sysprotects.uid=0
AND xtype 在 ('X','P')
AND sysobjects.id=sysprotects.id
Order by name
26. 当时用企业管理器的时候,使用整合的安全策略。 过去,企业管理器被发现在标准的安全模态中储存 "sa" 密码在注册表的 plaintext 中。 注意: 即使你改变模态,密码也会留在注册表中。 使用 regedit 而且检查键:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\
MSSQLServer\SQLEW\ Regedi\
SQL 6.5
现在数据被隐藏在
HKEY_USERS\{yourSID}\software\Microsoft\Microsoft SQL server\80\tool\SQLEW\registered server X\SQL server group
("SQL server组" 是默认值但是你可能已建立用户组因此相应地改变其位置)
27. 发展一个审核计划而且订定每月的安全报告,对IT主管可用的报表包括任何的新exploit,成功的攻击 , 备份保护 , 和对象存取失败统计。
28. 不要允许使用者交互式登陆到 SQL Server之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。
30. 尽力限制对SQL Server的查询与存取操作。 用户可以用最小权限查询sql server中的很多东西。若非必须不要给他们机会。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者