SQL Server 連線認證問題

關於資料庫連結部分,是寫在Web.Config中,以下是關於SQL ConnectionString

用於連線資料庫的字串

<add name="mEduConnectionString" connectionString="Data Source=IP\DB引擎Name;Initial Catalog=DBName;Integrated Security=True;User ID=userid;Password=password"  providerName="System.Data.SqlClient" />

目前這段字串有一個問題就是 user id 和 password會洩漏出來,這樣就可以使用Sql server驗證登入,因此有另一種連線寫法如下

 <add name="mEduConnectionString" connectionString="Data Source=IP\DB引擎Name;Initial Catalog=DBName;Integrated Security=True; providerName="System.Data.SqlClient" />

這邊就不需要寫user id 跟 password了,也可以正常連線,而windows驗證,也只有本機可以連線認證,比較不擔心資料庫外洩問題。

當然還有使用 這個 加密連線字串的方法,就可以避免user id跟 password外洩。

而不使用Sql server驗證登入的另一個連線寫法(以下稱為windows驗證)是採用NTLM/Kerberos 協定進行驗證

看說明 貌似是使用hash的方法加密,這個hash不是hash加密法,而貌似是一種windows的方法,是建立一個以驗證成功的session的token的hash,當建立連線的時候再次要求token而已,並不需要再次傳送帳號密碼,以此衍生出了一種叫 Pass the hash 的攻擊方法。

另外,Kerberos 會比 NTLM 再高一階的安全性,是因為驗證與證明使用者與服務端身份的機制更複雜也更完整,使得傳遞的訊息也是經過加密的,在經過一連串的身份驗證後,才會正式進行通訊。其細部的資訊可參考維基百科。Windows 的 Active Directory 採用的是 Kerberos V5 的協定。


以下是參考網站一中分析的兩者優劣

僅在此整理,本身也不太熟悉資安相關,這邊用於檢查用,我目前是比較常用Sql 驗證,如介紹所說,方便、簡單,但是不能否認的是,他上述的缺點都是可能發生的。

Windows 驗證:


優:帳戶密碼不會暴露在連線字串內 (設定 Integrated Security=true 或 Integrated Security=SSPI)。

優:在網域環境內可使用網域帳戶來統一分散式環境 (例如,在多 Web Server 的環境,於每台 IIS 上的 app pool identity 設定同一個網域帳戶)。

優:可於本機帳戶管理或網域帳戶管理中停用帳戶以關閉存取權,以及套用群組原則來落實管理與控制政策。

優:可使用直接讀取使用者登入帳戶的方式,由使用者自己的帳戶存取資料庫。當然實務上這會使管理負擔增加,因此還會外加一個模擬帳戶的方式來存取資料庫。

缺:需要額外的管理負擔來管理帳戶。

缺:在網域環境內,網域控制站必須活著 (online),否則可能會拖慢速度或無法使用。

缺:需要額外的設定知識 (例如設定 IIS application pool 帳戶)。


SQL Server 驗證:


優:較簡單,只要在 SQL Server 建立帳戶,然後將帳戶密碼寫在連線字串即可,不需要特別設定 IIS application pool 帳戶。

優:SQL Server 帳戶與 Windows 帳戶無關,因此對 Windows 帳戶的異動不會影響到 SQL Server 存取 (但這也有一個缺點,就是無法利用群組原則落實管理與控制政策)。

缺:帳戶密碼暴露在連線字串,有被盜的風險,尤其是很多人圖方便會直接用 sa 帳戶,等於雙手奉上伺服器存取權給惡意使用者。

缺:若安裝 SQL Server 時沒有啟用 SQL Server 驗證,需要額外的步驟才能啟用。

缺:傳遞帳戶密碼時可能是以未加密的傳輸,一樣會有帳戶密碼被攔截竊取的風險,可以啟用 SQL Server SSL,但會有管理成本。


我的建議是,能用 Windows 驗證就用 Windows 驗證,除非不在網域環境且主控權不高的情況下,才使用 SQL Server 驗證,同時必須要求下列安全事項:


不得使用具有操作伺服器與資料庫組態的帳戶,例如 sa、具 sysadmin 權限的帳戶、具 db_owner 權限的帳戶等。

應盡量使用連線字串加密,以保護使用者帳戶名稱與密碼。

可以的話,啟用傳輸加密,以保護帳戶名稱與密碼在網路上的傳輸安全。

資料庫伺服器和用戶端不可跨越 Internet,除非已落實適當保護措施。


參考:

https://dotblogs.com.tw/regionbbs/2017/07/13/sqlserver_database_authentication_mode?fbclid=IwAR2InT5CTMYe9YD7D6mX1z6I2NflmZVvw8kpU_DvJt-rjO6nH3JYgFJFTpk#google_vignette

https://learn.microsoft.com/en-us/previous-versions/aspnet/ms178372(v=vs.100)?redirectedfrom=MSDN

https://en.wikipedia.org/wiki/Pass_the_hash

https://zh.wikipedia.org/wiki/Kerberos

留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

DDD With MVC