认识SIDs
SIDs对Windows 2000安全性来说是不可缺少的。SIDs在本章已有所提及,也后续的章节也将再次出现,而现在正是详细认识SIDs的时候。到目前为止,您知道SIDs是安全识别项,它向系统识别信任成员的身分。每个SID是一个代表信任成员的唯一二进制数值。
以下有几个您要熟悉的常见工作:
- 将一个使用者或群组名称转换成SID。
- 为信任成员将SID转换成文字名称。
- 从头建立一个众所周知的SID。这些SID存在所有的系统中,而且指出如Guest或Everybody帐户。
- 复制SID结构。
- 最后,来回地转换代表SID的二进制数值及字串。
SID是个安全识别项以及向系统识别信任成员身分的结构。SID由48个位元值跟随一个32位元之元件数字变数所组成。在文件中,SID通常会以S-R-I-S-S...格式表示(请参阅提要栏位)。
SID格式
SID的格式通常是:S-R-I-S-S...
在这里:
S 如字面所写的「S」,指示这些序号是SID。
R 是SID的修订等级,以一个数字表示(一般是1)。
I 是个48I位元的数字,指示授权单位。
S 是个32位元数字,指示次要的授权单位,亦即大家所知的相对识别项或是RID。
S 是另一个次要授权单位。在SID中可以有任一的次要授权单位数量。
范例: S-1-5-11
从Windows NT 3.1至今,SID结构的修订版本号码已经是1;然而,结构是可能会改变的,我们总有一天会看到2的修定版本。授权单位「号码」指出SID在哪个授权单位之下产生-即什么「实体」拥有SID及管理它的帐户。表9-6提供现在有支援之授权单位清单。
| 表9-6 SID授权单位 |
| 授权单位 | 定义 |
|---|---|
| SECURITY_NULL_SID_ AUTHORITY | 定义为0,这个授权单位被用来建立一个指出无效群组或没有人的SID。 |
| SECURITY_WORLD_SID_ AUTHORITY | 定义为1,这个授权单位被用来建立Everybody群组帐户。 |
| SECURITY_LOCAL_SID_ AUTHORITY | 定义为2,这个授权单位被用来建立众所周知的LOCAL群组帐户。 |
| SECURITY_CREATOR_SID_ AUTHORITY | 定义为3,这个授权单位与Creator Owner SID一起使用。 |
| SECURITY_NON_UNIQUE_ AUTHORITY | 定义为4,这个授权单位被用来产生不是唯一的SIDs。 第一个次要授权单位总是设为SECURITY_NT_NON_UNIQUE,定义为0x15。 |
| SECURITY_NT_AUTHORITY | 定义为5,这个授权单位由Windows 2000系统建立的使用者及群组帐户所使用。 |
次要授权单位是唯一的32位元值,与授权单位的SID相关。下一个次要授权单位是唯一的,与先前的次要授权单位及最后授权单位的SID相关。次要授权单位即大家所知道的RIDs。
表9-7显示一些众所周知的RIDs。(完整的清单请参阅《Platform SDK》文件中的WinNT.h。)和先前列出之授权单位不同的是,这些RIDs并不完全是唯一的,因为它们是唯一与授权单位相关的,就其本身来说,不受授权单位的支配是没有意义的。
| 表9-7 一些众所周知的RIDs |
| RID | 有关的授权单位 | 定义 |
|---|---|---|
| SECURITY_NULL_RID | NULL | 定义为0,这是NULL群组的个别次要授权单位。 |
| SECURITY_WORLD_RID | WORLD | 定义为0,这是Everyone群组的个别次要授权单位。 |
| SECURITY_CREATOR_ OWNER_RID | CREATOR | 定义为0,这是使用者Creator Owner的个别次要授权单位。 |
| SECURITY_CREATOR_ GROUP_RID | CREATOR | 定义为1,这是使用者Creator Group的个别次要授权单位。 |
| SECURITY_CREATOR_ OWNER_SERVER_RID | CREATOR | 定义为2,这是使用者Creator Owner Server的个别次要授权单位。 |
| SECURITY_CREATOR_ GROUP_SERVER_RID | CREATOR | 定义为3,这是使用者Creator Group Server的个别次要授权单位。 |
经由把众所周知的RID与各自的授权单位结合,可以产生大家所熟知的SID。众所周知的SIDs识别系统辨别使用者及被系统定义且经由每个网路上安装Windows 2000的群组身分。表9-8列出一些大家所熟知的SIDs及用法。
| 表9-8 众所周知的SIDs及用法 |
| SID | 常见名称 | 用法 |
|---|---|---|
| S-1-0-0 | Null SID | 指出一个空的或为NULL的群组。它被定义为唯一没有使用者的群组,通常用来指示没有人。 |
| S-1-1-0 | Everyone | 指出一个所有信任成员皆为暗示性成员的群组。这是一个非常重要的SID,对于在系统中建立安全物件的存取清单是有帮助的。它也就是World SID或World群组。 |
| S-1-2-0 | Local SID | 指出一个包括所有本地或实际登入系统的使用者群组。 |
| S-1-3-0 | Creator Owner SID | 为某个物件的建立者充当替代符号(Placeholder)。它与可继承的存取控制清单一起使用。您将在第十章找到更多有关此SID的资讯。 |
| S-1-3-1 | Creator Group SID | 为某个物件的主要群组建立者充当替代符号。它与可继承的存取控制清单一起使用。您将在第十章找到更多有关此SID的资讯。 |
| S-1-5-1 | Dialup | 指出当使用者帐户经由拨接登入Windows 2000系统时,所有使用者帐户自动成为成员的群组。 |
| S-1-5-2 | Network | 指出当使用者帐户经由网路登入Windows 2000系统时,所有使用者帐户自动成为成员的群组。 |
| S-1-5-3 | Batch | 指出当使用者帐户经由批次登入的方式登入Windows 2000系统时,所有使用者帐户自动成为成员的群组。 |
| S-1-5-4 | Interactive | 指出当使用者帐户经由互动式登入Windows 2000系统时,所有使用者帐户自动成为成员的群组。 |
| S-1-5-6 | Service | 指出当使用者帐户以服务的身分登入Windows 2000系统时,所有使用者帐户自动成为成员的群组。 |
| S-1-5-7 | AnonymousLogon | 与无效的会议登入结合。 |
| S-1-5-9 | ServerLogon | 与网域控制站帐户结合。 |
| S-1-5-10 | Self(或Principal Self) | 充当替代符号,并且只适用于存取群组或使用者帐户的清单。当它出现时,指出存取清单申请的信任成员帐户。 |
| S-1-5-11 | Authenticated User | 使用者指出一个所有目前被认证的使用者帐户是暗示性成员的群组。 |
| S-1-5-13 | Terminal Server | 与登入终端服务器的使用者关联。 |
| S-1-5-18 | LocalSystem | 这个有许多服务皆在其下执行的特别帐户,存在于所有的Windows 2000系统中。有关更多的资讯,请参阅 第十一章 。 |
您偶尔才会看到这些SIDs。熟悉这些系统内建的信任成员是好的,SID本身的资料结构定义如下:
typedef struct _SID {
BYTE Revision;
BYTE SubAuthorityCount;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
DWORD SubAuthority[ANYSIZE_ARRAY];
}SID;这个结构的每个成员现在对您来说应该是熟悉的。ANYSIZE_ARRAY定义为1,主要是表示结构不一定仅以单一的DWORD代表一个次要授权单位以作为结尾。尽管SID结构的本身非常清楚,它是个「不透明的」资料结构,而且应该只使用提供的系统函数来操作。这个不透明特性给予Microsoft开发人员在未来改变SID内部结构的自由。您的软件应该跟随这个规则。
建立SIDs
您通常会为众所周知的信任成员建立SIDs,例如Everyone群组。您会经由查询授权单位及信任成员的值来为讨论中的信任成员建立一个SID,并且将它们传递给AllocateAndInitializeSid函数:
BOOL AllocateAndInitializeSid(
PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
BYTE nSubAuthorityCount,
DWORD dwSubAuthority0,
DWORD dwSubAuthority1,
DWORD dwSubAuthority2,
DWORD dwSubAuthority3,
DWORD dwSubAuthority4,
DWORD dwSubAuthority5,
DWORD dwSubAuthority6,
DWORD dwSubAuthority7,
PSID* ppSid);
您应该认识这些参数的用途,值得一提的是,第一个PidentifierAuthority参数,该参数为您正在建立的SID识别授权单位的值。PidentifierAuthority参数是SID_IDENTIFIER_AUTHORITY的类型,被定义为6个位元组的阵列。这看起来有点棘手,但值得庆幸的是《Platform SDK》文件定义了这些有用的SID授权单位。您应该传递表9-6中显示的其中一个值,例如SECURITY_NT_AUTHORITY。
第二个值得注意的参数为nSubAuthorityCount,指出您为SID请求的次要授权单位数量。尽管系统已经定义这个值SID_MAX_SUB_AUTHORITIE为15,AllocateAndInitializeSid将只会以8或更少的次要授权单位来建立SIDs。
