一个ldap身份认证的具体例子

时间:2022-09-23 22:33:30

先建立一个创建起始结点所用的ldif文件

 

#vi init.ldif

 

输入以下内容(可以根据自己的需要修改)

dn: dc=mydomain,dc=org  #定义根结点

objectClass: top

objectClass: domain

objectClass: organization

dc: mydomain

o: mydomain.org

description:  Mydomain.org ldap

 

 

dn: cn=Manager,dc=mydomain,dc=org    #定义目录管理员

objectClass: organizationalRole

cn: Manager

description: Directory Manager

 

dn: ou=people,dc=mydomain,dc=org  #定义一个OU

ou: people

objectClass: organizationalUnit

 

注意:ldif文件中,每一行中冒号后有一个空格,行尾一定不能有空格。切记!

 

6.2使用离线import命令导入到目录中,需要离线进行(要先关闭slapd进程)

 

#kill -INT `cat /usr/local/openldap/var/run/slapd.pid`

# /usr/local/openldap/sbin/slapadd -v -l ./init.ldif 

bdb_db_open: Warning - No DB_CONFIG file found in directory /var/openldap/data-3: (2)

Expect poor performance for suffix dc=mydomain,dc=org.

added: "dc=mydomain,dc=org" (00000001)

added: "ou=people,dc=mydomain,dc=org" (00000002)

 

命令中:

-v选项表示启用verbose模式,即输出执行中的具体信息;

-l表示后面附加ldif文件。

其它常用的选项还有:

-d  指定debug向日志文件输出信息,后面跟日志级别

-f  指定要读取的配置文件

 

6.3 启动服务进程

 

#/usr/local/openldap/libexec/slapd

 

6.4 建立要导入的具体信息记录的ldif文件

 

#vi users.ldif

 

dn: cn=Tom Black,ou=people,dc=mydomain,dc=org   定义人员1

cn: Tom Black

sn: Black

mail: tom@126.com

telephoneNumber: 371-6338-3522

objectClass: inetOrgPerson

 

dn: cn=Jerry Smith,ou=people,dc=mydomain,dc=org    定义人员2

cn: Jerry Smith

sn: Smith

mail: jerry@sina.com

telephoneNumber: 371-6338-3521

objectClass: inetOrgPerson

 

6.5 导入ldif文件

 

# /usr/local/openldap/bin/ldapadd -D "cn=Manager,dc=mydomain,dc=org" -W -x  -f users.ldif 

Enter LDAP Password: 

adding new entry "cn=Tom Black,ou=people,dc=mydomain,dc=org"

 

adding new entry "cn=Jerry Smith,ou=people,dc=mydomain,dc=org"

 

命令中:

-D选项表示指定绑定到LDAP的DN;

-W表示提示用户输入密码;

-x表示使用简单身份验正方式,默认的是使用sasl进行验正;

-f用来指定ldif文件;

 

七、配置文件中的高级功能使用方法

 

1. 开启日志功能

 

启用日志功能,需要在编译时指定--enable-debug 选项,默认是允许的。要打开slapd的日志功能,需要在slapd.conf中的全局配置段添加loglevel指令,并后跟一个十进制数字表示的日志级别,如下所示:

 

# Added logging parameters

loglevel     256

 

其日志级别如下所示:

 

-1        记录所有的信息

0        不记录debug

1        跟踪功能调用的信息

2        包处理的debug信息

4        丰富的debug信息

8        连接管理信息

16        包的收发信息

32        搜索过滤的处理过程

64        配置文件的处理过程

128        访问控制列表处理过程

256        连接、操作及其结果的统计数据

512        向客户端返回的结果的统计信息

1024        与shell后端的通信信息

2048        显示记录条目的分析信息

4096        数据库缓存处理信息

8192        数据库索引

16384        从服务器数据同步资源消耗处理信息

 

若要记录所有的debug日志,可以使用LOG_LEVEL4 syslogd系统日志来记录,这需要在slapd.conf中添加如下语句实现:

 

local4.debug        /var/log/slapd.log

 

2. 为BDB后端数据库实例指定在内存中的缓存空间大小

 

在如下句子后

DBDirectory:        /usr/local/openldap/var/openldap-data

后添加:

DBCachesize: 2000

 

3. 访问控制列表:

 

3.1 语法

 

access to <what>[by <who> <access> <control>]+

 

其中,access to指示启用访问控制,上句大致可以理解为:

access to <对什么目标进行控制>[by <作用于哪些访问者> <授予什么样的访问权限><采取什么样的匹配控制动作>]+

 

 

3.2 剖析

 

3.2.1 控制目标<what>

 

这一域主要是实现对ACL应用对象的指定,对象可以是记录和属性。选择ACL目标记录的方法一般有两种:DN和filter,语法为:

 

<what> ::= * |

                [dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]

                [filter=<ldapfilter>] [attrs=<attrlist>]

3.2.1.1 指定所有的记录

 

access to *

 

3.2.1.2 通过DN指定

 

语法如下:

 

to dn[.<basic-style>]=<regex>

<basic-style> ::= regex | exact

 

to dn.<scope-style>=<DN>

<scope-style> ::= base | one | subtree | children

 

第一种方法是使用正则表达式(dn.regex)或精确匹配(dn.style)的方式来匹配符合条件的记录(这个好像不像想象的那么简单,实现起来颇为费脑筋),例如:

 

access to dn="^.*,uid=([^,]+),ou=users,(.*)$"

 

 

第二种方法通过“区域”选择的方法进行目标记录的选取,对以指定的DN开始的目录树区域进行目标记录匹配。匹配区域的方式共有四种:

base                只匹配DN本身一条记录

one                匹配以给定DN为父目录的所有记录

subtree                匹配以给定DN为根目录的所有子树内的记录

children        匹配给定DN下的所有记录,但应该不包括以DN直接命名的那条记录(参见例子的解释)

 

例如:对于

 

0: dc=mydomain,dc=org

1: cn=root,dc=mydomain,dc=org

2: ou=users,dc=mydomain,dc=org

3: uid=samba,ou=users,dc=mydomain,dc=org

4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org

5: uid=guest,ou=users,dc=mydomain,dc=org

 

规则 dn.base="ou=users,dc=mydomain,dc=org" 只会匹配记录2

规则 dn.one="ou=users,dc=mydomain,dc=org" 匹配记录3和记录5,记录4是记录3的子目录,故不算在内

规则 dn.subtree="ou=users,dc=mydomain,dc=org" 匹配记录2、3、4、5

规则 dn.children="ou=users,dc=mydomain,dc=org" 匹配记录3、4、5,因为记录0、1和2都是以DN直接命名的,故不匹配

 

3.2.1.3 通过filter匹配记录

 

通过filter指定过滤规则进行记录过虑,语法如下:

 

access to filter=<ldap filter>

 

其中filter指定的为search的过滤规则,这类同于linux系统中grep的匹配方式。如:

 

access to filter=(objectClass=sambaSamAccount)

 

也可以结合使用DN和filter进行记录的匹配,例如:

 

access to dn.subtree="ou=users,dc=mydomain,dc=org" filter=(objectClass=posixAccount)

 

3.2.1.4 通过attrs选取匹配记录

 

语法:

attrs=<attribute list>

 

例如:

access to attrs=uid,uidNumber,gidNumber

 

也可以结合使用DN和attrs进行记录的匹配,例如:

access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid

 

3.2.2 被用来授权的访问者<who>的指定

 

指定被授权的用户范围的方法大致有以下几种:

*                        所有的访问者,包括匿名的用户

anonymous                非认证的匿名用户

users                        认证的用户

self                        目标记录的用户自身

dn[.<basic-style>]=<regex>        在指定目录内匹配正则表达式的用户

dn.<scope-style>=<DN>                指定DN内的用户

 

例如:

by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"

 

3.2.3 被授予的权限<access>

 

当选取好ACL作用的目标记录并选取好用户范围后,就该给这些用户授予他们应该得到的权限了。大致的权限(由低到高)有以下几类:

none        无权限,即拒绝访问

auth        访问bind(认证)设置的权限;前提是需要用户提交一个DN形式的用户名并能通过认证

compare        比较属性的权限;(例如:对照查看某用户的telephoneNumber值是不是158 8888 8888),但并不具有搜索的权限

search        利用过虑条件进行搜索的权限,但这并不一定具有可读取搜索结果的权限

read        读取搜索结果的权限

write        更改记录属性值的权限

 

可以在slapd.conf文件中通过defaultaccess指定默认的权限级别,如:

defaultaccess        search

 

3.2.4 采取什么样的匹配控制动作<control>

 

在进行记录的匹配时,如果有多条规则存在,那么在第一次匹配产生后是否还进行后续的匹配或采取其它的动作将取决于此项的设置;控制方式共有以下三种:

 

stop                这个是默认值,这表示在一次匹配产生后将不再进行下一个匹配,所有后续的匹配将会停止。

continue        无论匹配是否已经发生,继续进行直到所有的规则全部进行完匹配检查

break                一个匹配发生后,跳出当前的子句进行后一个子句的检查

 

3.2.5 一个例子

 

access to dn.chilren="ou=users,dc=mydomain,dc=org"

    attrs=userPassword  #指定“密码”属性

    by self write       #用户自己可更改

    by * auth           #所有访问者需要通过认证

    by dn.children="ou=admins,dc=mydomain,dc=org" write  #管理员组的用户可更改

 

待续……