天天看點

MSSQL 2005 權限設定安全機制

  當你使用CREATE ASSEMBLY語句把一個程式集加載到一個資料庫中時,SQL Server提供了三種權限集級别:SAFE,EXTERNAL_ACCESS和UNSAFE。

    下面是一個典型的語句,它實作安裝位于FileLoader.dll檔案内的一個程式集,并且賦予它EXTERNAL_ACCESS權限集。

    CREATE ASSEMBLY FileAccess     FROM 'E:FileLoader.dll'     WITH PERMISSION_SET = EXTERNAL_ACCESS   GO   在代碼執行時,每一種權限集級别都授予該代碼一組不同的CAS許可權集。下面讓我們開始讨論在每一級上授予的特定許可權。

    (1) SAFE

    SAFE是預設的權限集。它僅授予足夠的許可權來執行代碼,實作不要求存取外部資源的内部計算以及存取在宿主SQL Server執行個體中的資料和對象。注意,SAFE代碼不能存取外部的資源,是以它不能讀取或寫磁盤檔案,不能存取任何其它SQL Server執行個體,或讀取或寫系統資料庫。而且,該代碼也必須被檢驗為類型安全的,這将有助于避免各種包括緩沖區溢出在内的攻擊。

    SAFE代碼是更可靠和安全的SQLCLR代碼。它能夠實作用T-SQL書寫的代碼在資料庫和伺服器執行個體内所能實作的幾乎一樣的功能。它能夠授予如表格1所列舉的CAS許可權。從表格1中可見,該代碼能夠運作和讀取宿主SQL Server執行個體中的對象和資料-借助于一種特定形式的ADO.NET連接配接串,或者是"context connection=true"或者是"context connection=yes"來實作。任何其它連接配接串都可能會導緻某種安全異常。

    表格1:授予給SAFE程式集的權限集。

    權限類型限制

    SecurityPermission 受限制執行

    SqlClientPermission受限制不能是空密碼,隻能使用上下文連接配接串

    授予給一個程式集的結果權限集是列舉于表格1中的許可權權限集與來自企業、機器和使用者權限集的交集。因為這些級别預設會擁有所有的許可權,是以程式集僅接受列舉于表格1中的權限。注意,請確定你一定要了解這些權限。

    (2) EXTERNAL_ACCESS

    與SAFE相比,EXTERNAL_ACCESS權限集允許有限制地存取存在于SQL Server執行個體外部的資源-包括磁盤檔案,在其它SQL Server執行個體中的資料和對象,環境變量和系統資料庫的一些部分。存取這些其它資源通常是在SQL Server服務帳戶的安全上下文中進行的,但是,該代碼能夠模拟其它使用者進行存取。這個級别授予列舉于表格2中的許可權。

    表格2:授予給EXTERNAL_ACCESS程式集的權限集。

    EnviromentPermission不受限制-

    FileIOPermission不受限制-

    RegistryPermission受限制僅能以讀方式存取HKEY_CLASSES_ROOT,HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_CURRENT_CONFIG和HKEY_USER

    SecurityPermission受限制Assertion,Execution,SerializationFormatter,ControlPrincipal

    KeyContainerPermission不受限制-

    SqlClientPermission不受限制-

    EventLogPermission受限制僅限于本地主機且僅限于系統管理者

    DnsPermission不受限制-

    SocketPermission受限制僅限于IP位址

    WebPermission受限制僅能通過HTTP存取本地主機

    SmtpPermission受限制僅能進行連接配接存取

    DistributedTransactionPermission 不受限制-

    NetworkInformationPermission受限制僅能通過Ping方式存取

    StorePermission不受限制-

    上面不受限制的FileIOPermission可能看起來有點令人擔心,因為,它意味着,從CLR的角度來看,代碼能存取磁盤上的任何位置。但是切記,該代碼仍然運作于本地服務帳戶的作業系統安全限制下。是以如果該帳戶不能存取一個檔案的話,那麼SQLCLR代碼也不能存取。

    典型地,本地服務帳戶是一種具有極強權限的帳戶,是以存在濫用的可能性。為此,我們一般把對這些程式集的存取權限僅授予那些具有服務帳戶信任度的登入并且不使用本地系統帳戶作為SQL Server的服務帳戶。

    值得注意的是,借助于EXTERNAL_ACCESS權限集,你可以使用一個更傳統型的ADO.NET連接配接串來連接配接到在同一個SQL Server執行個體(SQLCLR代碼在其中運作)中的一個資料庫。這需要SqlClientPermission以便你能夠使用一個除了"上下文連接配接"串以外的連接配接-用以讀取目前執行個體中的資料,指定通常的伺服器命名,憑證,等等。然而,我也無法找到為什麼你要這樣做的理由,但是既然我們可以進行選擇,也是一件好事,對嗎?

    (3) UNSAFE

    這個UNSAFE權限集是賦予所有權限的SQLCLR等價物,在這種情況下,CLR挂起所有的許可權檢查。它接受單個的不受限制的SecurityPermission權限,這是CLR的授予所有權限的方式。

    潛在地,一個UNSAFE程式集能夠完成各種"危險性"的動作,因為它屬于内在地被信任的代碼。例如,它能調用非托管代碼,例如COM元件和原始Win32 API。它還受限于服務帳戶的作業系統許可權,但是CLR不會限制它存取任何資源的能力。

    因為UNSAFE是如此的不安全,是以,隻有一個sysadmin能夠建立這種類型的程式集。

繼續閱讀