CLR 整合程式碼存取安全性
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 時,會將主機層級的安全性原則層級提供給該 CLR;這項原則是在永遠會實行之兩個原則層級之下的另一個原則層級。SQL Server 建立的每一個應用程式網域都會設定此原則。此原則不適用於當 SQL Server 建立 CLR 執行個體時所生效的預設應用程式網域。
SQL Server 主機層級原則是系統組件的 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 程式碼。
FullTrust 會提供給 UNSAFE 組件。
安全性注意事項 |
---|
對於執行計算和資料管理工作而不存取 SQL Server 以外之資源的組件而言,SAFE 是建議的權限設定。對於存取 SQL Server 以外之資源的組件而言,EXTERNAL_ACCESS 是建議的選項。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 整合組件>。 |
存取外部資源
如果使用者定義型別 (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 |
僅限 Execute |
對外部資源的 Execute + 存取權 |
不受限制 (包括 P/Invoke) |
Programming model restrictions |
是 |
是 |
無限制 |
Verifiability requirement |
是 |
是 |
否 |
Local data access |
是 |
是 |
是 |
Ability to call native code |
否 |
否 |
是 |