SQL Server安全(2/11):身份驗證(Authentication)

来源:http://www.cnblogs.com/woodytu/archive/2016/03/14/5264285.html
-Advertisement-
Play Games

在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。 身份驗證是驗證主


在保密你的伺服器和數據,防備當前複雜的攻擊,SQL Server有你需要的一切。但在你能有效使用這些安全功能前,你需要理解你面對的威脅和一些基本的安全概念。這篇文章提供了基礎,因此你可以對SQL Server里的安全功能充分利用,不用在面對特定威脅,不能保護你數據的功能上浪費時間。


身份驗證是驗證主體(需要訪問SQL Server資料庫的用戶或進程,是聲稱是的人或物)的過程。主體需要唯一的身份,這樣的話SQL Server可以決定主體有哪個許可。在提供安全訪問資料庫對象中,正確的身份驗證是必須的第一步。

SQL Server支持身份驗證的兩個途徑:Windows集成身份驗證和SQL Server身份驗證。你使用的途徑取決於網路環境,應用程式訪問資料庫的類型和這些應用程式的用戶類型。

  • Windows身份驗證:這個身份驗證方式依賴於Windows來擔當重任——當用戶登錄到Windows是驗證身份。訪問SQL Server對象的許可然後會分配給Windows登錄。只有當SQL Server運行在支持Windows NT或Kerberos身份驗證的Windows版本上才可以使用,這個自Windows 2000起已經幾乎是標準。
  • SQL Server身份驗證:SQL Server可以完全自主完成身份驗證。在這個情況下,你可以創建唯一的用戶名——在SQL Server調用登錄——和密碼。連接到SQL Server的用戶或應用程式提供這些憑證來訪問。許可然後直接分配到那個登錄或通過角色里的資格。

在SQL Server里在這2個類型之間配置身份驗證不是一個非此即彼的選擇(可以混合使用)。你可以在任何兩個方式里配置身份驗證:

  • 混合身份驗證模式:伺服器同時支持SQL Server和Windows身份驗證。
  • Windows身份驗證模式:伺服器只支持Windows身份驗證。

只要可能的話,微軟強烈推薦使用Windows身份驗證。Windows擁有可靠的驗證選項,包括密碼策略,但正真正的應用程式里,Windows身份驗證並不總是可行的。SQL Server身份驗證可以嵌入Windows驗證的一些功能,但它不太安全。

Windows身份驗證

如果你配置你的SQL Server在Windows身份驗證里操作,SQL Server認為與Windows伺服器有信任關係。當它們登錄到Windows里時,SQL Server認為Windows已經驗證用戶。然後SQL Server檢查用戶賬號,任何Windows組和任何SQL Server角色,看用戶是否是其成員之一來決定用戶是否允許與各個SQL Server對象打交道。

與SQL Server身份驗證比,Windows身份驗證有很多優勢,包括:

  • 用戶一次登錄即可,因此她不需要單獨登錄到SQL Server
  • 審計功能
  • 簡單化登錄管理
  • 密碼策略(在Windows Server 2003及後續版本)

Winows身份驗證的另一個大優勢是你對Windows用戶和組的任何修改會自動在SQL Server里生效,因此你不需要單獨管理它們。然後,如果你對Windows用戶做出的修改,它們此時剛好連接到SQL Server,這些修改不會生效,直到下次用戶連接到SQL Server才會生效。

配置SQL Server安全設置

當你安裝SQL Server時,你可以選擇SQL實例允許的驗證模式。安裝完成後你可以在SSMS里的伺服器屬性對話框里修改這個設置。這些設置適用於SQL Server實例里的所有資料庫和其它對象。因此如果你需要為任何資料庫使用SQL Server身份驗證,你需要為伺服器設置為混合模式。

插圖2.1顯示了在SSMS里選擇了【安全性】頁的【伺服器屬性】對話框。為了打開這個對話框,在對象瀏覽器里右擊伺服器實例名,從彈出的菜單里選擇【屬性】,然後點擊【安全性】頁。通過點擊對應的單選框和點擊【確定】提交修改,就可以修改驗證模式。

插圖2.1:為SQL Server實例配置驗證模式

添加一個Windows登錄

使用Windows身份驗證,你的用戶在能訪問SQL Server前需要驗證Windows登錄賬號。然後你可以授予一個Windows組連接到SQL Server,或者你可以授予許可給單獨的Windows用戶,如果你不想授予集體許可。

使用SSMS管理安全的一個好處是你可以同時配置登錄和資料庫訪問。啟用Windows登錄到訪問SQL Server和AdventureWorks2012資料庫。使用下列步驟,並假定本地機器已經定義了woodytu用戶。

  1. 打開SSMS,確保對象瀏覽器窗體可見,並且你已經連接到SQL Server實例
  2. 展開伺服器對象的樹狀視圖,然後展開【安全性】節點。你會看到如插圖2.2所示的多個子節點。

    插圖2.2:伺服器對象瀏覽器的安全性部分,你定義的登錄的地方
  3. 右擊【登錄名】節點,從彈出的菜單里選擇【新建登錄名】來打開【登錄名】——新的對話框
  4. 確保【Windows身份驗證】單選框已經選擇
  5. 你可以用任何2種方式選擇Windows登錄。第一種方式是直接輸入功能變數名稱或機器名,然後一個\和所使用的Windows登錄名。第二個方式,通常更簡單的方式點擊【搜索】按鈕來打開【選擇用戶或組】對話框。輸入用戶名,點擊【檢查名稱】來查找具體的名稱。如果找到用戶,完整的名字在對話框里出現,如插圖2.3里所示。點擊【確定】選擇那個用戶。

    插圖2.3:找到一個Window登錄來添加到SQL Server
  6. 回到【登錄名-新建】對話框,設置AdventureWorks2012資料庫作為登錄的預設資料庫。當用戶連接到伺服器且不指定資料庫時,這是用戶使用的資料庫。這不限制用戶只訪問那個資料庫。插圖2.4展示對於在WIN10的機器上Windows的登錄用戶woodytu,設置預設資料庫為示例資料庫AdventureWorks2012的登錄配置。

    插圖2.4:【登錄名—新建】對話框啟用Windows登錄到訪問SQL Server實例。
    提示:
    絕不保持預設資料庫為master資料庫。這個是慘痛的教訓:連接到伺服器,太容易忘記修改資料庫了。到時候如果你運行腳本在master資料庫上創建上百個資料庫對象,你會花大量的精力來人為刪除這些對象,清理master資料庫。
  7. 接下來,給用戶訪問一個資料庫。從對話框的左邊清單里選擇【用戶映射】頁。通過選擇資料庫名旁的選擇框授予用戶訪問AdventureWorks2012資料庫。SQL Server自動映射用戶用同樣的用戶名到資料庫里的用戶,如你在表裡的第3列所見,如果你想要的話,可以修改用戶名。分配Sales作為用戶在資料庫里預設的架構,可以在【預設架構】列里輸入,或者點擊【...】按鈕從列表裡選擇。對話框應該如插圖2.5所示。

    插圖2.5:授予Windows登錄訪問AdventureWorks2012資料庫
    提示:
    為登錄設置預設資料庫和授予訪問到資料庫之間是有區別的。當用戶登錄沒有指定資料庫時,預設資料庫指的是SQL Server嘗試修改上下文到那個資料庫。但這不授予在資料庫里做任何事的任何許可,或者甚至允許訪問到資料庫。這就是說分配用戶完全不能訪問的資料庫是可能的。一旦資料庫被訪問了,為了讓用戶可以進行一些操作,你需要授權用戶許可。
  8. 預設情況下,新的Windows登錄可以訪問到伺服器。但是如果你想禁止登錄訪問伺服器,從【登錄名—新建】的左邊列表選擇【狀態】,勾選【拒絕】單選框。你也可以通過選擇【禁止】按鈕臨時禁用登錄。插圖2.6顯示了這些選項。

    插圖2.6:授予和拒絕連接到資料庫和臨時禁用登錄賬號選項
  9. 點擊【確定】創建用戶。

你也可以在同樣的方式里添加Windows組到SQL Server,組的任何成員也可以訪問資料庫伺服器,包括你給組的資料庫里的任何對象 。

SQL Server身份驗證

當你使用SQL Server登錄作為驗證時,客戶端應用程式需要提供有效的用戶名和密碼來連接到資料庫。這些SQL Server登錄在SQL Server里保存,與Windows無關。當在登錄時,如果沒有匹配的用戶名和密碼,SQL Server拋出錯誤,用戶不能訪問資料庫。

儘管Windows身份驗證更加安全,在一些情況或許你只能選擇SQL Server登錄來代替。對於簡單沒有廣泛安全需求的應用程式,SQL Server身份驗證更容易管理,它允許你避免Windows安全的複雜。而且如果客戶端運行在更老版本的Windows(比Windows 2000還老)或非Windows的操作系統,你必須使用SQL Server登錄。

創建SQL Server登錄,使用和Windows登錄同樣的【登錄名-新建】對話框。但不是選擇Windows登錄,輸入沒有功能變數名稱或機器名的用戶名,並提供密碼。例如,插圖2.7顯示瞭如何創建一個新的SQL Server登錄user,把AdventureWorks2012作為他的預設資料庫。

插圖2.7:創建SQL Server登錄

對於用戶映射和狀態的所有其它選項的SQL Server登錄和Windows登錄是一樣的。

通過T-SQL的SQL Server登錄

你也可以用T-SQL代碼來進行同樣的操作。在代碼2.1里的Create Login代碼創建一個有強勁密碼的SQL Server登錄Tudou。

1 CREATE LOGIN Tudou WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v';
2 GO

代碼2.1:使用T-SQL創建新的SQL Server登錄的代碼

然後,授予Tudou訪問AdventureWorks2012資料庫,使用CREATE USER語句並分配預設的架構,如代碼2.2所示。

1 USE AdventureWorks2012;
2 GO
3 
4 CREATE USER Tudou FOR LOGIN Tudou
5     WITH DEFAULT_SCHEMA = HumanResources;
6 GO

代碼2.2:用SQL Server登錄關聯創建資料庫用戶的代碼

提示:

如第一篇,如果你想在本地SQL Server實例運行它們的話,很可能你需要對代碼做些改動。在代碼2.2里假定你已經安裝了AdventureWorks2012資料庫。

像Windows登錄,你可以映射伺服器登錄Tudou到資料庫里其它一些名稱。代碼2.3里在AdventureWorks2012資料庫里映射TudouZ到Tudou用戶。

1 DROP USER Tudou;
2 GO
3 CREATE USER TudouZ FOR LOGIN Tudou WITH DEFAULT_SCHEMA = HumanResources;
4 GO

代碼2.3:刪除現存用戶增加用不同登錄名的資料庫用戶名的代碼

謹防sa登錄

如果你配置你的SQL Server支持SQL Server登錄,有一個SQL Server內建的SQL Server登錄需要留意——sa登錄——在對象瀏覽器里的【安全性】節點,【登錄名】里可以看到。sa或系統管理員,登錄是為了SQL Server的早期版本的向後相容性。sa登錄映射到sysadmin伺服器角色,任何以sa登錄到SQL Server的任何人有完全的系統管理員許可權,在整個SQL Server實例和所有裡面的資料庫都有不可撤銷的權利。這的確是個強大的登錄。

你不能修改或刪除sa登錄。當你安裝SQL Server的時候,如果你選擇了混合驗證模式,你會提示為sa用戶輸入密碼。沒有密碼的話,任何人可以不輸密碼直接以sa登錄,玩弄起“我來管理伺服器”。不用說,這是你讓你的用戶最後做的事。如果沒有其他系統管理員或忘記了它們的Windows密碼,使用sa登錄只是個後門。如果那個發生的話,你需要新的管理員!

絕不要在應用程式里使用sa登錄來訪問資料庫。如果黑客拿到應用程式的控制權,這樣做的話會給黑客真個資料庫伺服器的管理許可權。在早期,這是黑入伺服器的最簡單方法,是個可怕的實例。相反,為應用程式設置一個自定義的Windows或SQL Server登錄來使用,給這個登錄來運行程式的絕對最小的必須許可(實現最小許可權原則)。

提示:

事實上,你應該考慮使用剛纔看到的登錄屬性對話框的【狀態】頁完全禁用sa登錄。那樣的話攻擊者不能使用這個全能登錄來控制你的伺服器實例,不管你是否設置了強悍的sa密碼。

密碼策略與執行

在SQL Server 2005之前的版本,對於可以讓系統更安全,對系統管理員的強制密碼策略,沒有一個簡單的方法。例如,SQL Server米有辦法強制用戶創建最短長度、數字和其它字元混合的強壯密碼。如果有人要用一個字母創建登錄的密碼,你不能配置SQL Server來阻止它。同樣,密碼也沒方法設置它定期過期,例如每三個月。一些人剛好看到了這個主要原因,不使用SQL Server登錄。

SQL Server的最近版本可以嵌入Windows Server 2003及後續版本的密碼策略。密碼還是保存在SQL Server里,但SQL Server調用了NetValidatePasswordPolicy() Windows API方法,這個是在Windows Server 2003首次引入的。這個API函數應用Windows密碼策略到Server登錄,返回一個值表示密碼是否有效。當用戶創建,設置或重置密碼時,SQL Server調用這個函數。

你可以通過Windows控制面板管理工具里的本地密碼策略來定義Windows密碼策略。預設密碼策略部分如插圖2.8所示。這個小程式有獨立的賬號鎖定策略,如插圖2.9所示,當用戶嘗試太多的失敗登錄時生效。預設情況下,新安裝的Windows鎖定策略是禁用的。

 插圖2.8:Windows本地安全策略小程式,顯示預設的密碼策略。

插圖2.9:Windows本地安全策略小程式,顯示預設的賬號鎖定策略。

下表列出預設值的密碼策略和它們如何運作的說明。

 類別            策略名             預設值            說明

密碼策略          強制密碼歷史          0個記住的密碼          阻止用處重用舊密碼,例如在2個密碼之間修改

              密碼長度最小值         0個字元            使用這個要求密碼長度,讓它們很難破解

              密碼必須符合複雜性要求     已禁用            至少6個字母或數字和其它字元,不包含用戶名

密碼過期          密碼最長使用期限        42天             在用戶修改密碼前的天數 

              密碼最短使用期限        0天               在允許用戶可以修改密碼前的天數

賬戶鎖定策略        賬戶鎖定時間          不適用            如果鎖定閾值啟用的話則鎖定

              賬戶鎖定閾值          0次無效登錄          賬戶鎖定前失敗登錄次數

              重置賬戶鎖定計數器         不適用                            重置失敗登錄次數;

當鎖定閾值啟用的時候啟用

表2.1:Windows密碼策略設置

當你創建登錄的時候,你可以啟用或禁用執行密碼策略。【登錄名-新建】對話框在登錄名下,在你創建SQL Server登錄的時候,有個啟用部分,如插圖2.10所示。

插圖2.10:對於新的登錄執行密碼策略

當你使用T-SQL創建登錄的時候,也可以應用密碼策略。例如,如果你在Windows 2003 Server後後續版本上運行SQL Server並啟用了密碼策略,代碼2.4會運行失敗。

1 USE master;
2 GO
3 CREATE LOGIN SIMPLEPWD WITH PASSWORD = 'SIMPLEPWD';
4 GO

代碼2.4:嘗試創建違反密碼策略的登錄

這個代碼運行失敗的原因是密碼不能和用戶名一樣。

當你創建或修改登錄時,你可以控制策略。代碼2.5關閉了過期檢查和策略。

1 ALTER LOGIN Tudou WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v',
2     CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF;

代碼2.5:只對修改登錄來禁止密碼策略的代碼(只對這次登錄)

CHECK_EXPIRATION選項控制SQL Server檢查密碼的策略里年齡,CHECK_POLICY應用到其他策略。MUST_CHANGE選項執行用戶下次登錄必須修改密碼。

如果用戶有太多次數的失敗登錄,超過了賬號鎖定策略的設置數,管理員可以使用UNLOCK來重置,如代碼2.6所示。

1 ALTER LOGIN Tudou WITH PASSWORD = 'yBqyZIPT8}b]b[{5al0v' UNLOCK

代碼2.6:由於太多失敗登錄而鎖定登錄,解鎖的代碼。

當你在Windows Server 2003之前的版本上運行SQL Server,你可以啟用強制密碼策略。但SQL Server預設使用至少6個字元的密碼,密碼里不能包含你的用戶名,而且是大小寫字母,數字和其他字元的混合體。你不能修改這些預設設置。但希望你不要這麼老的版本上運行SQL Server,因為自那以後有了大的安全改進。

小結

在這篇SQL Server安全文章里,你學習了SQL Server里的多個驗證選項。Windows集成身份驗證是最安全的,但並不是都是可行的,微軟多年來已經讓SQL Server驗證更加安全。但是如果你使用混合驗證模式,不要忘記給sa足夠強悍的密碼,甚至停用它。同樣大多數對象,你都可以使用SSMS里的圖形界面或T-SQL來創建或修改它們。如果你在當下的Windows版本上運行SQL Server,你可以將本地安全策略嵌入密碼策略。

感謝關註!

原文鏈接:

http://www.sqlservercentral.com/articles/Stairway+Series/109975/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分類:C#、Android、VS2015; 創建日期:2016-03-13 一、簡介 Android提供的Camera有兩個典型的版本,一個是在Android 5.0以前提供的,稱為Camera;另一個是從Android 5.0開始提供的,稱為Camera2。 這裡僅演示使用系統Camera程式實現...
  • 服務 服務沒有界面,一直運行在後臺, 運行在獨立的一個進程裡面 服務沒有界面,一直運行在後臺,預設是運行當前的應用程式進程裡面。 建立一個類繼承Service類 在清單文件中註冊service   只會在開啟服務時初始化一次   每次開啟服務都會執行調用   停止服務時,只執行一次   onCrea
  • 一、設置UITableView裡面的頂部 cell 距離頂部的間距的三種方式: 方法 1. 直接設置: self.tableView.contentInset = UIEdgeInsetsMake(HWStatusCellMargin, 0, 0, 0); @interface HWHomeView
  • 1. ARC裡面預設情況下所有指針都是強指針。 2. 在演示 設置兩個控制器的關係為 父子控制器的關係的時候,將一個控制器B 的view加到 A控制器的view上去的時候,如果A、B不為父子控制器的關係時,旋轉屏幕 的時候 B控制器是不能監聽到屏幕的旋轉的。只有A控制器可以監聽到屏幕旋轉。 3. 屏
  • sql server2000中使用convert來取得datetime數據類型樣式(全) 日期數據格式的處理,兩個示例: CONVERT(varchar(16), 時間一, 20) 結果:2007-02-01 08:02/*時間一般為getdate()函數或數據表裡的欄位*/ CONVERT(var
  • 獲取 資料庫 和 表信息: 確定MySQL支持哪些表類型:mysql> show variables like '%have%';直接得到表類型清單:mysql> show table types;
  • 出處:http://www.cnblogs.com/lzrabbit/archive/2012/05/21/2499389.html 小小程式猿SQL Server認知的成長 1.沒畢業或工作沒多久,只知道有資料庫、SQL這麼個東東,渾然分不清SQL和Sql Server Oracle、MySql的
  • 在csdn上也看到一個帖子叫Oracle常用函數110.大概的看了一下,裡面數據計算的居多,協方差之類的.自己覺得用到的不多,今天看到的這個,不是很全,稍微增加了一下,等以後用到的時候可以查看.
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...