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主機原則層級授與元件的程式碼存取安全性許可權集合,取決於建立元件時所指定的許可權集合。 有三個許可權集合:SAFEEXTERNAL_ACCESSUNSAFE (使用CREATE ASSEMBLY (Transact-SQL) ) 的PERMISSION_SET 選項來指定。

SQL Server 在裝載 CLR 時,會提供主機層級安全性原則層級給 CLR,此原則是兩個永遠有效之原則層級下的額外原則層級。 此原則是針對SQL Server所建立的每個應用程式域設定。 此原則不適用於在 SQL Server 建立 CLR 執行個體時所生效的預設應用程式定義域。

SQL Server主機層級原則是系統元件SQL Server固定原則的組合,以及使用者元件的使用者指定原則的組合。

CLR 組件及 SQL Server 系統組件的固定原則授予它們完全的信任。

SQL Server主機原則的使用者指定部分是以每個元件指定三個許可權貯體之一的元件擁有者為基礎。 如需底下所列之安全性權限的詳細資訊,請參閱 .NET Framework SDK。

SAFE

僅允許內部計算和本機資料存取。 SAFE 是最嚴格的許可權集合。 具有 SAFE 許可權的元件所執行的程式碼無法存取外部系統資源,例如檔案、網路、環境變數或登錄。

SAFE 元件具有下列許可權和值:

權限 值/描述
SecurityPermission 執行: 執行 Managed 程式碼的許可權。
SqlClientPermission 內容連接 = true內容連接 = 是:只能使用內容連線,而連接字串只能指定 「coNtext connection=true」 或 「coNtext connection=yes」 的值。

AllowBlankPassword = false: 不允許空白密碼。

EXTERNAL_ACCESS

EXTERNAL_ACCESS元件具有與 SAFE 元件相同的許可權,而且能夠存取外部系統資源,例如檔案、網路、環境變數和登錄。

EXTERNAL_ACCESS 元件也有下列許可權和值:

權限 值/描述
DistributedTransactionPermission 無限制: 允許分散式交易。
DNSPermission 無限制: 從功能變數名稱伺服器要求資訊的許可權。
EnvironmentPermission 無限制: 允許完整存取系統和使用者環境變數。
EventLogPermission 管理: 允許下列動作:建立事件來源、讀取現有的記錄檔、刪除事件來源或記錄、回應專案、清除事件記錄檔、接聽事件,以及存取所有事件記錄檔的集合。
FileIOPermission 無限制: 允許完整存取檔案和資料夾。
KeyContainerPermission 無限制: 允許完整存取金鑰容器。
NetworkInformationPermission 訪問: 允許 Ping。
RegistryPermission 允許讀取權限 HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINEHKEY_CURRENT_USERHKEY_CURRENT_CONFIGHKEY_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_ACCESSUNSAFE 元件完全相同。 不過, EXTERNAL_ACCESS 元件提供不在 UNSAFE 元件中的各種可靠性和健全性保護。

指定UNSAFE可讓元件中的程式碼對SQL Server進程空間執行不合法的作業,因此可能會危害SQL Server的健全性和延展性。 如需在 SQL Server 中建立 CLR 元件的詳細資訊,請參閱管理 CLR 整合元件

重要事項

SQL Server包含資料庫引擎用來提供特定功能的 CLR 元件。 SQL Server Microsoft.SQLServer.Types 安裝隨附的元件會顯示在中繼資料中作為UNSAFE元件。 這是原廠設定。 這些元件預設會被視為受信任的 & 安全。

存取外部資源

如果使用者定義型別 (UDT) 、預存程式或其他建構元件類型向 SAFE 許可權集合註冊,則建構中執行的 Managed 程式碼無法存取外部資源。 不過,如果指定EXTERNAL_ACCESSUNSAFE許可權集合,且 Managed 程式碼嘗試存取外部資源,SQL Server會套用下列規則:

如果 結果為
執行內容對應至 SQL Server 登入。 拒絕存取外部資源的嘗試,並引發安全性例外狀況。
執行內容對應至 Windows 登入,並且執行內容是原始呼叫端。 在 SQL Server 服務帳戶的安全性內容下存取外部資源。
呼叫端不是原始呼叫端。 拒絕存取並引發安全性例外狀況。
執行內容會對應至 Windows 登入、執行內容就是原始呼叫端,而且已模擬呼叫端。 存取會使用呼叫端安全性內容,而不是服務帳戶。

權限集合摘要

下圖摘要說明授與 SAFEEXTERNAL_ACCESSUNSAFE 許可權集合的限制和許可權。

功能 安全 EXTERNAL_ACCESS 安全
代碼啟用安全性許可權 僅限 Execute 對外部資源的 Execute + 存取權 不受限制 (包括 P/Invoke)
程式設計模型限制 Yes Yes 沒有限制
可驗證性需求 Yes
本機資料存取 Yes Yes Yes
呼叫機器碼的能力

另請參閱

CLR 整合安全性
主機保護屬性和 CLR 整合程式設計
CLR 整合程式設計模型限制
CLR 主控環境