CLR 整合程式碼存取安全性
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
權限之組件所執行的程式碼無法存取外部系統資源,例如檔案、網路、環境變數或登錄。
SAFE
組件具有下列權限和值:
權限 | 值/描述 |
---|---|
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
組件也具有下列權限和值:
權限 | 值/描述 |
---|---|
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
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 登入、執行內容就是原始呼叫端,而且已模擬呼叫端。 | 存取會使用呼叫端安全性內容,而不是服務帳戶。 |
權限集合摘要
下圖將摘要列出授與 SAFE
、EXTERNAL_ACCESS
和 UNSAFE
權限集合的權限與限制。
SAFE |
EXTERNAL_ACCESS |
UNSAFE |
|
Code Access Security Permissions |
僅限 Execute | 對外部資源的 Execute + 存取權 | 不受限制 (包括 P/Invoke) |
Programming model restrictions |
Yes | 是 | 沒有限制 |
Verifiability requirement |
是 | 是 | No |
Local data access |
是 | 是 | 是 |
Ability to call native code |
No | No | 是 |