LDAP介绍
轻型目录存取协定(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。1 目录服务在开发内部网和与互联网程序共享用户、系统、网络、服务和应用的过程中占据了重要地位。2例如,目录服务可能提供了组织有序的记录集合,通常有层级结构,例如公司电子邮件目录。同理,也可以提供包含了地址和电话号码的电话簿。 https://zh.wikipedia.org/wiki/%E8%BD%BB%E5%9E%8B%E7%9B%AE%E5%BD%95%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE
简言之,LDAP提供了一个类似文件系统的树形结构,但是每个节点可以存储信息,也可以包含子节点(类似ZooKeeper)。理论上来说通过LDAP可以存储想要存储的任何信息,例如账号信息,电子邮件目录等等。
一个最常用的场景是分布式系统中,通过LDAP提供一个统一的用户管理平台,只要在LDAP中进行一次用户操作(增加,删除,修改等)就可以反映在所有配置LDAP客户端的机器上,而不需要在每台客户端机器上进行重复的同样的操作,以下就通过配置,实现该功能。
LADAP Server安装
以下安装参照官网的安装步骤,略有不同,官网是通过编译安装的方式,也可以采用yum安装。 官方地址 https://www.openldap.org/doc/admin24/quickstart.html
1、获取LDAP软件
从以下地址下载对应的版本 http://www.openldap.org/software/download/
2、解压LDAP软件
把第一步下载的软件上传到合适的目录,例如/opt/app下,进行解压
gunzip -c openldap-VERSION.tgz | tar xvfB -
进入到解压的目录下
cd openldap-VERSION
VERSION是下载对应的版本号
3、查看详细的文档
查看COPYRIGHT, LICENSE, README and INSTALL 以及 Building and Installing OpenLDAP Software,这个就先略了,与安装没有太大影响,看了会更了解。
4、运行 configure
运行configre,如果出现编译失败,一般是需要安装编译环境,yum install -y gcc-c++
,其他缺少的看错误提示进行补充安装
./configure
同时也可以运行
./configure --help
查看一些额外的编译命令,比如添加一些额外的集成功能。
5、构建
运行构建命令
make depend
make
6、构建测试
运行构建测试命令,查看构建是否成功
make test
7、安装LDAP软件
运行安装命令
su root -c 'make install'
至此LDAP已经成功安装完成
8、编辑slapd.ldif配置文件
编辑配置文件
vi /usr/local/etc/openldap/slapd.ldif
以下列出关键项目:
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
OlcDbMaxSize: 1073741824
olcSuffix: dc=<font color=#FF0000>\<MY-DOMAIN></font>,dc=<font color=#FF0000>\<COM></font>
olcRootDN: cn=Manager,dc=<font color=#FF0000>\<MY-DOMAIN></font>,dc=<font color=#FF0000>\<COM></font>
olcRootPW: secret
olcDbDirectory: /usr/local/var/openldap-data
olcDbIndex: objectClass eq
其中需要修改的是上面红色部分\ 和 \,一般替换为公司的域名,像maven坐标一样,公司域名一般是唯一的,不会重复。例如公司域名为 whl.com,就可以修改为以下内容
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
OlcDbMaxSize: 1073741824
olcSuffix: dc=whl,dc=com
olcRootDN: cn=Manager,dc=whl,dc=com
olcRootPW: secret
olcDbDirectory: /usr/local/var/openldap-data
olcDbIndex: objectClass eq
这里需要说明下olcRootDN的cn=Manager中Manager就是管理员的账号名,olcRootPW中的secret就是管理员的密码,如果有需要可以进行修改,同时密码也可以采用加密,这个先不提。
如果公司域名包含多个对象,例如 eng.whl.edu.cn,那可以修改为以下内容
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
OlcDbMaxSize: 1073741824
olcSuffix: dc=eng,dc=whl,dc=edu,dc=cn
olcRootDN: cn=Manager,dc=eng,dc=whl,dc=edu,dc=eu
olcRootPW: secret
olcDbDirectory: /usr/local/var/openldap-data
olcDbIndex: objectClass eq
9、编辑slapd.conf配置文件
编辑配置文件
vi /usr/local/etc/openldap/slapd.conf
在开始的位置增加两行,引入额外的objectClass对象定义文件
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema
10、启动SLAPD
运行启动命令
/usr/local/libexec/slapd
验证是否启动成功
ldapsearch -H ldap://<font color=#FF0000>YOUR-LDAP-SERVER-HOST-OR-IP</font> -x -b '' -s base '(objectclass=*)' namingContexts
YOUR-LDAP-SERVER-HOST-OR-IP 替换为安装了SLAPD机器的ip或者host 如果出来以下内容就是成功了
dn:
namingContexts: dc=whl,dc=com
11、初始化根对象
第一步,新建一个LDIF 文件
vi init.ldif
dn: dc=\<MY-DOMAIN>,dc=\<COM>
objectclass: dcObject
objectclass: organization
o: \<MY ORGANIZATION>
dc: \<MY-DOMAIN>
dn: cn=Manager,dc=\<MY-DOMAIN>,dc=\<COM>
objectclass: organizationalRole
cn: Manager
替换尖括号中的内容,例如:
dn: dc=whl,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: example
dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager
第二步,导入ldif文件
ldapadd -H ldap://<font color=#FF0000>YOUR-LDAP-SERVER-HOST-OR-IP</font> -x -D "cn=Manager,dc=\<MY-DOMAIN>,dc=\<COM>" -W -f init.ldif
注意替换YOUR-LDAP-SERVER-HOST-OR-IP 这里需要输入密码,密码就是第八步中olcRootPW: secret 的密码
验证是否添加成功
ldapsearch -H ldap://192.168.37.139 -x -b 'dc=\<MY-DOMAIN>,dc=\<COM>' '(objectclass=*)'
出来添加对象就是成功了
至此LDAP Server的安装和初始化就成功了。
从Linux机器上导入用户到LDAP上
以下内容参考了 https://www.ibm.com/developerworks/cn/linux/l-openldap/ http://blog.csdn.net/ztq157677114/article/details/50538176 http://www.linuxidc.com/Linux/2015-04/116536.htm
安装需要的环境
yum install nss-pam-ldapd pam_ldap openldap-clients
yum install -y nss-pam-ldapd
安装migrationtools
migrationtools 这个工具可以把Linux格式的用户和组转换成LDAP导入格式的ldif文件 运行以下命令进行安装
yum install migrationtools -y
修改migrationtools配置文件
cd /usr/share/migrationtools/
vi migrate_common.ph #公共的配置文件都在这里
$DEFAULT_BASE = "dc=whl,dc=com"; #这里要改成LDAP Server配置的相应的dc
使用migrationtools进行导入
注意,migrationtools是非必须的,该工具只是将linux用户格式转换成ldif格式方便转换,如果没有需要从linux中导入的用户,也可以手动编辑ldif文件进行导入。
生成base节点的ldif
./migrate_base.pl > base.ldif
编辑 base.ldif,删除除下面之外的所有条目:
dn: ou=People,dc=whl,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=whl,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
导入base节点的ldif
在 LDAP 服务器上,使用 OpenLDAP 客户机工具 ldapadd 将以下条目插入到数据库中。简单身份验证必须要使用 -x 选项指定。在 slapd.conf 中定义的 rootdn 身份验证识别名是 “cn=Manager,dc=ibm,dc=com”。对于简单身份验证来说,必须使用密码。选项 -W 强制提示输入密码。这个密码就是在 slapd.conf 文件中指定的 rootpw 参数的值。包含这些条目的 LDIF 文件是使用 -f 选项指定的:
ldapadd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=whl,dc=com" -W -f base.ldif
注意修改相应的ldap地址和dc
生成linux组ldif
grep ldapuser /etc/group > group.in #将需要导入ldap的组导出到group.in文件中,这里的组是ldapuser,这里的格式还是linux用户格式
./migrate_group.pl group.in > group.ldif #转换为ldif格式,这里已经是可以导入的格式了
生成的文件内容如下
dn: cn=ldapuser,ou=Group,dc=whl,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500
注意:这里只是做了一下转换,也完全可以手动编辑一个内容跟上面一模一样的文件,从而不需要使用migrationtools工具,以后添加新的用户,也是通过该方式。
导入生成linux组ldif
ldapadd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=ibm,dc=com" -W -f group.ldif
注意修改相应的ldap地址和dc
生成linux用户ldif
grep ldapuser /etc/passwd > passwd.in #将需要导入ldap的用户导出到group.in文件中,这里的用户是ldapuser,这里的格式还是linux用户格式
./migrate_passwd.pl passwd.in > passwd.ldif #转换为ldif格式,这里已经是可以导入的格式了
生成的文件内容如下
dn: uid=ldapuser,ou=People,dc=whl,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser
注意:这里只是做了一下转换,也完全可以手动编辑一个内容跟上面一模一样的文件,从而不需要使用migrationtools工具,以后添加新的用户,也是通过该方式。
导入linux用户ldif
ldapadd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=whl,dc=com" -W -f passwd.ldif
注意修改相应的ldap地址和dc
查看是否导入成功
ldapsearch -H ldap://192.168.37.139 -x -b 'dc=whl,dc=com' '(objectclass=*)'
有刚才的ldapuser就是正确的
LDAP Client安装
LDAP 身份验证要想正确地工作,需要配置两个服务:系统命名服务和身份验证服务。 系统命名服务(NSS)需要配置为使用 LDAP 来解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的。由于用户现在都存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号进行解析。这种功能是通过 /usr/lib/libnss_ldap.so 库提供的。 身份验证服务是实际向 LDAP 验证用户身份的服务。可插入身份验证模块(PAM)提供了本地 Linux 身份验证服务。下面我们将配置 PAM 先对本地的 /etc/passwd 文件检查用户帐号,然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来将身份验证重定向到 LDAP 目录上。/lib/security/pam_ldap.so PAM 模块提供了 LDAP 身份验证功能。 身份验证本身是由 PAM 程序执行的,它从身份验证候选机制中获取用户名,将其绑定到 OpenLDAP 服务器上,检索与这个 uid 条目(用户名条目)相关的 DN;从身份验证候选机制中获取密码,然后使用这个 DN 和密码试图将其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说这个用户已经成功通过了 pam_ldap.so 提供的身份验证测试。根据 PAM 的配置不同,在用户看到命令行提示符之前可能会执行其他测试。
自动方式安装
使用nslcd的自动安装(推荐)
yum -y install openldap-clients nss-pam-ldapd
authconfig 默认是用sssd来进行安全方面的校验的,但是su 登录会提示密码不正确,可能要开启tls配置ca,还没完成,所以先用这个配置把sssd禁用掉,采用传统的nslcd方式进行安全方面的校验,这样就没问题了
authconfig --enableforcelegacy --update
注意修改dn和host
authconfig --enableldap \
--enableldapauth \
--ldapserver=192.168.37.139 \
--ldapbasedn="dc=my-domain,dc=com" \
--enablemkhomedir \
--disableldaptls \
--update
使用sssd的自动安装(理论上这种方式应该更合理,但是配置好之后su 登录会提示密码不正确,可能要开启tls配置ca,还没完成,如果不需要登录用户,也可以使用这种方式)
yum -y install openldap-clients nss-pam-ldapd
注意修改dn和host
authconfig --enableldap \
--enableldapauth \
--ldapserver=192.168.37.139 \
--ldapbasedn="dc=my-domain,dc=com" \
--enablemkhomedir \
--disableldaptls \
--update
PS:这个会默认开启cache,导致在ldap中修改信息不会马上更新,要使用sss_cache -G(清空用户组缓存)sss_cache -U(清空用户缓存)之后才有效。 要配置缓存的时间,方法如下
[domain/default]
entry_cache_timeout = 1
**cache_credentials = True**
ldap_search_base = dc=my-domain,dc=com
ldap_tls_reqcert = never
krb5_realm = EXAMPLE.COM
krb5_server = kerberos.example.com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://192.168.37.139/
ldap_tls_cacertdir = /etc/openldap/cacerts
ldap_id_use_start_tls = False
debug_level = 7
[sssd]
services = nss, pam
config_file_version = 2
domains = default
debug_level = 5
[nss]
enum_cache_timeout = 1
**memcache_timeout = 1**
[pam]
debug_level = 7
[sudo]
[autofs]
加粗的这两行一定要配置,可以配置时间
采用手动方式配置(可以成功,但是和自动方式安装使用nslcd的自动安装(推荐)效果完全一致,仅在上述无法成功,做补充安装校验使用)
yum -y install openldap-clients nss-pam-ldapd
/etc/sysconfig/authconfig文件配置
启用ldad认证
vi /etc/sysconfig/authconfig
确保以下条目是yes
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes
/etc/openldap/ldap.conf文件配置
vi /etc/openldap/ldap.conf
指向ldap server,以及相应的dn 这里需要先安装openldap-clients客户端
yum openldap-clients #也可以采用跟server一样的编译安装
HOST 192.168.37.139
BASE dc=whl,dc=com
URI ldap://192.168.37.139:389/
SSL off
/etc/nsswitch.conf文件配置
vi /etc/nsswitch.conf
要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap” 添加到 /etc/nsswitch.conf 文件的 passwd、shadow 和 group 行中,如下所示:
passwd: files ldap
shadow: files ldap
group: files ldap
/etc/pam.d/system-auth文件配置
vi /etc/pam.d/system-auth
session optional pam_oddjob_mkhomedir.so
在相应位置插入对应的ldap配置项,文件内容可能有出入
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so
注意!
这种方式配置的登录,修改ldap用户密码方式为
ldappasswd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=my-domain,dc=com" -W -S "uid=tools,ou=People,dc=my-domain,dc=com"
如果在客户端工具中配置userPassword,特别要注意配置加密方式为SSHA
缓存服务(不完整,先不开启)
开启名称缓存服务,注意!!!缓存服务可以缓存LDAP用户和组信息,不用每次都去LDAP server上去获取,开启方式如下,但是还没研究缓存周期的配置项,暂时先不开启吧。
service nscd restart
手动清空缓存
sudo nscd -i passwd #清空用户缓存
sudo nscd -i group #清空组缓存
验证client配置是否成功
首先验证没有test用户
[root@tnn1 migrationtools]# id test
id: test: No such user
然后添加test用户和组
vi test.ldif
dn: cn=test,ou=Group,dc=whl,dc=com
objectClass: posixGroup
objectClass: top
cn: test
userPassword: {crypt}x
gidNumber: 500
dn: uid=test,ou=People,dc=whl,dc=com
uid: test
cn: test
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/test
gecos: ldapuser
导入
ldapadd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=whl,dc=com" -W -f test.ldif
注意修改相应的ldap地址和dc
再次查看用户
[root@tnn1 migrationtools]# id test
uid=501(test) gid=500(test) groups=500(test)
关于修改密码
本文共有三种安装方式 | 方式 | 是否查询到用户和组 | 是否能通过密码登录用户 | 是否能修改用户密码 | | --- | --- | --- | --- | | authconfig sssd | 是 | 否 | 否 | | authconfig nslcd | 是 | 是 | 是 | | 手动方式 nslcd | 是 | 是(仅当userPassword加密格式为Plaintext、SSHA) | 是(仅当userPassword加密格式为Plaintext、SSHA) |
特别说明: sssd这种方式应该是官方推荐的方式,但是密码这块还没搞定,应该是要开启ssl或者其他一些配置,所以这里密码相关的都暂时还不行。 采用authconfig方式配置的nslcd支持的最全面,不管是密码登录还是修改密码,不管是密码加密格式是哪一种,可能是比手动配置多配置了几个项目,还没对比,理论上应该是一样的,但是测试出来手动配置的支持的加密方式比较少 关于手动方式配置的nslcd支持的两种加密格式说明,SSHA是使用ldappasswd -H ldap://192.168.37.139 -x -D "cn=Manager,dc=my-domain,dc=com" -W -S "uid=tools,ou=People,dc=my-domain,dc=com"这种方式设置的密码,默认加密格式为SSHA的。而手动方式 nslcd配置的client使用passwd命令进行密码修改后,加密格式会变成为Plaintext(也就是没有加密),这两种方式的密码都能被手动方式配置nslcd识别并使用。 另外使用authconfig配置sssd采用passwd修改密码之后,加密格式为CRYPT-MD5这种格式,它自己可以使用,但是手动方式配置的nslcd却使用不来了。
如果需要在linux机器上可以修改ldap用户密码 需要修改slapd.com
vi /usr/local/etc/openldap/slapd.conf
修改以下access
#表示能所有entry都能被访问
access to *
by * read
#表示密码字段只能自己修改,登录的用户能访问,匿名用户只能认证
access to attrs=userPassword
by self write
by users read
by anonymous auth
客户端工具使用
使用Apache Directory Studio来简化操作LDAP
Apache Directory Studio安装
http://directory.apache.org/studio/ 下载最新版安装
Apache Directory Studio使用
- 打开 File -> New
- 选择LDAP Connection
- 输入LDAP Server相应的ip和端口
- 选择认证方式,用户名和密码,这里的用户名其实是之前配置的时候的管理员的DN,密码也是配置的
- 可以看到之前导入的Gourp和People,以及属性
- 按照现有的格式新建一个用户 在People上右键,新增 next 选择以下四个ObjectClass 输入属性值,其中前面几个是必选项,后面几个是可选项,这里先跟前面导入的账号格式保持一致 输入一些必输项的值
https://www.openldap.org/doc/admin24/quickstart.html