最近,在SQLServer中使用Windows使用者組時,發現了一些比較詭異的問題。
SQL Server版本:SQL Server 2008 R2
問題1:Login failed for user 'xx\xx'
操作描述:
在SQL Server中添加一個Windows使用者,並且使用該使用者串連SQLServer(Windows身分識別驗證),登入失敗,日誌中出現如下錯誤:
Login failed for user 'xx\xx'. 原因:
基於令牌的伺服器訪問驗證失敗,出現基礎結構錯誤。請檢查以前的錯誤。 [用戶端: <xxxx>]
檢查許可權分配沒有任何異常,後來屬性,該使用者屬於一個Windows使用者組,這個使用者組也是SQL Server的Login,並且顯式拒絕了CONNECT
SQL許可權,嘗試去掉Windows組上的拒絕許可權,發現可以正常登入。
反覆測試後發現,如果Windows使用者和它所屬的Windows使用者組都是SQLServer的Login的話,則Windows使用者的許可權為其自身的許可權+所屬Windows組的許可權,並且拒絕許可權優先。也就是說,只要Windows使用者所屬的使用者組具有某個對象的存取權限,那麼Windows使用者也會有這個許可權;而如果其所屬的使用者組設定了拒絕許可權,則即使顯式給Windows使用者權限,也會出現許可權拒絕的現象。我所遇到的問題,就是因為使用者所屬Windows使用者組設定了拒絕串連SQL
Server,所以不管我是否授予使用者串連SQL Server的許可權,均無法串連SQL Server。
問題2:孤立使用者???
操作描述:
這個是在測試問題1的過程中發現的。當我為Windows使用者組授予了某個資料庫的許可權之後,這個使用者組所屬的使用者也獲得了這個許可權(沒有為使用者顯式授權),這個在問題1中已經結案了。
現在的問題是,當我把Windows使用者組對應的Login(是執行個體層級的Login,不是資料庫層級的User)刪除後,發現這個組對應的Windows使用者(在SQLServer中有對應的Login)還是具有所屬Windows使用者組的許可權。
看起來在刪除Windows使用者組的時候要小心,不但要刪除Login,還要刪除資料庫層級的User。否則可能會因為這個而產生安全性漏洞。
註:
刪除Login的時候,資料庫層級的User不會自動刪除,這種User稱之為孤立使用者。(線上說明上的原文“如果刪除了對應的 SQL Server
登入名稱,則資料庫使用者可能會變為孤立使用者”)。
孤立使用者由於沒有Login,無法產生與之相關的登入,所以一般情況下我們會認為孤立使用者不會影響到安全性。但對於Windows使用者組,看起來就危險了。
問題3:還是孤立使用者???
操作描述:
在問題2的基礎上,發現了一個列有趣的問題。可以直接通過CREATE
USER [xx\xx]
FOR LOGIN [xx\xx]語句,在DB層級上,為Windows使用者組建立User,並且可以授權。這似乎就是人為建立孤立使用者了。