首页 > 代码库 > Java使用LdAP获取AD域用户
Java使用LdAP获取AD域用户
随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下!
先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类——资源(如印表机)、服务(如电子邮件)、和人物(即帐户或用户,以及组)。 AD 提供这些对象的信息,组织这些对象,控制访问,并且设置安全等级。每个对象代表一个单个实体——无论是一个用户、一台电脑、一台印表机、或者一个共享数据源——及该实体的各种属性。对象也可以是其它对象的容器。每个对象都由其名字唯一地标识,并拥有一个属性集(即该对象可包含的特徵和信息),它由该对象的类型定义并依赖於该类型。这些属性,即对象自身的基本结构,由一个对象模型(schema)来定义,该对象模型也确定了可存储於 AD 中的该对象的种类。对象模型本身由两类对象构成:模型的类对象和模型的属性对象。一个单个的模型类对象定义了一个可被 AD 创建的对象类型(例如使一个用户对象被创建);一个模型的属性对象则定义了模型所定义的对象所具有的一种属性。每个属性对象都可用於多个不同的模型类对象中。这些对象一般被称作模型对象,或者元数据,它们的存在是为了在需要时对模型进行扩展或修改。然而,由於每个模型对象都是集成於 AD 对象的定义内部的,停用或改变这些对象会导致严重的后果,因为这会从根基上改变 AD 自身的结构。一个模型对象在被改变后会自动通过 AD 来传播,且一旦被创建,就只能被停用——而不是删除。除非是有一定的计划,一般情况下不会对对象模型进行修改。林、树和域可以从不同的层次上来「看」这个包含了各个对象的框架。在机构的最顶端是林,它是AD中所有对象及其属性、以及规则(即属性的构造方式)的全集。林中含有一或多个相互联系并可传递信任关系的树。一个树又含有一或多个域和域树,它们也以一种可传递的信任等级相互联系。每个域由其在 DNS 中的域名结构(即命名空间)来标识。一个域具有单一的 DNS 域名。域中包含的对象可以被编组到成为「组织单位」(Organizational Unit,OU)的容器中。 OU 给域提供了一个便於管理的层次,也提供了一个对 AD 中的公司的逻辑组织结构和实际地理结构的较直观一些的表示。 OU 还可以再包含子 OU (其实从这个角度说域就是一些容器),进而可以包含多层级嵌套的 OU。微软推荐在 AD 中尽量少建立域,而通过OU来建立结构关系及完善策略和管理的实施。 OU 是应用组策略(也称为组策略对象,GPO,本身也是 AD 对象)时常用的层次,尽管组策略也可应用在域或站点(见下)中。OU是可进行管理许可权委派的最低的层次。进一步细化, AD 支持站点的创建,站点是由一或多个IP子网定义的一个更倾向於物理的(而非逻辑的)分组。站点可以分属於通过低速连接(如WAN、VPN[1])和高速连接(如 LAN)相连的不同地点间。各个站点可包括一或多个域,各个域也可包括一或多个站点。这对於控制因复制产生的网路流量来说是个重要的概念。如何将公司的信息基础结构划实际地划分为一个有著一或多个域和顶级 OU 的层次结构是一项非常关键的决定,通常可根据业务、地理位置、在信息管理结构中的角色等因素来建立不同的管理结构模型,很多情况下也会将这些模型组合起来应用。^ 译注:这里,原文作者中将虚拟专用网路(VPN)和广域网(WAN)作为同层次的概念来说明低速连接,其实是不妥当的。作者似乎将VPN当作了基於公众电话网路的远程拨号连接(remote access via dial-up connection over PSTN),虽然VPN本身也是一种远程访问服务(remote access service, RAS)所提供的访问方式,并且在实际中为了应用和管理的方便、以及安全方面的原因,确实有相当多的用户在通过PSTN远程访问公司的内部网路时,需要在拨号连接后进一步再建立一个VPN连接,但其实上VPN是和网路的物理连接方式无关的概念。喜欢的话在区域网连接也可用来能建立VPN连接,只不过这样做通常并没有实际意义,除非需要使用为VPN用户特别提供的管理性的功能,例如将某些VPN用户单独划分到一个安全组内以控制对某些资源的访问。renda 14:01 2006年2月23日 (UTC)物理结构与复制从物理角度来说 AD 的信息是存储於一或多个相互对等的域控制器(DC)中的,使用这种对等 DC 的结构取代了以前在 NT 主域控制器/备份域控制器(PDC/BDC)的方式(尽管有一种用於某些操作的「更具平等性」的FSMO伺服器可模仿一个 PDC)。每个 DC 上都有一个单独的域分区和一个 AD 的可读写复本,通过多主机复制机制将在一台 DC 上发生的变更(以汇聚方式)同步到所有的 DC 上。没有存储 AD 的伺服器称为成员伺服器。与早先使用NetBIOS通信的 Windows 版本不同,Active Directory是与 DNS 及 TCP/IP 完全整合在一起的,实际上 DNS 是「必须的」。为使所有的功能都能正确工作,这个 DNS 伺服器必须支持SRV资源记录或服务记录。AD 复制更多地来说是以「拉」(pull)而不是「推」(push)的方式工作。 AD 会创建一个使用已定义的「站点」来管理通信的复制拓扑。站点内的复制频繁且自动地通过一种「知识一致性检测器」(Knowledge Consistency Checker,KCC)来完成的;而站点间的复制是可根据每个站点连接的质量(通过给每个连接定义不同的「成本」值,如 DS3、T1、ISDN 等)来进行配置的,并据此限制、安排及路由站点间复制的通信活动。虽然 AD 会自动将直接相连的站点到站点的连接的成本计算为低於中转方式的连接,但只要涉及的站点间连接的「成本」被认为足够低,复制的数据也可通过中转方式来传递给处在相同协议的「站点连接桥」(site link bridges)上的其它多个站点。站点到站点的复制是在每个站点中的「桥头伺服器」(bridgehead server)之间进行的,该桥头伺服器将内容的变更复制给站点中的其它 DC。在多於一个域时是不跨林复制 AD 的;而是创建一个全局编目(global catalog,GC),其中包含林中所有对象及它们的(部分)属性,即一个 AD 的部分副本。这个编目存储於定义好的全局编目伺服器中,用於处理域间查询或传递跨域的请求。域内的汇集是通过使用 IP 进行的 RPC 机制来完成,而林范围内的 AD 汇集则通过 SMTP 完成。FSMO(flexible single master operation,灵活单主机操作)处理完整的多主机复制不能充分实现的情况。FSMO 有五个任务,包括:a)前面提到的进行 PDC 模拟、b)提供相对标识主机(RID master,Relative ID master)服务、c)作为在域范围内行使职能的结构内主机、以及作为在林范围内行使职能的 d)模型主机和 e)域命名主机。域中的 DC 中只有一台伺服器负责处理某个特定的 FSMO 任务。AD 被分储在三个不同的存储空间或称「分区」中: a) 「模型」空间,包含整个 AD 的模版,定义了所有对象的类型、类、属性、和属性语法,林中的所有树是一起的,因为它们使用同一个模型; b) 配置空间,存储著 AD 中的林和树的结构; c) 「域」空间,存储了在该域中创建的对象的所有信息。前两者的内容会复制到所有的域控制器,而域空间的内容只是以全局编目的形式部分地和其它域控制器共享,这是因为对完整域对象的复制是限制在域边界之内进行的。被称为「目录存储」的 AD 资料库在 Windows 2000 中是用基於JET Blue的可扩充存储引擎(ESE98)完成的,每个域控制器的资料库的容量限制为 16 TB、对象数量限制为 109 个(理论数值,实际只测试过约 108 个),而 NT4 的SAM (Security Account Manager,安全帐户管理程序)只支持不超过 40000 个对象。该目录存储也叫 NTDS.DIT,它包含两个重要的表:「数据表」和「连接表」。在 Windows 2003 中又加入了第三个主要表,用来存放安全描述符的单个实例。命名AD 支持使用反斜线(\)的UNC(Universal Naming Conversion)名称、使用斜线(/)的URL(Uniform Resource Locator)名称、以及LDAP URL名称来访问对象。在 AD 内部使用LDAP版本的X.500命名结构来工作。每个对象具有一个识别名(Distinguished name,DN), 例如一个在域名foo.org、组织单位名为Marketing的OU中的、名为HPLaser3的印表机对象的DN是: CN=HPLaser3,OU=Marketing,DC=foo,DC=org,这其中的 CN 表示一般名,DC 表示域对象的类。DN可以包含不止四个部分。对象还可拥有一个别名(Canonical Name,台湾译法为直接字面翻译的「正式名称」),基本是把DN的各部分倒过来、去掉表示符再加上斜线分开重新写一遍就是,对本例来说就是:foo.org/Marketing/HPLaser3。为在所属的容器内部辨识对象还使用相关识别名(Relative distinguished name,RDN):CN=HPLaser3。每个对象还有一个全局唯一标识码(Globally unique identifier,GUID),一个AD用来进行搜索和复制的唯一不变的128位字元串。某些对象还有个如objectname@domain name形式的用户主体名(User principal name,UPN)。信任AD 使用信任机制来允许一个域中的用户访问另一个域中的资源。在创建域时会自动创建信任关系。林一级的对象模型会为信任关系设置默认的边界,这并非是在域这个级别上进行的,隐含的信任是自动建立的。和双向可传递的信任一样,AD的信任可以是「捷径方式」(shortcut trust,连接不同的树种的两个域,可传递、可为单向或双向)、「林方式」(forest trust,可传递、单或双向)、「领域方式」(realm trust,可传递或不可传递、单或双向)、或者「外部方式」(external trust,不可传递、单或双向)这些种模式,用来连接到其它林或非 AD 架构的域。尽管也能支持NTLM鉴权,AD 使用的是版本5的Kerberos协议进行鉴权,而对浏览器客户是用 SSL/TLS 协议帮助鉴权的。 Windows 2000中的信任机制 此条目或章节需要被修正为维基格式以符合质量标准。(2006年10月21日)请协助添加相关的内部连结来改善这篇条目。 简单地说,AD 使用信任机制(原生模式下[2])来允许一个域中的用户访问另一个域中的文件。AD 的信任关系是这样一种机制,一个域中的用户可以由另一个域来验证身份并据此而允许(或拒绝)访问那个域中的资源。每个 Windows 域都与其它域有著隐含的、双向的、并且可传递信任关系。这种信任关系是在域之间自动维护的。例如,如果 A 域信任 B 域,且 B 域信任 C 域,则:由於信任关系的可传递性,A 域也信任 C 域,因此 A 域的用户也能访问 C 域中的文件; 由於信任关系的双向性,C 域也信任 A 域,因此 C 域的用户也能访问 A 域中的文件。 域之间也可存在明确指定、人工创建的信任关系。这种明确指定的信任关系可以是:捷径方式的信任:连接的是同一个林中的任何两个域,以减少访问资源时所需的等待时间。这种捷径方式的信任关系是可传递的、但单向的; 外部信任:连接的是不同的林中的两个域,以允许一个林中的用户访问另一个林中的文件。这种外部信任关系是不可传递的、不能用Kerberos鉴权方式验证、并且是单向的。 ^ 译注:在创建AD时,可以将 AD 创建为原生模式(native mode)或混合模式(mixed mode),这两种模式是该 AD 的运行方式。原生模式是指 AD 完全基於 AD 架构运行,它要求 AD 中所有的域控制器(不含成员伺服器)都是采用了 AD 架构的 Windows 2000 以上的作业系统,而混合模式则允许使用老的 NT Domain 架构的 NT Server 作为域控制器。当然,除非网路是从原有 NT 域上升级而来,否则应该使用原生模式,它会比混合模式提供更好的安全性。相关数据库档案Active Directory的所有数据都储存在 ntds.dlt 这个档案里,一般会储存在%systemroot%\NTDS里。系统预设会隔每12小时为数据库进行清除垃圾(garbage collection)的动作,包括为数据库进行defragmentation。进行defragmentation时,系统需要预留约是数据库档案大小的1.5倍的可用空间。 所有交易都会储存在 Edb*.log 里,预设的档案名称是 edb.log,之后的会加上数字,例如:edb0001.log。Edb.chk是交易的checkpoint档案。Res1.log和Res2.log是系统保留的交易档案。若数据库所在的目录没有足的可用空间,就要把数据库移往其他地方去。然而,由於Win2K与Win2K3在磁碟区阴影复制服务(VSS)的机制有所不同,使这移动过程有可能失败。对於Win2K,log files与数据库可以分别存放在不同的磁碟上,但Win2K3则必须放在同一个磁碟上。要移动数据库,必须重新启动伺服器,并进入 Active Directory Restore Mode 里,利用ntdsutil工具进行移动。应用方式的Active Directory应用方式的Active Directory(Active Directory Application Mode,ADAM)是Active Directory的一个轻量级实现。ADAM是运行为单用户服务的一个功能。由於对资源的低要求,可在同一台伺服器上运行多个ADAM的实例。它使用和AD的完整实现版本相同的API(应用程序介面),因此开发人员无须学习新知识即可使用。
/** * @Description: * * @Title: LdAPTest.java * @Package com.joyce.itext.main * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-8-7 上午10:20:22 * @version V2.0 */ package com.joyce.itext.main; import java.util.Properties; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; /** * @Description:拉取AD域账户 * * @ClassName: LdAPTest * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-8-7 上午10:20:22 * @version V2.0 */ public class LdAPTest { public static void main(String[] args) { Properties env = new Properties(); String adminName = "administrator@2003.com";//username@domain String adminPassword = "admin";//password String ldapURL = "LDAP://10.10.2.153:389";//ip:port env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.SECURITY_AUTHENTICATION, "simple");//"none","simple","strong" env.put(Context.SECURITY_PRINCIPAL, adminName); env.put(Context.SECURITY_CREDENTIALS, adminPassword); env.put(Context.PROVIDER_URL, ldapURL); try { LdapContext ctx = new InitialLdapContext(env, null); SearchControls searchCtls = new SearchControls(); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))"; String searchBase = "DC=2003,DC=com"; String returnedAtts[] = {"memberOf"}; searchCtls.setReturningAttributes(returnedAtts); NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls); while (answer.hasMoreElements()) { SearchResult sr = (SearchResult) answer.next(); System.out.println("<<<::[" + sr.getName()+"]::>>>>"); } ctx.close(); }catch (NamingException e) { e.printStackTrace(); System.err.println("Problem searching directory: " + e); } } }
以上就是从AD域上拉取域账号!当然现在Java还有许多其他的jar也能操作AD域,这里不就不多介绍了,有兴趣的同伴可以去百度、谷歌!最后给大伙儿看看效果图:
还想多说一句,其实Java原生态的API老好了,所以能用原生态的最好,因为别人提供的jar包如果没有处理好的话,还不如原生态的呢!感谢大家的关注