Ldap学习记录

//以下内容参考了百度百科和其他人(http://fox-tan.iteye.com/blog/740843登)的学习资料整理而得
Directory Services( 目录服务 )
       网络 上, 特别是互联网 中有各型各类的主机 , 有各种各样的资源 , 这些东西杂散在网络中, 需要有一定的机制来访问这些资源, 得到相关的服务, 于是就有了目录服务.
目录服务对于网络的作用就像白页对电话系统的作用一样。目录服务将有关现实世界中的事物( 如人、计算机、打印机等等) 的信息存储为具有描述性属性的对象。人们可以使用该服务按名称查找对象或者像使用黄页一样,可使用它们查找服务。
  早期的目录服务主要是提供文件检索, NOVELL 就是广为使用的目录服务器 系统; 随着互联网的发展, 网站的定位又成了难题, 于是有了DNS 服务, 它也是典型的目录服务, 即帮你做域名目录服务与IP 地址之间的转换.
  在WINDOWS 体系中, AD(活动目录 ) 功能强大, 是符合工业标准的目录服务器. 在UNIX 或LINUX 中, 也有相应的目录服务器.
  总结一下, 目录服务器的主要功能是提供资源与地址的对应关系, 比如你想找一台网上的共享打印机或主机时, 你只需要知道名字就可以了, 而不必去关心它真正的物理 位置. 而目录服务器帮助维护这样的资源- 地址映射.

LDAP

LDAP 是Lightweight Directory Access Protocol 的缩写,顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500 而言的;LDAP 略去了x.500 中许多不太常 用的功能,且以TCP/IP 协议为基础)。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。同时,LDAP 只是一个协议,它没有涉及到如何存储这些信息,因此还需要一个后端数据库组件来实现。这些后端可以是bdb(BerkeleyDB) 、ldbm 、shell 和passwd 等。
LDAP 目录以树状的层次结构来存储数据(这很类同于DNS ),最顶层即根部称作“ 基准DN” ,形如"dc=mydomain,dc=org" 或者"o= mydomain.org" ,前一种方式更为灵活也是Windows AD 中使用的方式。在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,LDAP 像其它的目录服务协议一样使用OU (Organization Unit ),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU 还可以有子OU ,用来表示更为细致的分类。
    LDAP 中每一条记录都有一个唯一的区别于其它记录的名字DN (Distinguished Name ), 其处在“ 叶子” 位置的部分称作RDN ;如dn:cn=tom,ou=animals,dc=mydomain,dc=org 中tom 即为 RDN ;RDN 在一个OU 中必须是唯一的。
    LDAP 定义客户应当如何访问服务器中的数据,它并不指定数据应当如何存储在服务器上。大多数情况下,开发者只需要和一个专为LDAP 设计的目录服务,或现有目录 服务的LDAP 前端打交道。LDAP 能够成为任何数据存储类型的前端。目前最流行的目录服务有NIS 、NDS 、Active Directory 等都有某种类型的LDAP 前端。
    在LDAP 中,数据被组织成一棵树的形式,叫做目录信息树(directory information tree ,DIT )。DIT 中的第一个“ 叶子” 叫做一个条目(entry ),第一个条目叫根条目(root entry )。
一 个条目是由一个区分名称DN (distinguished name )和任意一个属性/ 值对组成。DN 是一个条目的名字,它必须是唯一的,它类似于一个关系型数据库的唯一关键字。DN 也表明了该条目与DIT 树的其他部分之间的关系,它类似于这种方式:一个文件的全路径名表明硬盘上的一个特定文件与系统中的其他文件之间的关系。当从根目录读取文件时,读取系统上的文件路径是从左到右读取的,但是当从根目录读取DN 时,是从右到左读DN 的。如:
uid = jordan,ou = nba,o = american
表示定义了在组织american 中的小组为 nba 的用户jordan 的用户。其中一个DN 名的最左边部分叫相对区分名称RDN (relative distinguished name ),它由一个条目内的属性/ 值组成,如前面的uid = jordan 是RDN ,后面的可有可无。

Hashtable env = new Hashtable();
// select a service provider factory
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContext");
// create the initial context
Context contxt = new InitialContext(env);

File System         com.sun.jndi.fscontext.RefFSContextFactory

LDAP                com.sun.jndi.ldap.LdapCtxFactory

RMI                 com.sun.jndi.rmi.registry.RegistryContextFactory

CORBA               com.sun.jndi.cosnaming.CNCtxFactory

DNS                 com.sun.jndi.dns.DnsContextFactory

LDIF

    LDIF(LDAP Interchange Format) 是指存储LDAP 配置信息及目录内容的标准文本文件格式,之所以使用文本文件来格式来存储这些信息是为了方便读取和修改,这也是其它大多数服务配置文件所采取的格式。LDIF 文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP 中schema 的格式进行组织,并会接受schema 的检查,如果不符合其要求的格式将会出现报错信息。LDIF 文件样例如下:

#LDIF file example
dn: dc=mydomain,dc=org
objectClass: domain
dc: mydomain
    其中,以“#” 号开头的为注释行;第二行起的行中,冒号左边为属性,右边是属性的值,这类同于编程中的变量及为其所赋的值,但属性可以被重复赋值。

objectClass

    LDAP 中,一条记录必须包含一个objectClass 属性,且其需要赋予至少一个值。每一个值将用作一条LDAP 记录进行数据存储的模板;模板中包含 了一条记录中数个必须被赋值的属性和一系列可选的属性。如上述LDIF 文件中的记录所示,objectClass 的值为domain 。

    objectClass 有着严格的等级之分,最顶层的类是top 和alias 。例如,organizationalPerson 这个objectClass 隶属于Person, 而Person 又是top 的子类。

objectClass 大致分为三类:结构型的(如:person 和organizationUnit )、辅助型的(如:extensibeObject )和抽象型的(这类不能直接使用)。在LDAP 中objectClass 分为三种:Abstract ,Structural ,AUXIALIARY 。

在LDAP 目录数据库中,所有的条目都必须定义objectClass 这个属性。每个条目(LDAP Entry )都要定义自己的Object Classes 。

官方定义的objectClass, 如下所示:
alias
applicationEntity
dSA
applicationProcess
bootableDevice
certificationAuthority
certificationAuthority-V2
country
cRLDistributionPoint
dcObject
device
dmd
domain
domainNameForm
extensibleObject
groupOfNames
groupOfUniqueNames
ieee802Device
ipHost
ipNetwork
ipProtocol
ipService
locality
dcLocalityNameForm
nisMap
nisNetgroup
nisObject
oncRpc
organization
dcOrganizationNameForm
organizationalRole
organizationalUnit
dcOrganizationalUnitNameForm
person
organizationalPerson
inetOrgPerson
uidOrganizationalPersonNameForm
residentialPerson
posixAccount
posixGroup
shadowAccount
strongAuthenticationUser
uidObject
userSecurityInformation

   Attribute

类同于编程语言中的变量,它可以被赋值,就像是可以存放一个单一类型信息的容器。官方声明了许多常用的
Attribute,
如果其中没有你所需要的,你可以自己定义,但要避免重名。objectClass是一种特殊的Attribute,它包含其它用到的 Attribute以及它自身。
常见的Attribute如:givenName、l、objectClass、dc、ou、cn、c、mail、 telephoneNumber、sn、uid等。

Schema

LDAP 中, schema 用来指定一个目录中所包含的 objects 的类型( objectClass )以及每一个 objectClass 中的各个必备( mandatory )和可选( optional )的属性( attribute )。因此, Schema 是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的 Entry 下的数据之间的关系。 schema 需要在主配置文件 slapd.conf 中指定,以用来决定本目录中使用到的 objectClass 。管理员可以自己设计制定 schema ,一般包括属性定 义( AttributeDefinition )、类定义( ClassDefinition )以及语法定义( SyntaxDefinition )等部分。   

LDAP V3 中在 x.500 标准的基础上定义了一个包含了网络中大多常见对象的 schema ,这些对象包括国家、所在地、组织、人员、小组以及设备等。同时, LDAP V3 中可以很方便的从目录中提取出 schema ,它正是一条记录中关于属性的声明部分。

OID

  对象标识符( OID )是被 LDAP 内部数据库引用的数字标识。 Attribute 的名字是设计为方便人们读取的,但为了方便计算机的处理,通常使用一组数字来标识这些对象,这类同于 SNMP 中的 MIB2 。例如,当计算机接收到 dc 这个 Attribute 时,它会将这个名字转换为对应的 OID : 1.3.6.1.4.1.1466.115.121.1.26 。

  使用 LDAP 做身份验正
    验正主要是用来确定一次会主中客户端用户所具有的权利,即用来确立用户能否登录以及登录具有使用哪些资源以及如何使用资源的权限。验正过程中的修改、查询等操作由认证级别来控制。

    objectClass 中的person 可以用来作linux 系统中用户登入的身份验正,此时需要指定userPassword 属性的值,即指定用户登入 时使用的密码。密码可以使用的加密方式有MD5 、CRYPT 、SHA 、SSHA 等。在LDAP V3 中,验正客户端时可以使用的验正机制有匿名验正、简单验正、基于SSL/TLS 的验正和基于SASL 的验正等四种方式。

你可能感兴趣的:(编程,linux,互联网,网络协议,sun)