集中式用户认证LDAP
作用:
提供集中用户认证的信息
提供用户信息的查询
Lightweight Directory Access Protocol 轻量级目录访问协议
====================================================================
一、相关概念:
1. Directory Services 目录服务
它是一个特殊的数据库,它存储的是一些小的信息块
常见的目录服务:
电话本: 电话号码 人名
DNS: 主机名 IP
NIS: 账户信息:用户名 密码...
LDAP: 用户联系信息: 国家 省 街道 邮编 邮件 电话...
账户信息:username passwd home uid gid
任何信息:例如鱼香肉丝食材原料
AD: Windows(LDAP + Kerberos)
关系型数据库:MySql,oracle,db2,sql server 写和读都是频繁
目录服务: LDAP,AD写少,读频繁(一次写入,多次读取),优化读
2. X.500 Directory Service
DAP: 目录访问协议
LDAP: 轻量级目录访问协议
X.500是,构成全球分布式的名录服务系统的协议。X.500组织起来的数据就象一个很全的电话号码簿,或者说一个X.500系统象是一个分门别类的图书馆。而某一机构建立和维护的名录数据库只是全球名录数据库的一部分。
X.500目录服务是一种CCITT(ITU)针对已经被国际标准化组织(SIO)接受的目录服务系统的建议。X.500定义一个机构如何在一个企业的全局范围内共享名字和与它们相关的对象。一个完整的X.500系统称为一个“目录”。X.
500已经被接受作为提供世界范围的目录服务的一种国际标准。它与X.400电子函件标准密切相连。X.500是层次性的,其中的管理性域(机构、分支、部门和工作组)可以提供这些域内的用户和资源的信息。X.500被认为是实
现一个目录服务的最好途径,但是它的实现需要很大投资,却没有其它方式的速度快。
二、Schema架构:
====================================================================
重量级知识点:
entry,entries 条目, LDAP数据库里基本的存储单元,一堆属性的集合
attributes 属性, 每个属性有一个type类型,一个或多个values值
distinguished name DN, 唯一的区分名,用以区分条目,数据库中不能出现两相条目有相同的DN
rdn 相对区分名, dn最左边
Schema 架构, 规定数据库里条目中能存什么,以及怎么存!
object classes: 对象类, name/OID: 规定一个entry可以出现哪些attribute, 它是多个attribute集合
attribute types: 属性类型, name/OID: 规定每个属性怎么去描述,例如 身高 怎么表示,是单值还是多值...
常用的属性:
dn 用来唯一的标识entry,相当于primary key
cn 全名
sn 用户的姓
uid 登录名
userPassword
shadowLastChange
shadowMin
shadowMax
shadowWarning
loginShell
uidNumber 用户UID
gidNumber
homeDirectory
c 两位国家代码CN
o Name of an organization 组织名,一般公司名
ou Name of an organizational unit 组织单元,部门名
mail Internet e-mail address
st 省
l 区
street 街道
dc wh.up.com dc=wh,dc=up,dc=com
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长
CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, distinguished name)
LDAP连接服务器的连接字串格式为:ldap://servername/DN
其中DN有三个属性,分别是CN,OU,DC
LDAP是一种通讯协议,如同HTTP是一种协议一样的!
在 LDAP 目录中,
· DC (Domain Component构成)
· CN (Common Name)
· OU (Organizational Unit)
LDAP 目录类似于文件系统目录。
下列目录:
DC=redmond,DC=wa,DC=microsoft,DC=com
如果我们类比文件系统的话,可被看作如下文件路径:
Com\Microsoft\Wa\Redmond
例如:CN=jim,OU=developer,DC=domainname,DC=com
在上面的代码中 cn=jim 可能代表一个用户名,ou=developer 代表一个 active directory 中的组织单位。这句话的含义可能就是说明 jim这个对象处在domainname.com 域的 developer 组织单元中。
使用标准的Schema:
[root@uplook ~]# rpm -qa |grep openldap
openldap-2.3.43-25.el5
openldap-devel-2.3.43-25.el5
[root@uplook ~]# yum -y install openldap-servers
[root@uplook ~]# cd /etc/openldap/schema/
[root@uplook schema]# ls
corba.schema cosine.schema java.schema openldap.ldif README
core.ldif dyngroup.schema misc.schema openldap.schema redhat
core.schema inetorgperson.schema nis.schema ppolicy.schema
[root@station11 schema]# vim core.schema
objectClasses: ( 2.5.6.6 NAME 'person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
SUP top 继承top对象类,top最顶层的对象类
MUST 强制的属性 mandatory(强制)
MAY 可选的属性
ABSTRACT 抽象对象类 top
STRUCTURAL 主对象类(结构 架构)
AUXILIARY 辅对象类
注意:在一个entry里有且只有一个主对象类STRUCTURAL(同一级别)
可以有多个辅助对象AUXILIARY
[root@station11 schema]# vim nis.schema
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
DESC 'Abstraction of an account with POSIX attributes'
SUP top AUXILIARY
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ description ) )
objectclass ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount'
DESC 'Additional attributes for shadow passwords'
SUP top AUXILIARY
MUST uid
MAY ( userPassword $ shadowLastChange $ shadowMin $
shadowMax $ shadowWarning $ shadowInactive $
shadowExpire $ shadowFlag $ description ) )
objectclass ( 1.3.6.1.1.1.2.2 NAME 'posixGroup'
DESC 'Abstraction of a group of accounts'
SUP top STRUCTURAL
MUST ( cn $ gidNumber )
MAY ( userPassword $ memberUid $ description ) )
attributetype ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory'
DESC 'The absolute path to the home directory'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
能否使用某个属性attribute 是由对象类objectalass决定的
属性的值的表示方法,例如是单值还是多值是由attributetype决定的
三、LDIF: A standard text-based format for describing directory entries
是一个标准的基于文本格式,用来描述entry
作用:用来将条目批量导入到LDAP数据库中
cat add_entry.ldif
dn: uid=zhuzhu2,ou=People,dc=uplook,dc=com
uid: zhuzhu2
cn: zhuzhu2
sn: zhuzhu2
mail: [email protected]
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JFRrS0hRMFM4JHBWbXZvaGF0VGcySUpwdGUvOFU3WFUuUHFIUzQ
uTnkvVnlnOExZWTZqUU0uV1ZUMm1sRW5nN2V5ak9JUS5HNWF3aXguRG85REF1eXRSRGdxSnZ2Uzcx
shadowLastChange: 16429
shadowMin: 0
shadowMax: 30
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 532
gidNumber: 537
homeDirectory: /rhome/zhuzhu2
dn: cn=ldapuser1,ou=Group,dc=uplook,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword: {crypt}x
gidNumber: 500
#ldapmodify -xWD 'cn=admin,dc=uplook,dc=com' -f add_entry.ldif
或去掉changetype后
# ldapmodify -a -xWD 'cn=admin,dc=uplook,dc=com' -f add_entry.ldif
# ldapadd -xWD 'cn=admin,dc=uplook,dc=com' -f add.ldif
注:
1. 需要让LDAP Server 支持相应用的Schema /etc/openldap/slapd.conf
/usr/share/openldap-servers/slapd.conf.obsolete(模板)
/usr/share/openldap-servers/slapd.conf.obsolete 为OpenLDAP 配置文件模板。
/usr/share/openldap-servers/DB_CONFIG.example 为OpenLDAP 数据库配置文件模板。
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
要配置OpenLDAP 服务端,需要将如上配置文件模板复制到/etc/openldap/目录下并命名为slapd.conf,
同时将数据库配置文件模板复制到/var/lib/ldap/目录中并将其命名为DB_CONFIG,且/var/lib/ldap/目录权限所有主(owner),所属组(group)必须为ldap 用户可读写,否则会在加载slapd进程时显示权限警告。
相当于MySQL定义表结构
MySQL表结构需要开发人员人自定义
LDAP的架构由开人员自定义或直接使用标准的Schema,建议使用标准的Schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema 用来唯一的标识entry,相当于primary key
cn 全名
sn 用户的姓
uid 登录名
userPassword
shadowLastChange
shadowMin
shadowMax
shadowWarning
loginShell
uidNumber 用户UID
gidNumber
homeDirectory
c 两位国家代码CN
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include 行代表当前OpenLDAP 服务包含的schema 文件。schema 是整个OpenLDAP 目录树的标准规范,标识数据和类型的关系。例如,要使OpenLDAP 服务端支持Samba 服务用户验证,此时就需要包含Samba 对应的schema 文
件(samba.schema),关于schema
2. 导入Entry LDIF文件 ,相当于向MySQL插入记录时,必须遵循表结构的定义
dn: cn=ldapuser1,ou=Group,dc=uplook,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword: {crypt}x
gidNumber: 500
LDIF不建议手动产生,而是利用迁移工具如migrationtools自动生成
yum install -y migrationtools
//会读取当前目录的 migrate_common.ph 的定义
/usr/share/migrationtools/migrate_base.pl >base.ldif
创建根域条目可以编辑base.ldif 进行修改,将不需要的条目删除,然后通过ldapadd 导入至OpenLDAP目录树。
//会读取本机的/etc/shadow文件
/usr/share/migrationtools/migrate_group.pl user.txt >user.ldif
/usr/share/migrationtools/migrate_passwd.pl group.txt >group.ldif
添加用户和组信息
[root@rhel6 ~]# cat user.txt
ldapuser1:x:500:500::/rhome/ldapuser1:/bin/bash
ldapuser2:x:501:501::/rhome/ldapuser2:/bin/bash
ldapuser3:x:502:502::/rhome/ldapuser3:/bin/bash
ldapuser4:x:503:503::/rhome/ldapuser4:/bin/bash
ldapuser5:x:504:504::/rhome/ldapuser5:/bin/bash
ldapuser6:x:505:505::/rhome/ldapuser6:/bin/bash
ldapuser7:x:506:506::/rhome/ldapuser7:/bin/bash
ldapuser8:x:507:507::/rhome/ldapuser8:/bin/bash
ldapuser9:x:508:508::/rhome/ldapuser9:/bin/bash
ldapuser10:x:509:509::/rhome/ldapuser10:/bin/bash
[root@rhel6 ~]# cat group.txt
ldapuser1:x:500:
ldapuser2:x:501:
ldapuser3:x:502:
ldapuser4:x:503:
ldapuser5:x:504:
ldapuser6:x:505:
ldapuser7:x:506:
ldapuser8:x:507:
ldapuser9:x:508:
ldapuser10:x:509: