Windows协议 LDAP篇 - Actite Directory
阅读原文时间:2022年04月02日阅读:4

先说下ldap,轻量目录访问协议。LDAP就是设计用来访问目录数据库的一个协议。也就是为了能访问目录数据库,ldap是其中一种协议

LDAP的基本模型

  1. 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
  2. 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。
  3. DN,RDN:拿第一条举例,他的唯一可区分的名称DN:uid=jack,ou=people,dc=muxue,dc=com,RDN就是uid=jack
  4. 属性:描述条目具体信息。DN:uid=jack,ou=people,dc=muxue,dc=com的name属性就是hack,age属性是18,sex就是male

关键字

英文全称

含义

dc

Domain Component

域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)

uid

User Id

用户ID songtao.xu(一条记录的ID)

ou

Organization Unit

组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)

cn

Common Name

公共名称,如“Thomas Johansson”(一条记录的名称)

sn

Surname

姓,如“许”

dn

Distinguished Name

“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)

rdn

Relative dn

相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”

不同厂商对目录服务数据库的不一样,我们这里说的Active Directory,是微软的对目录服务数据库的实现;Active Directory存储着整个域内所有的计算机,用户等的所有信息。

连接域内的AD:

  1. 连接DC的389/636端口(636端口是LDAPS);这是知道信息的情况下
  2. 连接域控的3268/3269端口;全局编录服务器(GC)中除了保存本域中所有对象的所有属性外,还保存林中其它域所有对象的部分属性,这样就允许用户通过全局编录信息搜索林中所有域中对象的信息。

在这里会介绍AD中会有啥东西

Naming Context

https://www.oreilly.com/library/view/active-directory-5th/9781449361211/ch04.html

微软将Active Directory划分为若干个分区(Naming Context,简称NC),每个Naming Context都有其自己的安全边界。

AD预定义了3个NC

  1. Configuration NC
  2. Schema NC
  3. Domain NC

Configuration NC

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

RDN

说明

cn=DisplaySpecifiers

包含显示说明符对象的容器,这些对象定义了 Active Directory MMC 管理单元的各种显示格式。

cn=Extended-Rights

扩展权限 ( controlAccessRight) 对象的容器。

cn=ForestUpdates

包含用于表示林状态和域功能级别更改的对象。

cn=LostAndFoundConfig

孤立对象的容器。

cn=NTDS Quotas

用于存储配额对象的容器,用于限制安全主体可以在分区或容器中创建的对象数量。

cn=Partitions

包含每个命名上下文、应用程序分区和外部 LDAP 目录引用的对象。

cn=Physical Locations

包含位置对象 ( physicalLocation),可以与其他对象关联以表示对象的位置。

cn=Services

存储有关服务(例如文件复制服务、Exchange 和 Active Directory 本身)的配置信息。

cn=Sites

包含所有站点拓扑和复制对象。这包括sitesubnetsiteLinkservernTDSConnection对象,仅举几例。

cn=WellKnown Security Principals

保存代表常用的外部安全主体的对象,例如Everyone、Interactive 和Authenticated Users。

Schema NC

Schema NC 包含表示 Active Directory 支持的类和属性的对象。架构是在林范围的基础上定义的,因此架构 NC 被复制到林中的每个域控制器。这个会详细 因为设计到类继承

Domain NC

每个 Active Directory 域都有一个域命名上下文,其中包含特定于域的数据。此 NC 的根由域的专有名称 (DN) 表示,通常称为 NC 头。比如muxue.com域的DN将为dc=muxue,dc=com

RDN

说明

cn=Builtin

预定义的内置本地安全组的容器。示例包括管理员、域用户和帐户操作员。

cn=Computers

代表成员服务器和工作站的计算机对象的默认容器。您可以使用redircmp.exe实用程序更改默认容器。

ou=Domain Controllers

代表域控制器的计算机对象的默认组织单位。

cn=ForeignSecurityPrincipals

占位符对象的容器,代表域中来自林外部域的组成员。

cn=LostAndFound

孤立对象的容器。孤立对象是在同一复制期内从另一个域控制器中删除的容器中创建的对象。

cn=Managed ServiceAccounts

托管服务帐户的容器。托管服务帐户是一种特殊类型的安全主体,可以轮换自己的密码。有关托管服务帐户的更多信息,请参阅第 10 章

cn=NTDS Quotas

用于存储配额对象的容器,用于限制安全主体可以在分区或容器中创建的对象数量。

cn=Program Data

应用程序存储数据的容器,而不是使用自定义的顶级容器。

cn=System

各种域配置对象的容器。示例包括信任对象、DNS 对象和组策略对象。

cn=TPM Devices

可信平台模块 (TPM) 密钥恢复信息的容器。

cn=Users

用户和组对象的默认容器。您可以使用redirusr.exe 实用程序更改默认容器 。

Application Partitions

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

  1. Naming Context是微软预定义的,用户不可以定义;用户如果想要定义一个分区,可以使用Application Partitions,微软默认预置了两个Application Partitions

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

通过ntdsutil创建Application Partitions

ntdsutil
partition management
create nc "dc=test,dc=muxue,dc=com" dc.muxue.com

我们可以通过ldp查看域内的所有Naming ContextApplication Partitions

删除分区

ntdsutil
ntdsutil: LDAP Policies
ldap policy: Connections
server connections: connect to server dc
绑定到 dc ...
用本登录的用户的凭证连接 dc。
server connections: quit
ldap policy: quit
ntdsutil: partition management
partition management: delete nc "dc=test,dc=muxue,dc=com"
此操作已经成功。分区已经标记为从企业中删除。一段时间内它将在后台删除。

注意: 请不要用同名创建另一分区,直到服务拥有此分区的服务有足够的时间删除它。这将在此分区删除在整个林内复制时完成,而且拥
有此分区的服务已经删除该分区内的所有对象。可以通过查阅每个服务器上的目录事件日志来验证分区删除是否完成。

然后就成功删除了

LDAP 中的类和继承

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

Example:CN=WIN7,CN=Computers,DC=muxue,DC=com在AD中是一个条目,它里面有非常多的属性

而条目有哪些属性是由他的类决定的,在objectClass属性可以看到属于哪个类

  1. 类是可以继承的

子类继承父类的所有属性,Top类是所有类的父类。在之前我们看objectClass的时候,可以看到条目是CN=WIN7,CN=Computers,DC=muxue,DC=com是类Computer的实例。objectClass里的值除了有Computer之外还有:top,person,organizationalPerson,user,这是因为objectClass保存了类继承关系,user继承了organizationalPerson,organizationalPerson继承了personperson继承了top

  1. 类的分类
  • 结构类(Structural):结构类规定了对象实例的基本属性,每个条目属于且仅属于一个结构型对象类。前面说过域内每个条目都是类的实例,这个类必须是结构类。只有结构类才有实例。比如说前面说过的Computer类。
  • 抽象类(Abstract):抽象类型是结构类或其他抽象类的父类,它将对象属性中公共的部分组织在一起。跟面对对象里面的抽象方法一样,他没有实例,只能充当结构类或者抽象类的父类。比如说top 类。注意抽象类只能从另一个抽象类继承。
  • 辅助类(Auxiliary):辅助类型规定了对象实体的扩展属性。虽然每个条目只属于一个结构型对象类,但可以同时属于多个辅助型对象类。注意辅助类不能从结构类继承

这我就是完全抄的daiker师傅的了

Schema NC中的类

直接用Active Directory Schena查看比较方便

拿上面一个例子说明:CN=WIN7,CN=Computers,DC=muxue,DC=com是类Computer的实例,类Computer就存储在Schema NC里面,是Schema NC的一个条目(其实我上面有一个图可以看出来),CN=Computer,CN=Schema,CN=Configuration,DC=muxue,DC=com

每个条目都是类的实例,而类是是Schema NC的一个条目。因此类条目也是一个类的实例,这个类是classSchema(Schema NC的一个条目)。所有的类条目都是classSchema类的实例。

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

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

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

    注意跟nTSecurityDescriptor区分开来,而defaultSecurityDescriptor是实例默认的ACL,nTSecurityDescriptor是这个条目的ACL。
    Example:
    CN=Computer,CN=Schema,CN=Configuration,DC=muxue,DC=com 有两个属性nTSecurityDescriptor,defaultSecurityDescriptor。
    nTSecurityDescriptor是这条条目的ACL。
    那Computer的实例化对象CN=WIN7,CN=Computers,DC=muxue,DC=com,如果在创建的时候,没有指定ACL,那么CN=WIN7,CN=Computers,DC=muxue,DC=com的nTSecurityDescriptor的值就是CN=Computer,CN=Schema,CN=Configuration,DC=muxue,DC=com 的属性defaultSecurityDescriptor的值。
  • rDNAttID属性表明通过LDAP连接到类的实例的时候,使用的两个字母的前缀用过是cn。所以他的实例CN=WIN7,CN=Computers,DC=muxue,DC=com,使用的前缀是cn。

    Example:

    条目OU=Domain Controllers,DC=muxue,DC=comorganizationalUnit的一条实例

    然后我们查看CN=Organizational-Unit,CN=Schema,CN=Configuration,DC=muxue,DC=comrDNAttID属性是

    所以对于Organizational-Unit类的实例,他的前缀是OU,OU=Domain Controllers

  • objectClassCategory属性标签他是一个什么类

    1 -> 结构类
    2 -> 抽象类
    3 -> 辅助类
  • systemPossSuperior属性表明,约束了他的实例只能创建在这些类之下

  • 实例是怎么获取到基本属性的

查询目录需要指定两个要素

  1. Base DN
  2. 过滤规则

Base DN

比如指定BaseDN为DC=muxue,DC=com,就会以此为根向下搜索

过滤规则

  • 用与号 (&) 表示的 AND 运算符。
  • 用竖线 (|) 表示的 OR 运算符。
  • 用感叹号 (!) 表示的 NOT 运算符。
  • 用名称和值表达式的等号 (=) 表示的相等比较。
  • 用名称和值表达式中值的开头或结尾处的星号 (*) 表示的通配符。

https://docs.microsoft.com/zh-cn/windows/win32/ad/active-directory-domain-services

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