在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。 從讓人眼花繚亂的
在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。
從讓人眼花繚亂的客戶端使用連接,通過到處分佈的網路,尤其是互聯網,關係資料庫在各種應用程式里廣泛使用。這使數據對任何人,在任何地方都可訪問。資料庫可以保存人類知識的很大部分,包括高度敏感的個人信息和讓國際商務工作的關鍵數據。
對於想要偷取數據或通過篡改數據來傷害數據的擁有者的人來說,這些功能使資料庫成為有吸引力的目標。確保你的數據安全是SQL Server配置和使用它來保存數據的程式的重要部分。這個系列會探尋SQL Server 2012安全的基本,這樣的話你可以保護你的數據和伺服器資源,按你需要的安全等級來保護數據,免受這些威脅對你數據的影響。大部分信息對SQL Server的早期版本也適用,回到SQL Server 2005也可以,因為那是微軟在產品里徹底檢查安全的時候。但我也會談論只在SQL Server 2012和後續版本里才有的功能。
在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。
威脅
在理解如何配置和使用SQL Server來保護你的數據,識別特定數據集和它的伺服器的威脅是重要的第一步。你創建的用來管理你的小學足球隊的設備清單很可能不需要嚴格的安全措施。很可能你會想提供最小的訪問控制,這樣的話,足球隊成員不能隨機修改他擁有哪個足球盒的記錄。即使這些數據被盜或篡改也不會是世界末日。
另一方面,如果資料庫有關於足球隊孩子的個人信息,例如家庭地址和聯繫電話,很可能你想加強安全保護(或許法律上也要求你這麼做)。可能你會通過隔離訪問來保護數據的隱私,這樣的話,幾乎任何可以訪問資料庫來修改設備數據,但只有一些人可以訪問個人數據。如果數據包括家長的信用卡號,你會需要極其小心的保護那個數據。
你的數據很容易受到很多威脅,下列清單是常見的幾個。在網路上有很多資源可以針對你的特定情況幫你分析。這個清單隻想幫助你開始考慮這些威脅,如何使用SQL Server的功能來應對它們,或者至少減少暴露數據給他們。
- 數據竊取:數據竊取包括各種對你數據的未授權訪問,無論通過黑入你網路的外界人員,還是在重要人物上非法掃描的內部人員。它會涉及到讀取到禁止信息的興奮,或者被通過銷售竊取的信用卡號的利益所驅動。
- 數據破壞:獲的你數據訪問許可權的可以修改它,它會帶來一系列的問題,包括關閉你的所有業務讓你在公眾面前尷尬(當你所有的客戶記錄被刪除時就會發生)。
- 數據篡改:在關係資料庫里存儲數據的一個最大好處是資料庫本身可以幫助保護數據的完整性。數據完整性包括每個訂單有關聯的客戶,在日期列存儲的日期代表日曆上的日期,百分比欄位只包含0和100之間的值等這些約束。當你考慮安全的時候,數據完整性不會是第一個想到的,但卻是你的數據保護的重要部分。
- 非法存儲:在過去,在商業過程期間,你收集的數據只是你個人的事。但選擇在美國,遍及歐盟和可以控制你存儲的各種個人信息,你如何存儲它,你如何保護它的其他國家裡的都有對應的法律存在。違法的處罰是嚴格的——包括罰款和對你公司的公共形象損失費。
這個系列文章談到的SQL Server 2012的功能可以幫你緩解這些各類威脅和其他方面。你必須理解對你數據的威脅,才可以知道如何保護它們。不要在不能防止你特定數據威脅的措施上浪費時間。你永遠不能考慮到所有的假設情況,但最為最壞的情況你要保證你的資料庫伺服器對它的面向客戶是完全不可用的。安全總是個妥協,對時間的風險和實現保障的必要金錢之間的平衡。
安全設計理念
早在2012年,比爾蓋茨發佈了他臭名昭著的電腦可信備忘錄,即微軟在產品里如何考慮和實現安全的,可以證明是個轉折點。根據微軟官方網站,可信電腦政策啟動了。“基於良好的商業實踐,專註創建和帶來安全,隱私和可靠的計算體驗。我們的目標是更安全、更可信的互聯網”。
話句話說,微軟在十多年前就變得非常關註安全。關於這個修改的第一個版本是SQL Server 2005,微軟開始在產品考慮充分的安全。自那以後,SQL Server的每個版本都會保留新的安全架構,同時加強它,增加新的功能來同時提高安全來應對新出現的威脅。
如微軟在SQL Server 2005時期里所描述的,通過定義產品安全的四大支柱來影響SQL Server可信計算發展。
- 安全設計(Secure by design):微軟進行廣泛的威脅分析和代碼設計與交互的安全審計,來確定攻擊者可以立足獲得伺服器和數據的地方。這樣讓微軟設計的SQL Server可以保護你在伺服器上存儲的數據的保密性,完整性和可用性。
- 預設安全(Secure by default):SQL Server創造性的預設安裝並激活關鍵的核心資料庫組件。這就是說不是核心的資料庫的功能不會安裝,或者安裝之後不會啟用。沒有安裝的功能不安裝就不會作為攻擊目標。你必須清醒意識安裝或啟用的非核心功能。這會阻止你可能不知道卻安裝功能的很多攻擊,你以為從未用過它們。
- 部署安全(Secure in deploymen):微軟提供工具,支持安裝SQL Server的安全並保持它的安全。SQL伺服器配置工具幫助你配置伺服器安全。最重要的是,SQL Server的更新已經是微軟線上更新的一部分,因此很容易獲得安全的更新和補丁。
- 互動安全(Secure through communication):微軟已經建立了完善的基礎設施來手機它產品中的漏洞。但這些信息如果只留在微軟內部的話是沒有任何用處的。因此公司致力於新漏洞的互動,積極打補丁來修正它們,定期發佈更新到它的線上幫助系統來體現新的安全信息。
“它是安全的”的理念已經影響了整個產品。儘管SQL Server一打開就是相當安全的,當你創建資料庫和安裝服務時,你必須做出明智的安全選擇來保持SQL Server的安全。作出並保證生產資料庫伺服器的安全需要行動和警惕。
記住有時候保護數據的最佳方法是直接不把它不放到資料庫里——例如,只保存你必須絕對堅持有效的信用卡信息(這樣的人並不多)。如果你沒有這樣的需求,你應該處理信用卡事務,保存結果,而不是信用卡信息本身。你不會承受你沒有數據上的安全風險。
安全的2個階段
SQL Server的安全模型,像Windows一樣,是個2個階段的過程,允許用戶和其它登錄的訪問伺服器里受保護的資源。
- 身份驗證(Authentication):一個用戶登錄成功,是有效的,可以訪問伺服器。身份驗證回答問題,“你是誰?“需要用戶去證明它,通常需要用戶提供用戶名和對應的密碼,但其它形式的證據變得更加流行。
- 授權(Authorization):用戶可以和SQL Server對象互動——例如資料庫,表和存儲過程——哪個用戶有許可權。授權回答問題,”你可以做什麼?“。
用戶可以登錄到SQL Server,但除非它們有許可權做什麼,例如訪問資料庫,它就做不了什麼。因此你不僅需要為你的用戶提供授權憑證,你還要授權它們訪問數據,在每個它們需要使用的資料庫里為它們授權一次,定義賬號。
當你考慮它的時候,在每個資料庫里需要一個用戶賬號更有意義。不然的話,什麼可以阻止用戶登錄到SQL Server並可以訪問想訪問任何資料庫。這個概念有不同的含義來實現不同的場景,但這是安全的基本狀態。
在這個系列的接下來文章會談到驗證和授權,你會學到在SQL Server里如何實現各種安全功能來應付你對數據已經識別的威脅。
SQL Server安全術語
當你與SQL Server和其它產品打交道時,你會碰到各種特定的專業術語。這裡有一些最常見的術語,還有在資料庫安全上下文里它們的含義。
- 驗證(Authentication):如上面提到的,驗證是積極識別一個人的過程,通過需要證明它是可以登錄的人。它回答問題:你是誰?
- 授權(Authorization):一旦系統驗證你為一個有效用戶,授權(如上所述)決定用戶在伺服器或資料庫擁有的許可權。它回答問題,這裡現在你能做什麼?
- 組(Group):在Windows里,組是已登錄後與它關聯的主角。任何授權到組都會授權到組裡相關聯的登錄。
- 模擬(Impersonation):所有的Windows進程,包括各種SQL Server進程,在特定的安全上下文里運行,通常是主角引起進程啟動。當進程臨時在不同的安全上下文時會發生模擬。這是非常強大的切必需的能力,但會引起潛在的濫用。
- 登錄(Login):登錄是擁有伺服器實例里的對象一些訪問級別的主角。通常,登錄常用來與用戶交互。但是SQL Server登錄是一個用來從外面訪問伺服器的賬號。有時候登錄包括訪問伺服器級別的對象,例如配置信息,但不會授予資料庫里的任何許可權。
- 許可(Permission):許可是訪問保護資源的權利,例如從表讀取數據或在伺服器級別創建新的資料庫。一個學科通常意味著其他許可,取決於對象許可的範圍。
- 主體(Principal):主體是可以接收訪問SQL Server里保護資源的任何用戶或代碼組件。
- 許可權(Privilege):許可權是主角擁有的廣泛權利和許可。這個詞有時候和許可交替使用,通常意味著特定、狹義的權利。權利意味著一組廣泛的許可。
- 角色(Role):SQL Server角色類似於Windows用戶組,但只限於SQL Server實例範圍。對於一個組,你可以分配登錄和用戶到角色,這就是這個角色擁有登錄和用戶的所有許可。
- 用戶(User):用戶是在特定資料庫里擁有對象的一些訪問級別的主角。用戶通常會映射到登錄。簡單來說,登錄可以訪問SQL Server實例,用戶可以訪問數據。
在這個系列的文章里你會看到大部分這些術語的使用。
SQL Server安全管理和實現
正如SQL Server里大多數操縱和管理任務,通常安全功能幾乎都有很多管理和實現方法,包括使用SSMS的圖形界面,編寫和執行T-SQL代碼,使用在命令行編寫PowerShell與SQL Server進行交互。使用PowerShell已經不是本系列文章的討論範圍,但在這個系列文章里,你會看到另外2個技術的很多例子。
使用SSMS的安全功能,通常你可以在對象瀏覽器里右擊合適的對象,選擇【屬性】,然後在對話框里使用合適的頁來做你想要的修改。例如,在AdventureWorksLT2012示例資料庫上設置安全,在對象瀏覽器里右擊資料庫名,選擇【屬性】,然後選擇【許可權】頁,如插圖1.1所示。
插圖1.2:用來修改AdventureWorksLT2012資料庫安全的許可權頁
同時在資料庫和伺服器級別,對象瀏覽器包括了安全節點,讓你管理和實現其他各種安全功能。插圖1.2顯示了對AdventureWorksLT2012資料庫和伺服器實例級別的這個節點。這2個高亮的節點包括各種子節點,給你在選擇範圍內訪問合適的安全對象。
插圖1.2:在對象瀏覽器里,在伺服器和資料庫級別的安全對象
你會在SSMS和它各個窗體里找到各種隱藏的安全功能,因此你可以好好點開這些安全性節點。
在SQL Server 2005徹底安檢里另外一個改變是可以允許更顆粒度的方式分配安全。在接下來的文章里你就會學到,你會對各種主體分配各種許可來實現“最小特權”的重要安全原則——這個想法是每個主體只能有它們需要的許可:不多也不少。隨著這個改變,微軟增強了T-SQL,在語言上有強大的支持,可以直接操縱安全對象。
代碼1.1展示了你可以使用T-SQL創建安全對象的簡單例子。代碼首先創建鏈接到現存系統登錄的伺服器級別的登錄。然後在AdventureWorksLT2012資料庫里,代碼創建了個用戶映射到登錄,分配了預設架構給用戶。最後的一點代碼向你展示了你如何在資料庫里刪除用戶和創建另一個用戶映射到同樣的登錄。很作秀,當然,但是它展示了在代碼里你能做什麼。或者你也可以在SSMS的圖形界面里實現,如果你喜歡的話。
1 -- Add a Windows login to SQL Server 2 CREATE LOGIN [PC201602202041\woodytu] FROM WINDOWS; 3 GO 4 5 USE AdventureWorksLT2012; 6 GO 7 8 -- Name the user the same name as login 9 CREATE USER [PC201602202041\woodytu] FOR LOGIN [PC201602202041\woodytu] 10 WITH DEFAULT_SCHEMA = Production; 11 GO 12 13 -- Or, rename the user in the database 14 DROP USER [PC201602202041\woodytu]; 15 GO 16 CREATE USER woody FOR LOGIN [PC201602202041\woodytu]; 17 GO 18 19 -- Query metadata to show that user was created 20 SELECT * FROM sys.database_principals WHERE name = 'PC201602202041\woodytu'; 21 SELECT * FROM sys.database_principals WHERE name = 'woody';
代碼1.1:創建伺服器登錄和資料庫用戶的示例代碼
如果你想運行這個代碼,首先你要做些改動。除非你的電腦名稱和我的一樣,且有一個woodytu的用戶存在,你需要在代碼里修改名稱。這個代碼在AdventureWorksLT2012資料庫創建資料庫用戶,並使用它的Production架構,因此你要麼需要安裝這個資料庫,要麼修改代碼使用另一個資料庫和它裡面存在的架構。但我還是建議你安裝AdventureWorks資料庫,因為接下來的文章會頻繁用到它。
小結
這個系列的第一篇文章給你概括介紹了SQL Server 2012里的基本安全概念。你學到了一些常見的數據威脅,探尋了SQL Server背後的設計理念。你學到了安全的2個階段——身份驗證和授權,學習了在整個系列文章看到的一些安全術語,目睹了你可以使用SSMS圖形界面和T-SQL代碼來管理和實現安全。
在下一篇文章里,你會學到SQL Server里身份驗證如何工作和身份驗證可用選項的更多信息。