目錄
- AuthorizationRule:基本ACE
- AccessRule:ACE(DACL中)
- AuditRule:ACE(SACL中)
- 本地ACE實體物件
- ObjectSecurity:SD(DACL, SACL)
- CommonObjectSecurity和NativeObjectSecurity
- 本地實體SD
注意
.NET Framework 2.0中才加入了託管的安全存取控制API。文章中的類都是位於System.Security.AccessControl命名空間內。也有部分類位於System.Security.Principal中。
此文章需要讀者對安全存取控制基本概念已經熟悉。因此文章就不介紹基本概念的意義,只講解.NET中的概念執行映射。
返回目錄
AuthorizationRule:基本ACE
先看存取控制中最基本元素:ACE(Access Control Entry:存取控制項目)儲存在ACL(Access Control List:存取控制表)中,無論是後面要講的那種列表中的ACE,ACE本質是針對一個安全性主體的,因此安全性主體標識的儲存是必須的。
.NET中的基本抽象ACE名稱是抽象類別:AuthorizationRule(授權規則)。
來自己看看這個AuthorizationRule類(抽象類別,僅繼承自Object類)
//基本ACE
abstract class AuthorizationRule
//屬性(屬性名稱:類型名稱)
IdentityReference: IdentityReference;
//所針對的安全性主體的標識
//System.Security.Principal.IdentityReference類
InheritanceFlags: InheritanceFlags;
//控制繼承選項
IsInherited: bool;
//本對象是繼承過來的(還是顯示設定的)?
AccessMask: int;
//該ACE代表的許可權直。不管是訪問規則還是審查規則的許可權都會被轉換成int儲存在這個屬性裡。
IdentityReference屬性儲存區ACE中的安全性主體標識,在Windows安全控制體系中,以使用者標識SID儲存,在.NET中你可以使用SecurityIdentifier來代表SID,或者用NTAccount類來以使用者賬戶名稱來代表安全性主體標識。SecurityIdentifier和NTAccount類都是繼承與IdentityReference類的, 並且可以通過Translate方法互轉。(都在System.Security.Principal命名空間內)
感覺有些抽象?看下面ACE的實際執行,上面抽象ACE的屬性就可以熟悉了。
返回目錄
AccessRule:ACE(DACL中)
DACL中的ACE(常提到的ACE多指這個)儲存安全性實體中的存取控制資訊。既然是存取控制,缺不了3大主體:
- 針對的安全性主體(使用者賬戶)
- 所涉及到的許可權
- 規則類型(允許還是拒絕)
.NET中的AccessRule類型代表著DACL中的此類ACE,他繼承與ACE基類(上面講的AuthorizationRule),此時變可以把AuthorizationRule繼承下來的屬性得到實際應用:
- 針對的安全性主體(使用者賬戶):基類AuthorizationRule的IdentityReference屬性
- 所涉及到的許可權:不同AccessRule有自己的許可權枚舉(名稱類似xxxRights),但最終會被儲存在基類AuthorizationRule的AccessMask屬性
- 規則類型(允許還是拒絕):對應AccessRule的屬性AccessControlType。值是AccessControlType枚舉(Allow或Deny)
所以AccessRule類由於繼承了基類AuthorizationRule,自己本身很簡單,只有一個外加屬性:
[Flags]
enum AccessControlType
Allow, Deny
//DACL中的ACE
abstract class AccessRule: AuthorizationRule
//屬性(屬性名稱:類型名稱)
AccessControlType: AccessControlType;
返回目錄
AuditRule:ACE(SACL中)
SACL(系統ACL)也在安全描述項中儲存,它的ACE不是進行存取控制的,而是針對安全性主體與系統的的審查資訊。如果審查規則被啟用,指定安全性實體被訪問或拒絕後相關資訊會被系統錄入安全事件薄中。
同控制訪問規則AccessRule一樣,.NET中的審查規則類:AuditRule也繼承AuthorizationRule類。ACE的安全性主體標識儲存在基類AuthorizationRule的IdentityReference屬性中,不同AuditRule也有自己的許可權枚舉(同相應的AccessRule使用同一個枚舉,名稱類似xxxRights),枚舉值最後也會被儲存在基類AuthorizationRule的AccessMask屬性上。
AuditRule類:
[Flags]
enum AuditFlags
//用來指定審查類型
None, //不審查
Success,//成功訪問後審查
Failure //拒絕訪問後審查
class AuditRule: AuthorizationRule
//屬性(屬性名稱:類型名稱)
AuditFlags: AuditFlags;
//審查類型
返回目錄
本地ACE實體物件
研究了半天的ACE的各種抽象基類,以及DACL和SACL的ACE。實際情況中,我們只會使用他們的衍生類別。
AccessRule有以下衍生類別:
System.Security.AccessControl.CryptoKeyAccessRule
System.Security.AccessControl.EventWaitHandleAccessRule
System.Security.AccessControl.FileSystemAccessRule
System.Security.AccessControl.MutexAccessRule
System.Security.AccessControl.ObjectAccessRule
System.Security.AccessControl.RegistryAccessRule
System.Security.AccessControl.SemaphoreAccessRule
AuditRule有以下衍生類別:
System.Security.AccessControl.CryptoKeyAuditRule
System.Security.AccessControl.EventWaitHandleAuditRule
System.Security.AccessControl.FileSystemAuditRule
System.Security.AccessControl.MutexAuditRule
System.Security.AccessControl.ObjectAuditRule
System.Security.AccessControl.RegistryAuditRule
System.Security.AccessControl.SemaphoreAuditRule
就拿常用的FileSystemAccessRule和FileSystemAuditRule來說的,他們的權限類別型都是FileSystemRights枚舉。
返回目錄
ObjectSecurity:SD(DACL, SACL)
研究完了ACE,接著看儲存ACE的地方。SD(Security Descriptor:安全描述項),他附加在Securable Object上。包含DACL和SACL(還包含其他資訊,比如對應Securable Object的建立者的SID)。.NET中的存取控制類庫很好的封裝了底層API的執行,使用一個類就可以代表安全描述項(SD),並且在其內操作DACL,SACL。
SD的基類是:System.Security.AccessControl.ObjectSecurity類。
相比ACE,SD的類別檢視較大,可以參考(ObjectSecurity的衍生類別)
ObjectSecurity類:
//SD基類,用來操作DACL和SACL
abstract class ObjectSecurity
//方法
bool ModifyAccessRule(AccessControlModification,
AccessRule,
out bool isModified);
//修改DACL
bool ModifyAudit(AccessControlModification,
AuditRule,
out bool isModified);
//修改SACL
//傳回值和isModified參數一樣,都指是否被修改成功
//屬性(屬性名稱:類型名稱)
AccessRuleType: Type;
//存取控制規則類型,比如FileSystemAccessRule
AuditRuleType: Type;
//審查規則類型,比如FileSystemAuditRule
AccessRightType: Type;
//存取權限類型,比如FileSystemRights枚舉
AccessRuleType,AuditRuleType和AccessRightType都是派生實體類會改寫的屬性,比如FileSystemSecurity會將這三個屬性改寫成FileSystem的存取控制類型,審查類型和具體許可權枚舉類型。
ObjectSecurity的核心就在上面那個ModifyAccessRule和ModifyAuditRule,很顯然這兩個方法一個針對AccessRule一個針對AuditRule。而操作類型就是這個
AccessControlModification枚舉。希望讀者參考MSDN:http://msdn.microsoft.com/zh-cn/library/system.security.accesscontrol.accesscontrolmodification.aspx。我就不重複MSDN的話了。
返回目錄
CommonObjectSecurity和NativeObjectSecurity
CommonObjectSecurity繼承ObjectSecurity,它沒有添加任何實質內容,許多方法都調用基類ObjectSecurity的ModifyAccessRule或ModifyAuditRule,然後根據AccessControlModification枚舉的不同定義了不同的簡化方法。比如AddAccessRule和AddAuditRule用來添加控制訪問規則或審查規則。還有Setxxx,Removexxx……等諸多簡化方法。
NativeObjectSecurity繼承CommonObjectSecurity,在CommonObjectSecurity的基礎上,進一步加入了Windows本地SD的模型。
比如ResourceType枚舉,可以標識SD所付對象的類型。(比如常見的檔案對象,註冊表索引值,Windows服務,印表機等等)
返回目錄
本地實體SD
同ACE一樣,本地SD的ACL類型也是繼承自抽象SD基類。並且幾乎適合本地ACE實體一一對應的。有一個特例,ACE中檔案系統的對象只有FileSystemAccessRule或AuditRule。但是SD的ACL類型雖然也有FileSystemSecurity,但是屬抽象類別,其衍生類別:DirectorySecurity和FileSecurity才是最終可以使用的對象。究其原因,除了名稱分別指檔案名稱和檔案夾名外。ObjectSecurity的IsContainer屬性在DirectorySecurity中是True的,而在FileSecurity中是False的。
NativeObjectSecurity是所有其他本地實體SD的基類,它的衍生類別有:
System.Security.AccessControl.CryptoKeySecurity
System.Security.AccessControl.EventWaitHandleSecurity
System.Security.AccessControl.FileSystemSecurity
System.Security.AccessControl.MutexSecurity
System.Security.AccessControl.ObjectSecurity(Of T)
System.Security.AccessControl.RegistrySecurity
System.Security.AccessControl.SemaphoreSecurity
(其中FileSystemSecurity又派生FileSecurity和DirectorySecurity類)