注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

ldap相关  

2010-08-31 18:16:44|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
DN (Distinguished Name) 可分辨名称 类似id的作用
DC (Domain Component) 域组件 类似域名 vanillatech.com
OU (Organizational Unit) 组织单元 类似 group的概念
CN (Common Name) 通用名 类似用户名

ldapsearch -h hostip -xLLL -D 'uid=test2,cn=users,dc=parahost,dc=example,dc=com' -w test22 -b 'cn=users,dc=parahost,dc=infoteria,dc=com' uid=test2
-b base dn for search, 基于这个目录进行搜索,假如没有后面的uid=john精确匹配 那么会打印出下面的所有的子节点
uid=test2 精确匹配项,匹配到这个就只出现这个节点下面的值了,不会出子节点
-D 假如需要验证密码的,需要填写这项 ,类似用户名
-w 密码
-x 简单验证,去掉这个假如john没有密码那么可能访问不了
-LLL 输出的格式
php中假如仅仅实现帐号密码的验证那么下面的代码就够了
$link_identifier = ldap_connect("hostip");
//下面这句没有的话 怎么验证都失败,就是说需要对应服务器的ldap版本才可以
ldap_set_option ( $link_identifier, LDAP_OPT_PROTOCOL_VERSION, 3 );
if($link_identifier)
    if(ldap_bind($link_identifier, "uid=test2,cn=users,dc=parahost,dc=example,dc=com", "test22"))
        echo "成功";
    else 
        echo "失败";


ubuntu10.0.4 ldap目录
/etc/ldap
重启ldap命令
/etc/init.d/sldap restart

============ ldif 文件的 例子=====================
dn: o=linuxfocus.org
o: linuxfocus.org
objectclass: top
objectclass: organization

dn: ou=editors, o=linuxfocus.org
ou: editors
objectclass: organizationalUnit

dn: uid=aghaffar, ou=editors, o=linuxfocus.org
uid: aghafar
cn: Atif Ghaffar
sn: Ghaffar
givenname: Atif
objectclass: person
userpassword: yIvSBWSuLs2N2
mailacceptinggeneralid: aghaffar@linuxfocus.org
ou: editors

dn: uid=mkempe, ou=editors, o=linuxfocus.org
uid: mkempe
cn: Magnus Kempe
sn: Kempe
givenname: Magnus
objectclass: person
userpassword: clearpass
mailacceptinggeneralid: mkempe@linuxfocus.org
maildrop: mkempe@developer.ch
preferredlanguage: fr
ou: editors


1. 这一行定义顶级记录的区分名(dn),这将是目录树的根,这是必须定义的。
2. 这一行我们定义组织(o),并赋值为“linuxfocus.org”。
3. 这一行定义这个对象的对象类,我们定义为top。
4. 定义对象的类型(这里是组织对象)。
5. 空行为分割符。
6. 定义组editors(这是linuxfocus editors分支),举一反三,我们也可以根据不同的目的来定义其他的分支,比如hosts和data分支。
7.明确定义组织单元(ou)editors的属性。属性是可以被用来查询的条目,比如,如果你想要查询所有属于editors的用户,你可以这样查询 “show all dn where ou=editors”。如果我们没有定义属性,则这条记录将不符合查询条件。
8. 定义对象类(组织单元)。
9. 空行为分割符。
10. 定义属于组editors的用户aghaffar的区分名。
11. 定义该用户的uid(要保证其是唯一的)。
12. 定义该用户的cn(普通名字),比如,我喜欢将我的名字写成“Firstname Lastname”,而有的人可能喜欢“Lastname Firstname”.
13. 姓
14. 名
15. 对象类(人)
16. 用户密码(这里是加密的密码)。这串字符表示密码是用加密算法加密过的。剩下的部分是用“yI”加密的密码"yIvSBWSuLs2N"。
17. 定义我的邮件地址。
18. 定义我所属于的组织单元(组editors)
19. 空行为分割符。
20. 定义另一个用户mkempe
21. 普通名字
22. 姓
23. 名
24. 对象类
25. 用户密码:注意这里我们使用明文密码。你可以为不同的用户使用不同的方案。这是根据每一条目定义的,而不是基于数据库定义的。因此一个用户可能使用明文密码,第二个可能使用加密密码,另一个则可能使用SHA认证方式。
26. 邮件地址。
27. maildrop:定义用户邮箱的真实位置。在这个例子中,这个服务器接受收件人为mkempe@linuxfocus.org的邮件,然后邮件服务器会查询ldap服务器“有接受收件人为mkempe@linuxfocus.org的邮箱吗?”ldap服务器就会返回maildrop属性值。接着邮件服务器就会将该邮件发给那个邮箱。
28.母语:这是我们一个额外的属性,这个属性定义了用户的母语。我们可以利用存储在中央ldap服务器的信息来为改用户提供更好的服务。比如,直接向该用户显示本页的法语版本。请注意前面一条记录没有母语、maildrop等属性,这也是ldap强大的一个方面——不必象一个数据库中的表格那样拥有固定的结构。你可以在一条记录中定义3条属性,而在另一个中定义30条属性。
29. 组织单元。
=============基本 LDAP 语法============
=(等于)
此 LDAP 参数表明某个属性等于某个值的条件得到满足。例如,如果希望查找“名“属性为“John”的所有对象,可以使用:
(givenName=John)
这会返回“名”属性为“John”的所有对象。圆括号是必需的,以便强调 LDAP 语句的开始和结束。

&(逻辑与)
如果具有多个条件并且希望全部条件都得到满足,则可使用此语法。例如,如果希望查找居住在 Dallas 并且“名”为“John”的所有人员,可以使用:
(&(givenName=John)(l=Dallas))
请注意,每个参数都被属于其自己的圆括号括起来。整个 LDAP 语句必须包括在一对主圆括号中。操作符 & 表明,只有每个参数都为真,才会将此筛选条件应用到要查询的对象。
!(逻辑非)
此操作符用来排除具有特定属性的对象。假定您需要查找“名”为“John”的对象以外的所有对象。则应使用如下语句:
(!givenName=John)
此语句将查找“名”不为“John”的所有对象。请注意:! 操作符紧邻参数的前面,并且位于参数的圆括号内。由于本语句只有一个参数,因此使用圆括号将其括起以示说明。
*(通配符)
可使用通配符表示值可以等于任何值。使用它的情况可能是:您希望查找具有职务头衔的所有对象。为此,可以使用:
(title=*)
这会返回“title”属性包含内容的所有对象。另一个例子是:您知道某个对象的“名”属性的开头两个字母是“Jo”。那么,可以使用如下语法进行查找:
(givenName=Jo*)
这会返回“名”以“Jo”开头的所有对象。
以下是 LDAP 语法的高级使用示例:
您需要一个筛选条件,用来查找居住在 Dallas 或 Austin,并且名为“John”的所有对象。使用的语法应当是:
(&(givenName=John)(|(l=Dallas)(l=Austin)))
您发现应用程序日志中有 9,548 个事件,因此需要查找导致这些日志事件的所有对象。在此情况下,您需要查找所有被禁用的用户 (msExchUserAccountControl=2),这些用户的 msExchMasterAccountSID 没有值。使用的语法应当是:
(&(msExchUserAccountControl=2)(!msExchMasterAccountSID=*))

  注意:
! 操作符与通配符的结合使用可查找属性未设置为任何值的对象
===========ldapsearch 语法=================
ldapsearch [options] [filter [attributes...]]
where:
  filter RFC 4515 compliant LDAP search filter
  attributes 空格分隔的属性列表
    which may include:
      1.1   no attributes
      *     all user attributes
      +     all operational attributes
Search options:
  -a deref   one of never (default), always, search, or find
  -A         retrieve attribute names only (no values)
  -b basedn  base dn for search
  -E [!]<ext>[=<extparam>] search extensions (! indicates criticality)
             [!]domainScope              (domain scope)
             !dontUseCopy                (Don't Use Copy)
             [!]mv=<filter>              (matched values filter)
             [!]pr=<size>[/prompt|noprompt]   (paged results/prompt)
             [!]subentries[=true|false]  (subentries)
             [!]sync=ro[/<cookie>]            (LDAP Sync refreshOnly)
                     rp[/<cookie>][/<slimit>] (LDAP Sync refreshAndPersist)
             [!]<oid>=:<value>           (generic control; no response handling)
  -F prefix  URL prefix for files (default: file:///var/tmp//)
  -l limit   time limit (in seconds, or "none" or "max") for search
  -L         print responses in LDIFv1 format
  -LL        print responses in LDIF format without comments
  -LLL       print responses in LDIF format without comments
             and version
  -s scope   one of base, one, sub or children (search scope)
  -S attr    sort the results by attribute `attr'
  -t         write binary values to files in temporary directory
  -tt        write all values to files in temporary directory
  -T path    write files to directory specified by path (default: /var/tmp/)
  -u         include User Friendly entry names in the output
  -z limit   size limit (in entries, or "none" or "max") for search
Common options:
  -c         continuous operation mode (do not stop on errors)
  -d level   set LDAP debugging level to `level'
  -D binddn  bind DN
  -e [!]<ext>[=<extparam>] general extensions (! indicates criticality)
             [!]assert=<filter>     (a RFC 4515 Filter string)
             [!]authzid=<authzid>   ("dn:<dn>" or "u:<user>")
             [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
                     one of "chainingPreferred", "chainingRequired",
                     "referralsPreferred", "referralsRequired"
             [!]manageDSAit
             [!]noop
             ppolicy
             [!]postread[=<attrs>]  (a comma-separated attribute list)
             [!]preread[=<attrs>]   (a comma-separated attribute list)
             [!]relax
             abandon, cancel, ignore (SIGINT sends abandon/cancel,
             or ignores response; if critical, doesn't wait for SIGINT.
             not really controls)
  -f file    read operations from `file'
  -h host    LDAP server
  -H URI     LDAP Uniform Resource Identifier(s)
  -I         use SASL Interactive mode
  -M         enable Manage DSA IT control (-MM to make critical)
  -n         show what would be done but don't actually do it
  -N         disable reverselookup
  -O props   SASL security properties
  -o <opt>[=<optparam] general options
             nettimeout=<timeout> (in seconds, or "none" or "max")
  -p port    port on LDAP server
  -P version protocol version (default: 3)
  -Q         use SASL Quiet mode
  -R realm   SASL realm
  -U authcid SASL authentication identity
  -v         run in verbose mode (diagnostics to standard output)
  -V         print version info (-VV only)
  -w passwd  bind password (for simple authentication)
  -W         prompt for bind password
  -x         Simple authentication
  -X authzid SASL authorization identity ("dn:<dn>" or "u:<user>")
  -y file    Read password from file
  -Y mech    SASL mechanism
  -Z         Start TLS request (-ZZ to require successful response)
  
  
  ==============访问控制相关==============
  1 语法

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

其中,access to指示启用访问控制,上句大致可以理解为:
access to <对什么目标进行控制>[by <作用于哪些访问者> <授予什么样的访问权限><采取什么样的匹配控制动作>]+


2 剖析

2.1 控制目标<what>

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

<what> ::= * |
                [dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
                [filter=<ldapfilter>] [attrs=<attrlist>]
2.1.1 指定所有的记录

access to *

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直接命名的,故不匹配

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)

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

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*"

2.3 被授予的权限<access>

当选取好ACL作用的目标记录并选取好用户范围后,就该给这些用户授予他们应该得到的权限了。大致的权限(由低到高)有以下几类:
none        无权限,即拒绝访问
auth        访问bind(认证)设置的权限;前提是需要用户提交一个DN形式的用户名并能通过认证
compare        比较属性的权限;(例如:对照查看某用户的telephoneNumber值是不是158 8888 8888),但并不具有搜索的权限
search        利用过虑条件进行搜索的权限,但这并不一定具有可读取搜索结果的权限
read        读取搜索结果的权限
write        更改记录属性值的权限

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

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

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

stop                这个是默认值,这表示在一次匹配产生后将不再进行下一个匹配,所有后续的匹配将会停止。
continue        无论匹配是否已经发生,继续进行直到所有的规则全部进行完匹配检查
break                一个匹配发生后,跳出当前的子句进行后一个子句的检查

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  #管理员组的用户可更改

2.6 官方给出的完整语法

<access directive> ::= access to <what>
                [by <who> <access> <control>]+
        <what> ::= * |
                [dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
                [filter=<ldapfilter>] [attrs=<attrlist>]
        <basic-style> ::= regex | exact
        <scope-style> ::= base | one | subtree | children
        <attrlist> ::= <attr> [val[.<basic-style>]=<regex>] | <attr> , <attrlist>
        <attr> ::= <attrname> | entry | children
        <who> ::= * | [anonymous | users | self
                        | dn[.<basic-style>]=<regex> | dn.<scope-style>=<DN>]
                [dnattr=<attrname>]
                [group[/<objectclass>[/<attrname>][.<basic-style>]]=<regex>]
                [peername[.<basic-style>]=<regex>]
                [sockname[.<basic-style>]=<regex>]
                [domain[.<basic-style>]=<regex>]
                [sockurl[.<basic-style>]=<regex>]
                [set=<setspec>]
                [aci=<attrname>]
        <access> ::= [self]{<level>|<priv>}
        <level> ::= none | auth | compare | search | read | write
        <priv> ::= {=|+|-}{w|r|s|c|x|0}+
        <control> ::= [stop | continue | break]
        
  
  ==================================
  参考
  ubuntu 10.0.4中假设ldap服务器
  https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html
  Linux下的LDAP服务器实现
  http://fanqiang.chinaunix.net/app/ldap/2007-02-08/5075.shtml
  使用PHP连接LDAP服务器
  http://fanqiang.chinaunix.net/app/ldap/2005-04-23/3189.shtml
  评论这张
 
阅读(1216)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017