首先你必須遵守的SQL Server標准化規則
.什麼是標准化?
標准化就是涉及數據模型以便有效地在數據庫中存儲數據最終結果就是消除了冗余數據只有與屬性相關的數據被存儲在表中
例如我們要為客戶在同一個表中存儲城市州和郵政編碼數據其他客戶也有同樣的數據通過這種方式我們就會為在同一個城市的所有客戶重復輸入相同的城市州以及郵政編碼數據為了不一次又一次地存儲同樣的數據我們應該將數據標准化然後創建一個名為city的相關表City這個表用來存儲城市州郵政編碼以及ID號這個ID號與客戶表中的ID號相關這樣我們就可以刪除客戶表中的三個列然後只添加一個新的ID列
標准化規則分解為幾種形式當談論到數據庫設計的時候人們經常傾向於使用第三范式(NF)這是大多數數據庫設計人員想要得到的:在概念階段數據是分段的並且盡可能的標准化但是為了實用的目的這些分段在數據模型的修改中發生變化可以在數據模型的不同部分引入各種范式來處理你可能面對的獨特的情況
無論你是否聽說過標准化你的數據庫都會遵循一些規則除非你所有的數據都是存儲在一個龐大的表中下面我們看一下三個范式中的第一范式以及決定不同范式的規則
◆ 第一范式的規則(NF)
消除重復的組下面這個表在軟件列中包含了重復的數據組
Computer Software
Word
Access Word Excel
Word Excel
為了遵循第一范式我們在每個記錄中只存儲了一種軟件類型
Computer Software
Word
Access
Word
Excel
Word
Excel
◆ 第二范式的規則
消除第一范式中的冗余數據下面這個表包含了冗余的軟件名字
Computer Software
Word
Access
Word
Excel
Word
Excel
為了消除存儲的冗余數據我們創建了兩個表第一個表存儲參考SoftwareID 指向新表中惟一的軟件名稱
Computer SoftwareID
SoftwareID Software
Word
Access
Excel
◆ 第三范式的規則
消除第一第二范式中不依賴於鍵值的列在這個表中同時含有有關計算機和用戶的數據
Computer User Name User Hire Date Purchased
Joe // //
Mike // //
為了消除不依賴於鍵的列我們創建了以下的表現在存儲在computer表中的數據只與計算機相關存儲在user表中的數據只與用戶相關
Computer Purchased
//
//
User User Name User Hire Date
Joe //
Mike //
User User Name User Hire Date
Joe //
Mike //
.SQL Server標准化必須要做什麼?
說實話答案是沒有SQL Server與其他的關系型數據庫管理系統一樣毫不關心你的數據模型是否遵循任何一個范式你可以創建一個表所有數據都存儲在一個表裡面或者你也可以創建許多個小的沒有關系的表來存儲數據SQL Server支持你決定做的任何事情你可能遇到的惟一的一個限制因素就是SQL Server在一個表內支持的最大列數
SQL Server沒有強迫或者加強任何你以任何一種范式創建數據庫方面的規則你可以混和並匹配你需要的任何規則但是盡可能地在你設計數據庫的時候就將其標准是一個好主意人們傾向於花費大量時間創建一個標准化的數據模型但是一旦需要添加新的列或者表的時候他們就會忘記最初在努力創建一個優美的干淨的模型方面所做的努力
為了輔助數據模型的設計你可以使用SQL Server企業管理器中自帶的DaVinci 工具
標准化優點:
更小的數據庫:消除了重復的數據之後你可以縮減數據庫的整體規模
更好的性能
A 縮小的表:擁有更加調整良好的表可以讓你的表擁有較少的列並且在每個數據頁中裝載更多的記錄
B 每個表擁有更少的索引意味著更快的維護任務例如索引的重建
C 只在需要的時候進行表連接
標准化的缺點:
需要連接的表更多:通過將你的數據散布到更多的表中增加了連接表的需求
表中包含更多的代碼而不是數據:重復的數據以代碼的形式存儲而不是有意義的數據因此總是需要查看表中的數值
數據模型查詢困難:數據模型為了應用程序而進行優化而不是為了特別的查詢
總結
你的數據模型設計同樣是藝術的和科學的最好地平衡兩者以支持將要使用數據庫的應用程序並且以有效的和結構化的方式存儲數據對於基於事務的系統高度標准化的數據庫設計是必經之路;它確保了整個數據庫中數據的一致性並且能很好的運行對於基於報告的系統標准化程度較低的數據庫通常是最好的方式你可以消除連接許多個表的需求並且查詢也更快了另外數據庫對於特別的報告需求也會用戶友好得多
SQL Server用戶安全清單
作為數據庫管理員安全一般來說不是最基本的問題連通性和可用性是更直接一些的關注點但是如果你不想讓你的安全管理員對你大發雷霆那麼安全就應該添加到考慮范圍之內下面是SearchSecuritycom 的編輯Mike Chapple 推薦給安全管理員鎖定SQL Server時使用的清單;它同樣也可以被數據庫管理員納入考慮范圍
以下是你今天就可以執行的個動作能夠幫助你確保SQL Server安全:
◆ 限制數據庫管理員的數量這是一個常識性的規則但是經常被違反確保只有需要管理權力(並且知道怎麼去使用這個權力!)的一個人具有數據庫管理員權限SQL Server與Windows的緊密耦合使得數據庫管理員權力被想當然地釋放給所有的域管理員這是一個嚴重的錯誤
◆ 應用最小權限規則確保具有管理權限(和用戶級別訪問權限實際上)只擁有最小的必要的權限子集來執行他們的工作任務
◆ 避免將密碼硬編碼這就像一場災難數據庫開發人員喜歡在他們的程序中將密碼硬編碼因為這種方式非常簡單不要讓他們那麼做!使用SQL Server的集成認證模式來約束Windows的安全或者強迫用戶自己到數據庫上去認證如果你聽到了下面這句話我們沒法改變密碼或者XYZ被破解了那麼你可以認為自己看到了一面大紅旗在面前飄蕩!
◆ 利用角色SQL Server提供了一些預先定義的用戶角色它們具有一些特定的管理權限你還可以為你的特定環境需求創建定制的角色在你的數據庫上分配權限給這些角色然後根據人們工作職責的變化從這些角色中添加和刪除用戶/群這有利於非常嚴格的安全環境並且允許你對訪問權限控制的記錄
我們的安全檢查列表:
確認已經安裝了NT/和SQL Server的最新補丁程序不用說大家應該已經安裝好了但是我覺得最好還是在這裡提醒一下
評估並且選擇一個考慮到最大的安全性但是同時又不影響功能的網絡協議 多協議是明智的選擇 但是它有時不能在異種的環境中使用
給 sa 和 probe 帳戶設定強壯的密碼來加強其安全性設定一個強壯的密碼並將其保存在一個安全的地方 注意: probe帳戶被用來進行性能分析和分發傳輸 當在標准的安全模態中用的時候 給這個帳戶設定高強度的密碼能影響某些功能的使用
使用一個低特權用戶作為 SQL 服務器服務的查詢操作賬戶不要用 LocalSystem 或sa 這個帳戶應該有最小的權利 ( 注意作為一個服務運行的權利是必須的)和應該包含( 但不停止)在妥協的情況下對服務器的攻擊 注意當使用企業管理器做以上設置時 文件注冊表和使用者權利上的 ACLs同時被處理
確定所有的 SQL 服務器數據而且系統文件是裝置在 NTFS 分區且appropraite ACLs 被應用 如果萬一某人得到對系統的存取操作權限該層權限可以阻止入侵者破壞數據避免造成一場大災難
如果不使用Xp_cmdshell就關掉 如果使用 SQL 至少使用Server Options中的SQLExecutieCmdExec 賬戶操作限制非sa用戶使用XP_cmdshell
在任何的 isql/ osql 窗口中( 或查詢分析器):
use master
exec sp_dropextendedprocxp_cmdshell
如果你不需要 xp_cmdshell 那請停用它請記住一個系統系統管理員如果需要的話總是能把它增加回來這也好也不好 一個侵入者可能發現它不在只需要把他加回來考慮也除去在下面的 dll但是移除之前必須測試因為有些dll同時被一些程序所用 要找到其他的程序是否使用相同的 dll:
首先得到該 dll
select onamectext from dbosyscomments c dbosysobjects o where cid=oid and oname=xp_cmdshell
其次使用相同的 dll發現其他的擴展儲存操作是否使用該dll
select onamectext from dbosyscomments c dbosysobjects o where cid=oid and ctext=xplogdll
用戶可以用同樣的辦法處理下面步驟中其他你想去掉的進程
如不需要就停用對象連接與嵌入自動化儲存程序 ( 警告 當這些儲存程序被停用的時候 一些企業管理器功能可能丟失) 這些包括:
Sp_OACreate
Sp_OADestroy
Sp_OAGetErrorInfo
Sp_OAGetProperty
Sp_OAMethod
Sp_OASetProperty
Sp_OAStop
如果你決定停用該進程那麼請給他們寫一個腳本這樣在以後你用到他們的時候你能夠把他們重新添加回來 記住 我們在這裡正在做的是鎖定一個應用程序的功能 你的開發平台應該放到其他機器上
禁用你不需要的注冊表存取程序(同上面的警告)這些包括:
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regremovemultistring
注意 :我過去一直在這裡列出 xp_regread/ xp_regwrite但是這些程序的移除影響一些主要功能包括日志和SP的安裝所以他們的移除不被推薦
移除其他你認為會造成威脅的系統儲存進程 這種進程是相當多的而且他們也會浪費一些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
在企業管理器中安全選項 之下禁用默認登錄(只有SQL ) 當使用整合的安全時候這使未經認可的不在 syslogins 表中使用者無權登陸一個有效的數據庫服務器
除去數據庫的guest賬戶把未經認可的使用者據之在外 例外情況是master和 tempdb 數據庫因為對他們guest帳戶是必需的
若非必須請完全地禁用SQL郵件功能它的存在使潛在的攻擊者遞送潛在的 trojans 病毒或是簡單實現一個DOS攻擊成為可能
檢查masterSp_helpstartup看有無可疑的木馬進程 確定沒有人已經在這裡放置秘密的後門程序 使用 Sp_unmakestartup 移除任何可疑進程
檢查masterSp_password看有無trojan代碼比較你的產品scripts和一個新安裝的系統的默認scripts而且方便的保存
記錄所有的用戶存取訪問情況 從企業管理器做這些設定或通過以sa登陸進入查詢分析器的下列各項:
xp_instance_regwrite NHKEY_LOCAL_MACHINE NSOFTWARE\ Microsoft\MSSQLServer\MSSQLServerNAuditLevelREG_DWORD
重寫應用程序使用更多用戶定義的儲存和察看進程所以一般的對表的訪問可以被禁用 在這裡你也應該看到由於不必經常進行查詢計劃操作而帶來的性能提升
除去不需要的網絡協議
注意SQL 服務器的物理安全把它鎖在固定的房間裡並且注意鑰匙的安全只要有機會到服務器面前就總是會找到一個方法進入
建立一個計劃的任務運行:
findstr/C: Login Failed\mssql\log\**
然後再重定向輸出到一個文本文件或電子郵件因此你監測失敗的登錄嘗試這也為系統管理員提供一個好的記錄攻擊的方法 也有很多用來分析NT日志事件的第三者工具 注意: 你可能需要將路徑換成你安裝SQL的路徑
設定非法訪問和登陸失敗日志警報到 企業管理器中的Manager SQL Server Messages 搜尋任何有關無權訪問的消息 ( 從查找login failed和denied開始) 確定你所有感興趣的信息被記錄到事件日志然後在這些信息上設定警報 發送一個電子郵件或信息到一個能夠對問題及時響應的操作員
確定在服務器和數據庫層次上的角色都只被授給了需要的用戶 當 SQL Server 安全模型 有許多增強的時候 它也增加額外的許可層我們必須監控該層確定沒有人被授予了超過必需的權限
經常檢查組或角色全體會員並且確定用組分配權限這樣你的審計工作能夠簡化 確定當你在的時候 公眾的組不能從系統表執行選擇操作
花些時間審計用空密碼登陸的請求 使用下面的代碼進行空密碼檢查:
使用主體
選擇名字
password
from syslogins
where password is null
order by name
如果可能在你的組織中利用整合的安全策略 通過使用整合的安全策略你能夠依賴系統的安全最大簡化管理工作從維護二個分開的安全模型中分離開來這也不讓密碼接近連接字串
檢查所有非sa用戶的存取進程和擴充存儲進程的權限 使用下面的查詢定期的查詢哪一個進程有公眾存儲權限(在SQL Server中 使用 type 而不是 xtype):
Use master
select sysobjectsname
from sysobjectssysprotects
where sysprotectsuid=
AND xtype 在 (XP)
AND sysobjectsid=sysprotectsid
Order by name
當時用企業管理器的時候使用整合的安全策略 過去企業管理器被發現在標准的安全模態中儲存 sa 密碼在注冊表的 plaintext 中 注意: 即使你改變模態密碼也會留在注冊表中 使用 regedit 而且檢查鍵:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\
MSSQLServer\SQLEW\ Regedi\
SQL
現在數據被隱藏在
HKEY_USERS\{yourSID}\software\Microsoft\Microsoft SQL server\\tool\SQLEW\registered server X\SQL server group
(SQL server組 是默認值但是你可能已建立用戶組因此相應地改變其位置)
發展一個審核計劃而且訂定每月的安全報告對IT主管可用的報表包括任何的新exploit成功的攻擊 備份保護 和對象存取失敗統計
不要允許使用者交互式登陸到 SQL Server之上這個規則適用任何的服務器 一旦一個使用者能夠交互式進入一個服務器之內就有能用來獲得管理員的存取特權得到管理員權限
盡力限制對SQL Server的查詢與存取操作 用戶可以用最小權限查詢sql server中的很多東西若非必須不要給他們機會
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22431.html