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