Naming Context和Application Partitions

目录

Naming Context

Domain NC(DomainName NC) 

Configuration NC(Configuration NC)

Schema NC(Schema NC)

LDAP 中的类和继承

Schema NC中的类

Schema NC中的属性

Application Partitions


Naming Context

首先有一点得明确,Active Directory具有分布式特性,一个林中有若干个域,每个域内有若干台域控,每台域控有一个独立的Active Directory。这个时候就有必要将数据隔离到多个分区中,如果不隔离的话,则每个域控制器都必须复制林中的所有数据。若隔离为若干个分区之后,就可以有选择性的复制某几个分区。微软将Active Directory划分为若干个分区(这个分区我们称为Naming Context,简称NC),每个Naming Context都有其自己的安全边界。

Active Directory预定义了三个Naming Context:

  • Configuration NC(Configuration NC)
  • Schema NC(Schema NC)
  • Domain NC(DomainName NC)

我们使用ADExplorer连接进来就可以看到这三个(后面两个是引用程序分区)

Naming Context和Application Partitions

我们来简单的介绍下这三个Naming Context5

Domain NC(DomainName NC) 

每个域都有一个域Naming Context,不同的域内有不同的域Naming Context,其中包含特定域的数据。这个域Naming Context的根由域的专有名称(DN)表示,比如corp.xie.com域的DN将为dc=corp,dc=xie,dc=com。之前我们说过,域内的所有计算机,所有用户的具体信息都存在Active Directory底下,具体来说,就是在Active Directory的这个域Naming Context里面。我们用工具查看的默认Naming Context选的也是这个Naming Context。后面对域内很多东西的查看都在这个域Naming Context里面。下面我们来看看这个Naming Context的*容器有哪些。

Naming Context和Application Partitions

RDN 说明
CN=Builtin

内置本地安全组的容器,包括管理员,域用户和账号操作员等等

CN=Computers

机器用户的容器,包括加入域的所有机器
OU=Domain Controllers 域控制器的容器,包括域内所有域控

CN=ForeignSecurityPrincipals

代表域中来自森林外部域的组中的成员
CN=Keys Server 2016之后才有,关键凭证对象的默认容器
CN=Managed Service Accounts 托管服务帐户的容器
CN=System 各种预配置对象的容器。包括信任对象,DNS对象和组策略对象
CN=TPM Devices 可信平台模块(TPM)**的恢复信息的容器。
CN=Users 用户和组对象的默认容器

Configuration NC(Configuration NC)

配置NC,林配置信息的主要存储库,包含有关站点,服务,分区和Active DirectorySchema 的信息,并被复制到林中的每个域控制器。配置NC的根位于配置容器中,该容器是林根域的子容器。例如,xie.com 林的 Configuration NC 为 CN=Configuration,DC=xie,DC=com

下面我们来看看这个Naming Context的*容器有哪些。

Naming Context和Application Partitions

RDN 说明
CN=DisplaySpecifiers 定义了Active Directory管理单元的各种显示格式
CN=Extended-Rights 扩展权限对象的容器,我们将在域内ACL那篇文章里面详解
CN=ForestUpdates 包含用于表示森林状态和与域功能级别更改的对象
CN=Partitions 包含每个Naming Context,Application Partitions以及外部LDAP目录引用的对象
CN=Physical Locations 包含位置对象,可以将其与其他对象关联 以表示该对象的位置。
CN=Services 存储有关服务的配置信息,比如文件复制服务
CN=Sites 包含所有站点拓扑和复制对象
CN=WellKnown Security Principals 包含常用的外部安全性主题的对象,比如Anonymous,Authenticated Users,Everyone等等

Schema NC(Schema NC)

   包含Schema 信息,该Schema 信息定义Active Directory中使用的类,对象和属性。与域NC和配置 NC 不同,模式 NC 不维护容器或组织单位的层次结构。相反,它是具有 classSchema ,attributeSchema 和 subSchema 对象的单个容器。

Schema NC里面包含Schema 信息,定义了Active Directory中使用的类和属性。所以在详细讲Schema NC之前我们先来讲一下LDAP里面的类和继承。

LDAP里面的类和继承,跟开发里面的面向对象一样,相信有过面向对象开发经验的,理解起来并不困难。

LDAP 中的类和继承

类和实例

域内每个条目都是类的实例。而类是一组属性的集合。

举个例子:

域内机器CN=WIN7,CN=Computers,DC=test,DC=local在Active Directory里面是一个条目,里面有众多属性描述条目具体信息。Naming Context和Application Partitions

​ 而这个条目有哪些属性是由他的类决定的。比如说这里的条目是CN=WIN7,CN=Computers,DC=test,DC=local是类Computer的实例,在objectClass属性可以看到Naming Context和Application Partitions

Naming Context和Application Partitions

类是可继承的。子类继承父类的所有属性,Top类是所有类的父类。在之前我们看objectClass的时候,可以看到条目是CN=WIN7,CN=Computers,DC=test,DC=local是类Computer的实例。但是我们注意到objectClass里面的值除了Computer之外,还有top,person,organizationPerson,user。这是因为objectClass保存了类继承关系。userorganizationPerson的子类,organizationPersonperson的子类,persontop的子类。Naming Context和Application Partitions

类的分类

类有三种类型

  • 结构类(Structural)

    结构类规定了对象实例的基本属性,每个条目属于且仅属于一个结构型对象类。前面说过域内每个条目都是类的实例,这个类必须是结构类。只有结构类才有实例。比如说前面说过的Computer类。

  • 抽象类(Abstract)

    抽象类型是结构类或其他抽象类的父类,它将对象属性中公共的部分组织在一起。跟面对对象里面的抽象方法一样,他没有实例,只能充当结构类或者抽象类的父类。比如说top 类。注意抽象类只能从另一个抽象类继承。

  • 辅助类(Auxiliary)

    辅助类型规定了对象实体的扩展属性。虽然每个条目只属于一个结构型对象类,但可以同时属于多个辅助型对象类。注意辅助类不能从结构类继承

接下来让我们结合Schema NC中的类来具体理解下LDAP 中的类和继承

Schema NC中的类

如果我们要查看Schema NC的内容,除了传统使用LDAP编辑器查看

比如说ADExplorer

Naming Context和Application Partitions

还可以使用微软自带的Active Directory Schema

默认没有注册,运行regsvr32 schmmgmt.dll注册该dll

然后在mmc里面添加即可

Naming Context和Application Partitions

域内每个条目都是类的实例。所有的类都存储在Schema NC里面,是Schema NC的一个条目。

我们以一个实例来说明。前面说过条目CN=WIN7,CN=Computers,DC=test,DC=local是类Computer的实例。那么类Computer就存储在Schema NC里面,是Schema NC的一个条目CN=Computer,CN=Schema,CN=Configuration,DC=test,DC=local

我们下面来具体分析下这个条目的一些通用属性,希望大家对类条目有个大概的认识。

Naming Context和Application Partitions

Naming Context和Application Partitions

前面说过每个条目都是类的实例,而类是是Schema NC的一个条目。因此类条目也是一个类的实例,这个类是classSchema(CN=Class-Schema,CN=Schema,CN=Configuration,DC=test,DC=local)。所有的类条目都是classSchema类的实例。

我们可以在objectclass属性里面看到。Naming Context和Application Partitions

名称是Computer(通过adminDescription,adminDisplayName,cn,name属性)

defaultSecurityDescriptor这个属性表明,如果在创建Computer这个类的实例的时候,如果没指定ACL,就用这个属性的值作为实例的ACL。在实例的nTSecurityDescriptor里面。Naming Context和Application Partitions

注意跟nTSecurityDescriptor区分开来,nTSecurityDescriptor是这个条目的ACL,而defaultSecurityDescriptor是实例默认的ACL。举个例子。

CN=Computer,CN=Schema,CN=Configuration,DC=test,DC=local 有两个属性nTSecurityDescriptor,defaultSecurityDescriptor。nTSecurityDescriptor是这条条目的ACL。

那Computer的实例化对象CN=WIN7,CN=Computers,DC=test,DC=local,如果在创建的时候,没有指定ACL,那么他的nTSecurityDescriptor的值就是CN=Computer,CN=Schema,CN=Configuration,DC=test,DC=local 的属性defaultSecurityDescriptor的值。

属性rDNAttID表明通过LDAP连接到类的实例的时候,使用的两个字母的前缀用过是cn。

所以他的实例CN=WIN7,CN=Computers,DC=test,DC=local,使用的前缀是cn。

这个我们再举个例子

比如条目OU=Domain Controllers,DC=test,DC=locals 是一个ou,它是类organizationalUnit的实例

Naming Context和Application Partitions

我们查看类organizationalUnit对应的条目CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=test,DC=local,就可以看到

Naming Context和Application Partitions

所以对于他的一个实例,他的前缀是OU,OU=Domain Controllers

  • 属性objectClassCategory为1说明他是一个结构类

    • 1 代表是个结构类

    • 2 代表是个抽象类

    • 3代表是个辅助类

  • 属性subClassOf 表明他的父类是user类

  • systemPossSuperior约束了他的实例只能创建在这三个类container,organizationalUnit,domainDNS的实例底下。

    Naming Context和Application Partitions

    比如computer类的一个实例,CN=WIN7,CN=Computers,DC=test,DC=local,它位于容器CN=Computers,DC=test,DC=local底下,而CN=Computers,DC=test,DC=localcontainer的实例,containersystemPossSuperior底下,这不违反这个约束。

  • 最后一点也是最核心的,我们来讲下他的实例是怎么获取到基本属性的。

    • 这个类没有属性systemMustContainMustContain,因此强制属性

    • 这个类属性systemMayContainMayContain是可选的属性

      Naming Context和Application Partitions

      Naming Context和Application Partitions

    • 上面这四个属性里面的属性集合是这个类独有的属性集合,我们之前说过,类是可继承的。因此一个类的属性集合里面除了前面的四个属性里面的值,还可能来自父类以及辅助类。

      所以最后我们用Active DirectorySchema 查看的时候,就会看到属性的类型是可选还是强制,源类是哪个类。

      Naming Context和Application Partitions

      • 辅助类的属性字段是systemAuxiliaryClass,这里面的computer类没有辅助类

      • 父类 可以通过subClassOf查看,这里是computer类的父类是user类。然后网上递归,user类查看那四个属性,以及他的辅助类,父类。直到top类。Naming Context和Application Partitions

 

Schema NC中的属性

Schema NC除了定义了Active Directory中使用的类,还定义了Active Directory中使用的属性。

关于属性,我们之前接触的够多了。这里不再多做解释。

每个属性都是一个条目,是类attributeSchema的实例

在域内的所有属性必须在这里定义,而这里的条目,最主要的是限定了属性的语法定义。其实就是数据类型,比如 Boolean类型,Integer类型等。

CN=Object-Sid,CN=Schema,CN=Configuration,DC=test,DC=local为例。

他的attributeSyntax2.5.5.17

Naming Context和Application Partitions

oMSyntax

Naming Context和Application Partitions

通过查表

Naming Context和Application Partitions

关于各种语法定义在这里不再这里一个个介绍,过于抽象,将在后面文章里面实际的案例根据需要详细讲解。

Application Partitions

从 Windows Server 2003 开始,微软允许用户自定义分区来扩展Naming Context的概念。Application Partitions其实就是Naming Context的一个扩展,它本质上还是属于Naming Context。管理员可以创建分区(这个分区我们称为区域),以将数据存储在他们选择的特定域控制器上,Application Partitions主要有以下特点:

  1. Naming Context是微软预定义的,用户不可以定义自己的Naming Context。而如果用户想要定义一个分区,可以通过Application Partitions。虽然微软也预置了两个Application Partitions,但是Application Partitions的设计更多是为了让用户可以自定义自己的数据。设计Application Partitions最大的用途就是,让用户自己来定义分区。

  2. Application Partitions可以存储动态对象。动态对象是具有生存时间(TTL) 值的对象,该值确定它们在被Active Directory自动删除之前将存在多长时间。也就说Application Partitions可以给数据设置个TTL,时间一到,Active Directory就删除该数据。

下面演示通过ntdsutil创建Application Partitions:

Naming Context和Application Partitions

创建成功

Naming Context和Application Partitions

我们可以通过查看rootDSE查看域内的所有Naming Context以及Application Partitions,在属性namingContexts里面。

Naming Context和Application Partitions

 

原文:https://daiker.gitbook.io/windows-protocol/ldap-pian/8