CLR 整合代碼存取安全性
適用於:SQL Server
Common Language Runtime (CLR) 支援安全性模型,稱為 Managed 程式代碼的程式碼存取安全性。 在此模型中,會根據程式碼的身分識別,將許可權授與元件。 如需詳細資訊,請參閱 .NET Framework 軟體開發工具包中的一節。
決定授與元件許可權的安全策略定義於三個不同的位置:
計算機原則:這是在安裝 SQL Server 之電腦上執行的所有 Managed 程式代碼生效的原則。
用戶原則:這是進程所裝載之 Managed 程式代碼生效的原則。 針對 SQL Server,用戶原則是 SQL Server 服務執行所在的 Windows 帳戶專屬。
主機原則:這是 CLR 主機所設定的原則(在此案例中為 SQL Server),對於在該主機中執行的 Managed 程式代碼有效。
CLR 所支援的程式代碼存取安全性機制是以運行時間可以同時裝載完全信任和部分信任程式代碼的假設為基礎。 受 CLR 程式代碼存取安全性保護的資源通常會由需要對應許可權的 Managed 應用程式程式設計介面包裝,再允許存取資源。 只有在呼叫堆疊中的所有呼叫端(在元件層級)都有對應的資源許可權時,才會滿足許可權的需求。
在 SQL Server 內執行時授與給 Managed 程式代碼的程式代碼存取安全性許可權集合,是上述三個原則層級所授與之許可權集合的交集。 即使 SQL Server 將一組許可權授與 SQL Server 中載入的元件,使用者和計算機層級原則可能會進一步限制提供給使用者程式代碼的最終許可權集。
SQL Server 主機原則層級許可權集合
SQL Server 主機原則層級授與元件之元件的程式代碼存取安全性許可權集合是由建立元件時所指定的許可權集合所決定。 有三個許可權集合:SAFE、EXTERNAL_ACCESS 和 UNSAFE(使用 CREATE ASSEMBLY (Transact-SQL) 的 PERMISSION_SET 選項指定)。
SQL Server 會在裝載 CLR 時提供主機層級的安全策略層級;此原則是兩個原則層級以下的額外原則層級,且一律有效。 此原則是針對 SQL Server 所建立的每個應用程式域所設定。 此原則不適用於 SQL Server 建立 CLR 實例時生效的預設應用程式域。
SQL Server 主機層級原則是系統元件的 SQL Server 固定原則,以及使用者元件的使用者指定原則的組合。
CLR 元件和 SQL Server 系統元件的固定原則會授與他們完全信任。
SQL Server 主機原則的使用者指定部分是以元件擁有者為基礎,為每個元件指定三個許可權貯體之一。 如需下列安全性許可權的詳細資訊,請參閱 .NET Framework SDK。
SAFE
只允許內部計算和本機數據存取。 SAFE 是最嚴格的許可權集合。 具有 SAFE 許可權的元件所執行的程式代碼無法存取外部系統資源,例如檔案、網路、環境變數或登錄。
SAFE 元件具有下列許可權和值:
權限 | Value(s)/Description |
---|---|
SecurityPermission | 執行: 執行 Managed 程式代碼的許可權。 |
SqlClientPermission | 內容連接 = true,內容連接 = 是:只能使用內容連線,而 連接字串 只能指定 “context connection=true” 或 “context connection=yes” 的值。 AllowBlankPassword = false: 不允許空白密碼。 |
EXTERNAL_ACCESS
EXTERNAL_ACCESS元件具有與 SAFE 元件相同的許可權,並能夠存取外部系統資源,例如檔案、網路、環境變數和登錄。
EXTERNAL_ACCESS元件也有下列權限和值:
權限 | Value(s)/Description |
---|---|
DistributedTransactionPermission | 不受限制: 允許分散式交易。 |
DNSPermission | 不受限制: 從功能變數名稱伺服器要求信息的許可權。 |
EnvironmentPermission | 不受限制: 允許完整存取系統和用戶環境變數。 |
EventLogPermission | 管理:允許下列動作: 建立事件來源、讀取現有的記錄、刪除事件來源或記錄、響應專案、清除事件記錄檔、接聽事件,以及存取所有事件記錄檔的集合。 |
FileIOPermission | 不受限制: 允許完整存取檔案和資料夾。 |
KeyContainerPermission | 不受限制: 允許完整存取密鑰容器。 |
NetworkInformationPermission | 存取: 允許 Ping。 |
RegistryPermission | 允許讀取許可權HKEY_CLASSES_ROOT、HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER、HKEY_CURRENT_CONFIG和HKEY_USERS。 |
SecurityPermission | 判斷提示: 判斷提示此程式碼的所有呼叫端都有作業的必要許可權。 ControlPrincipal: 操作主體物件的能力。 執行: 執行 Managed 程式代碼的許可權。 SerializationFormatter: 提供串行化服務的能力。 |
SmtpPermission | 存取: 允許對 SMTP 主機埠 25 的輸出連線。 |
SocketPermission | 線上: 允許傳輸位址上的輸出連線(所有埠、所有通訊協定)。 |
SqlClientPermission | 不受限制: 允許完整存取數據源。 |
StorePermission | 不受限制: 允許完整存取 X.509 證書存儲。 |
WebPermission | 線上: 允許對 Web 資源的輸出連線。 |
UNSAFE
UNSAFE 允許元件不受限制地存取 SQL Server 內外的資源。 從 UNSAFE 元件內執行的程式代碼也可以呼叫 Unmanaged 程式代碼。
UNSAFE 元件會獲得 FullTrust。
建議的許可權設定
SAFE 是元件的建議許可權設定,這些元件會執行計算和數據管理工作,而不需要存取 SQL Server 外部的資源。
EXTERNAL_ACCESS建議用於存取 SQL Server 外部資源的元件。 EXTERNAL_ACCESS元件預設會以 SQL Server 服務帳戶的形式執行。 EXTERNAL_ACCESS程式代碼可以明確模擬呼叫者的 Windows 驗證安全性內容。 因為預設值是執行為 SQL Server 服務帳戶,因此執行EXTERNAL_ACCESS的許可權應該只授與信任的登入,才能以服務帳戶的形式執行。
從安全性的觀點來看, EXTERNAL_ACCESS 和 UNSAFE 元件都相同。 不過,EXTERNAL_ACCESS元件提供不在 UNSAFE 元件中的各種可靠性和強固性保護。
指定 UNSAFE 可讓元件中的程式代碼對 SQL Server 進程空間執行非法作業,因此可能會危害 SQL Server 的健全性和延展性。 如需在 SQL Server 中建立 CLR 元件的詳細資訊,請參閱 管理 CLR 整合元件。
重要
SQL Server 包含資料庫引擎用來提供特定功能的 CLR 元件。 Microsoft.SQLServer.Types
SQL Server 安裝隨附的元件會以 UNSAFE 元件的形式出現在元數據中。 這是原廠設定。 根據預設,這些元件會被視為受信任且安全。
存取外部資源
如果使用者定義型別 (UDT)、預存程式或其他類型的建構元件向 SAFE 許可權集合註冊,則建構中執行的 Managed 程式代碼將無法存取外部資源。 不過,如果 指定EXTERNAL_ACCESS 或 UNSAFE 許可權集合,且 Managed 程式代碼嘗試存取外部資源,SQL Server 會套用下列規則:
如果 | 結果為 |
---|---|
執行內容會對應至 SQL Server 登入。 | 嘗試存取外部資源會遭到拒絕,並引發安全性例外狀況。 |
執行內容會對應至 Windows 登入,而執行內容是原始呼叫端。 | 外部資源是在 SQL Server 服務帳戶的安全性內容下存取。 |
呼叫端不是原始呼叫端。 | 存取遭到拒絕,並引發安全性例外狀況。 |
執行內容會對應至 Windows 登入,而執行內容是原始呼叫端,且呼叫端已模擬。 | Access 使用呼叫端安全性內容;不是服務帳戶。 |
許可權集合摘要
下圖摘要說明授與 SAFE、EXTERNAL_ACCESS 和 UNSAFE 許可權集的限制和許可權。
功能 | 安全 | EXTERNAL_ACCESS | 不安全的 |
---|---|---|---|
代碼存取安全性許可權 | 僅限執行 | 執行 + 存取外部資源 | 不受限制 (包括 P/Invoke) |
程式設計模型限制 | Yes | Yes | 無限制 |
可驗證性需求 | Yes | .是 | No |
本機數據存取 | Yes | .是 | Yes |
呼叫原生程式碼的能力 | No | 無 | .是 |