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
留言
張貼留言