LDAP
- LDAP只是专门用于查找的一种数据库。 读取速度快,但支持写入,但速度相对较慢。 这就是为什么LDAP通常用于存储集中式用户帐户的原因。
- 在LDAP中,数据是存储的节点(很像关系DB中的记录)。 每个节点都有一些命名属性。 例如,代表用户的节点可能具有以下属性(cn代表“通用名”,而sn代表“姓”):
cn: Kent Tong
sn: Tong
givenName: Kent
email: kent@ttdev.com
- 就像数据库中的记录或Java中的对象一样,节点可以具有的属性是固定的。 这由名为objectClass的属性指定。 例如,有一个名为“ person”的对象类,它说它可以具有cn,sn和email,然后一个属于该“ person”类的节点可以具有以下属性:
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
- 一个节点可能属于多个对象类。 例如,可能有一个名为“ securityObject”的对象类,它说它可以具有一个密码属性,然后,如果需要将密码放入节点中,则可以这样做:
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
objectClass: securityObject
password: abc123
- 如何使用节点表示部门或公司? 这是通过“ organizationalUnit” objectClass(“ ou”代表“ organizational unit”)完成的:
ou: Foo Ltd.
objectClass: organizationalUnit
ou: Finance dept
objectClass: organizationalUnit
- 如果通通先生在那个财务部门,该如何表示这种关系? 与相对的数据库用外键表示这种关系不同,在LDAP中,一个节点可以放在另一个节点下作为子节点。 例如,让我们将人员节点作为财务部门节点的子节点,而财务部门节点作为公司节点的子节点:
dn: ou=Foo Ltd.
ou: Foo Ltd.
objectClass: organizationalUnit
dn: ou=Finance dept,ou=Foo Ltd.
ou: Finance dept
objectClass: organizationalUnit
dn: cn=Kent Tong,ou=Finance dept,ou=Foo Ltd.
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
- 这种父子关系由称为“ dn”(专有名称,就像文件的完整路径)的属性表示。 也就是说,您可以从节点的dn确定父节点的dn。
- 通常,您将cn添加到父节点的dn中以获得节点本身的dn。 但是,您不必使用cn。 您可以随意使用任何属性来实现该目的(称为“相对dn”),只要该属性在兄弟姐妹之间是唯一的即可。 例如,如果没有两个人的cn值相同,则cn很好。 这样,在给定dn的情况下,定位节点非常快。
- 创建目录的顶级节点时,需要指定其dn。 通常,您将使用公司的DNS域名(假设它是foo.com):
dn:dc=foo,dc=com
ou: Foo Ltd.
objectClass: organizationalUnit
dn: ou=Finance dept,dc=foo,dc=com
ou: Finance dept
objectClass: organizationalUnit
dn: cn=Kent Tong,ou=Finance dept,dc=foo,dc=com
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
- 其中dc表示“域组件”,只是域名中的标签。
- 一些对象类(例如person或organizationalUnit)被设计为用作节点的“主要”对象类,而其他一些对象类(例如securityObject)(正式称为“ simpleSecurityObject”)被设计为“辅助”对象,而被添加到节点。 前者被称为“结构对象类”,而后者被称为“辅助对象类”。
- 必须只有一个结构对象类
架构图
- 属性和对象类是定义的,而不是硬编码的。 对于Debian上的OpenLDAP,可以在/ etc / ldap / schema中找到模式。 例如,您可以在core.schema中找到以下对象类:
objectclass ( 2.5.6.6 NAME 'person'
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
- 它说它必须具有'sn'和'cn'属性,并可能具有'userPassword'属性等。它说其超类是'top',它是代表最顶层对象类的内置对象类。 。 它还说“人”对象类是结构类。
使用LDAP进行身份验证
- 一种简单的方法是根据用户名检索节点,获取密码并将其与用户输入的密码进行比较。
- 但是,这允许通过服务通过网络检索任何用户的敏感信息(密码)。 因此,还有另一种方法:将dn和密码发送到LDAP服务,然后让它执行检查。 这称为对该dn的“绑定”。 本质上,您是作为特定节点登录的。
- 以上两种方法都将以明文方式传输密码。 因此,在访问LDAP服务时(使用ldaps://),您可能应该使用TLS。
- 上述方法是其他服务(例如邮件,Samba或Apache)最常用于检查用户密码的方法。
- 使用OpenLDAP执行管理时,您可以使用上面的“绑定”方法以代表管理员的节点身份登录。 这称为“简单身份验证”:
# ldapsearch -x -W -D cn=admin,dc=foo,dc=com ...
- 但是,有时将身份验证为不是管理员身份而不是目录中的节点更为方便。 例如,如果您的站点使用Kerberos,则可以使用OpenLDAP执行单点登录。 这通过其SASL支持来完成。 SASL反过来支持许多机制,例如PLAIN(纯文本),GSSAPI(Kerberos),EXTERNAL(使用带有TLS的客户端证书之类的传输)。 当SASL进行身份验证时,OpenLDAP将组成一个dn来代表您的身份。 例如,对于Kerberos域foo.com中的用户Kent,伪造的dn将为uid = kent,cn = foo.com,cn = gssapi,cn = auth。 这是授予权限所必需的。
在Debian上设置并运行OpenLDAP
- 在Debian上设置OpenLDAP时,您需要重新配置软件包,以便它为您以及代表管理员的节点创建初始目录:
# dpkg-reconfigure -p low openldap
- 然后,要检查其是否正常运行,可以使用SASL EXTERNAL机制,并使用Unix域套接字(ldapi:///)作为root用户连接到它:
# ldapsearch -b cn=config -H ldapi:/// -Y external
询问
- 就像关系数据库一样,您可以执行查询来检索节点及其属性。 例如,您可以尝试在dn为dc = foo,dc = com(搜索的“基础”)的节点下查找所有带有cn = Kent Tong(“过滤器”)的节点:
# ldapsearch -b dc=foo,dc=com -H ldapi:/// -Y external 'cn=Kent Tong'
- 您可以尝试查找其objectClass为'person'且cn包含单词'Kent'的所有节点:
# ldapsearch -b dc=foo,dc=com ... "(&(objectClass=person)(cn=*Kent*))"
- 您可能会告诉它仅检索某些属性:
# ldapsearch -b dc=foo,dc=com ... "(&(objectClass=person)(cn=*Kent*))" dn sn
更新数据
- 要添加新节点,请确保已存在父节点,然后在文本文件(称为LDIF文件)中指定dn和其他属性,并将其标记为“添加”请求:
dn: cn=Paul Chan,ou=Finance dept,dc=foo,dc=com
changetype: add
cn: Paul Chan
sn: Chan
email: paul@ttdev.com
objectClass: person
- 然后将LDIF文件输入ldapmodify:
# ldapmodify < myfile.ldif
- 要修改(添加,更改或删除)现有节点的属性,请首先指定该节点,然后列出每个属性更改,并用包含单个连字符的行将它们分开。 最后,以空行结束节点:
dn: cn=Kent Tong,ou=Finance dept,dc=foo,dc=com
changetype: modify
add: givenName
givenName: Kent
-
replace: email
email: kent@foo.com
-
delete: phoneNumber
- 删除节点:
dn: cn=Paul Chan,ou=Finance dept,dc=foo,dc=com
changetype: delete