在 SQL Server 中簽署預存程序 (ADO.NET)
從 SQL Server 2005 開始,您可以使用憑證或非對稱金鑰來簽署預存程序 (Stored Procedure)。 這是針對無法透過擁有權鏈結繼承權限或擁有權鏈結中斷 (例如動態 SQL) 的案例所設計。 然後,您可以建立對應至憑證的使用者,並授與該預存程序需要存取之物件的權限給憑證使用者。
執行此預存程序時,SQL Server 會結合憑證使用者的權限與呼叫端的權限。 與 EXECUTE AS 子句不同的是,它不會變更程序的執行內容。 傳回登入和使用者名稱的內建函式會傳回呼叫端的名稱,而非憑證使用者名稱。
數位簽章是指使用簽署者之私密金鑰 (Private Key) 加密的資料摘要。 私密金鑰可確保數位簽章對於其 Bearer 或擁有者而言是唯一的。 您可以簽署預存程序、函式或觸發程序 (Trigger)。
注意事項 |
---|
您可以在 master 資料庫中建立憑證,以便授與伺服器層級權限。 |
建立憑證
當您使用憑證來簽署預存程序時,系統會使用私密金鑰來建立資料摘要,其中包含預存程序程式碼的加密雜湊。 在執行階段中,系統會使用公開金鑰 (Public Key) 來解密資料摘要,並與預存程序的雜湊值 (Hash Value) 進行比較。 修改預存程序會讓雜湊值無效,因而導致數位簽章不再相符。 這樣做可防止沒有私密金鑰存取權的人員變更預存程序程式碼。 因此,每次修改程序時,您就必須重新簽署程序。
簽署模組包含四個步驟:
使用 Transact-SQL CREATE CERTIFICATE [certificateName] 陳述式來建立憑證。 這個陳述式具有許多設定開始和結束日期與密碼的選項。 預設的到期日是一年。
使用 Transact-SQL CREATE USER [userName] FROM CERTIFICATE [certificateName] 陳述式來建立與憑證相關聯的資料庫使用者。 這位使用者僅存在資料庫中,而且與登入沒有任何關聯。
授與資料庫物件的必要權限給憑證使用者。
注意事項 |
---|
憑證無法授與權限給擁有使用 DENY 陳述式撤銷之權限的使用者。DENY 的優先順序永遠高於 GRANT,可防止呼叫端繼承授與憑證使用者的權限。 |
- 使用 Transact-SQL ADD SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName] 陳述式並搭配憑證來簽署程序。
外部資源
如需詳細資訊,請參閱下列資源。
資源 |
描述 |
---|---|
模組簽署 (英文),《SQL Server 2008 線上叢書》 |
說明模組簽署,並提供範例案例以及相關 Transact-SQL 主題的連結。 |
模組簽署,《SQL Server 2005 線上叢書》 |
說明模組簽署,並提供範例案例以及相關 Transact-SQL 主題的連結。 |
使用憑證簽署預存程序,《SQL Server 2005 線上叢書》 |
提供使用憑證來簽署預存程序的教學課程。 |
請參閱
概念
SQL Server 中的應用程式安全性案例 (ADO.NET)
在 SQL Server 中使用預存程序管理權限 (ADO.NET)
在 SQL Server 中撰寫安全的動態 SQL (ADO.NET)
使用 SQL Server 中的模擬來自訂權限 (ADO.NET)