配置Kerberos+LDAP整合教程,创建LDAP数据库
1、安装ldap
yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y
yum install openldap openldap-clients openldap-servers openldap-develcompat-openldap-y
查看安装的版本:
$ rpm -qa openldap
openldap-2.4.40-13.el7.x86_64
$ rpm -qa krb5-server-ldap
krb5-server-ldap-1.14.1-26.el7.x86_64
2、配置ldap
更新配置库:
rm -rf /var/lib/ldap/*
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
在2.4以前的版本中,OpenLDAP 使用 slapd.conf 配置文件来进行服务器的配置,而2.4开始则使用slapd.d目录保存细分后的各种配置,这一点需要注意,其数据存储位置即目录/etc/openldap/slapd.d。尽管该系统的数据文件是透明格式的,还是建议使用 ldapadd, ldapdelete, ldapmodify 等命令来修改而不是直接编辑。
默认配置文件保存在 /etc/openldap/slapd.d,将其备份:
cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
添加一些基本配置,并引入 kerberos 和 openldap 的 schema:
$ cp /usr/share/doc/krb5-server-ldap-1.14.1/kerberos.schema /etc/openldap/schema/
$ touch /etc/openldap/slapd.conf
$ echoinclude /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
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/kerberos.schema"
> /etc/openldap/slapd.conf
$ echo-e"pidfile /var/run/openldap/slapd.pid\nargsfile /var/run/openldap/slapd.args">> /etc/openldap/slapd.conf
#更新slapd.d
$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
$ chown -R ldap:ldap /etc/openldap/slapd.d && chmod -R 700 /etc/openldap/slapd.d
注明:/etc/openldap/slapd.conf不要添加corba.schama,否则有可能会报错
3、启动服务
启动 LDAP 服务:
chkconfig --level 345 slapd on
service slapd start
查看状态,验证服务端口:
$ ps aux | grep slapd | grep -v grep
$ netstat -tunlp | grep :389
如果启动失败,则运行下面命令来启动 slapd 服务并查看日志:
$ slapd -h ldap://127.0.0.1 -d 481
待查明原因之后,停止该进程使用正常方式启动 slapd 服务。
4、LDAP集成Kerberos(不共用LDAP数据库的集成方式)
为了使Kerberos能够绑定到OpenLDAP服务器,需要创建一个管理员用户和一个principal,并生成keytab文件
设置该文件的权限为LDAP服务运行用户可读(一般为ldap):
kadmin.local -q "addprinc ldapadmin@EXAMPLE.COM"
kadmin.local -q "addprinc -randkey ldap/c2bde55@EXAMPLE.COM"
kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/c2bde55@EXAMPLE.COM"
chown ldap:ldap /etc/openldap/ldap.keytab && chmod 640 /etc/openldap/ldap.keytab
使用ldapadmin用户测试:
kinit ldapadmin
确保LDAP启动时使用上一步中创建的keytab文件,在/etc/sysconfig/slapd取消KRB5_KTNAME前注释
重启slapd服务
service slapd restart
如果不生效,执行如下命令:
cp /etc/openldap/ldap.keytab /etc/krb5.keytab
chgrp ldap /etc/krb5.keytab && chmod 640 /etc/krb5.keytab
5、创建LDAP的数据库
进入到 /etc/openldap/slapd.d目录,查看
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif可以看到一些默认的配置,例如:
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
建立modify.ldif文件,内容如下:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
# Temporary lines to allow initial setup
olcRootDN: uid=ldapadmin,ou=people,dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: 12345678
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]*),cn=GSSAPI,cn=auth uid=$1,ou=people,dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
# Everyone can read everything
olcAccess: {0}to dn.base="" by * read
# The ldapadm dn has full write access
olcAccess: {1}to * by dn="uid=ldapadmin,ou=people,dc=example,dc=com"by dn="cn=root,dc=example,dc=com" write by * read
使用下面命令导入更新配置:
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f modify.ldif
注明:cn=root,dc=example,dc=com授权,以便整合Kerberos使用
更新配置过程中出现错误:additional info: modify/add: olcRootPW: no equality matching rule,修改modify.ldif中对应选项的add为replace即可
这时候数据库没有数据,需要添加数据,你可以手动编写 ldif 文件来导入一些用户和组,或者使用 migrationtools 工具来生成 ldif 模板。创建 setup.ldif 文件如下:
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: examplecom
dc: example
dn: ou=people,dc=example,dc=com
objectclass: organizationalUnit
ou: people
description: Users
dn: ou=group,dc=example,dc=com
objectClass: organizationalUnit
ou: group
dn: uid=ldapadmin,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: LDAP admin account
uid: ldapadmin
sn: ldapadmin
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/ldap
loginShell: /bin/bash
使用下面命令导入数据,密码是前面设置的12345678
$ ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f setup.ldif
6、导入linux系统用户
接下来你可以从 /etc/passwd, /etc/shadow, /etc/groups 中生成 ldif 更新 ldap 数据库,这需要用到 migrationtools 工具。
安装migrationtools工具:
yum install migrationtools -y
利用迁移工具生成模板,先修改默认的配置:
$ vim /usr/share/migrationtools/migrate_common.ph
#71行默认的dns域名
DEFAULT_MAIL_DOMAIN = "example.com";
#74行默认的base
DEFAULT_BASE = "dc=example,dc=com";
生成模板文件:
/usr/share/migrationtools/migrate_base.pl > /opt/base.ldif
然后,可以修改该文件,然后执行导入命令:
$ ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /opt/base.ldif
将当前节点上的用户导入到 ldap 中,可以有选择的导入指定的用户:
# 先添加用户
useradd test
# 查找系统上的 test用户
grep -E "test" /etc/passwd >/opt/passwd.txt
/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /opt/passwd.ldif
将用户组导入到 ldap 中:
# 生成用户组的ldif文件,然后导入到
grep -E "test" /etc/group >/opt/group.txt
/usr/share/migrationtools/migrate_group.pl /opt/group.txt /opt/group.ldif
ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 -f /opt/group.ldif
7、LDAP增删改成
查询
查询新添加的 test 用户:
$ ldapsearch -LLL -x -D 'uid=ldapadmin,ou=people,dc=example,dc=com' -w 12345678 -b 'dc=example,dc=com' 'uid=test'
修改
用户添加好以后,需要给其设定初始密码,运行命令如下:
$ ldappasswd -x -D 'uid=ldapadmin,ou=people,dc=example,dc=com' -w12345678"uid=test,ou=people,dc=example,dc=com" -S
删除
删除用户或组条目:
$ ldapdelete -x -w 12345678-D'uid=ldapadmin,ou=people,dc=example,dc=com' "uid=test,ou=people,dc=example,dc=com"
$ ldapdelete -x -w 12345678-D'uid=ldapadmin,ou=people,dc=example,dc=com' "cn=test,ou=group,dc=example,dc=com"
8、客户端配置
在其他子节点上安装openldap客户端:
yum install openldap-clients -y
修改 /etc/openldap/ldap.conf 以下两个配置:
BASE dc=example,dc=com
URI ldap://c2bde55
然后,运行下面命令测试:
#先删除 ticket
$ kdestroy
# 会报异常
$ ldapsearch -b 'dc=example,dc=com'
# 重新获取 ticket
kinit ldapadmin
# 没有报错
$ ldapsearch -b 'dc=example,dc=com'
$ ldapwhoami
# 直接输入 ldapsearch 不会报错
$ ldapsearch
(注明:如果报ldap_sasl_interactive_bind_s错误,且发现/etc/krb5.keytab不存在, 执行如下操作:
cp /etc/openldap/ldap.keytab /etc/krb5.keytab
chgrp ldap /etc/krb5.keytab && chmod 640 /etc/krb5.keytab
要以root用户身份运行 slapd)
如果报错:SASL(-4): no mechanism available: No worthy mechs found
ldapsearch 加一个 -x 参数,略过sasl认证
9、Kerberos整合(共用LDAP数据库的集成方式)
1)配置
Kerberos 相关的数据也需要存储在某个数据库中,在这里我们选择使用 LDAP 作为其数据库,目的是为了数据备份的方便(只需要统一备份 LDAP 数据库即可)。如果需要使用其自身的数据库,则需要将下面的 kdb5_ldap_util 命令替换为 kdb5_util。
vim /etc/krb5.conf
末尾内容如下:
[libdefaults]
renew_lifetime = 7d
forwardable = true
default_realm = EXAMPLE.COM
ticket_lifetime = 24h
dns_lookup_realm = false
dns_lookup_kdc = false
default_ccache_name = /tmp/krb5cc_%{uid}
#default_tgs_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
#default_tkt_enctypes = aes des3-cbc-sha1 rc4 des-cbc-md5
[logging]
default = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
kdc = FILE:/var/log/krb5kdc.log
[realms]
EXAMPLE.COM = {
admin_server = c2bde55
kdc = c2bde55
max_renewable_life = 30m
database_module = openldap_ldapconf
}
[domain_realm]
.example.com = EXAMPLE.COM
[dbdefaults]
ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com
[dbmodules]
openldap_ldapconf = {
db_library = kldap
ldap_servers = ldapi://
ldap_kerberos_container_dn = cn=kerberos,dc=example,dc=com
ldap_kdc_dn = cn=root,dc=example,dc=com
ldap_kadmind_dn = cn=root,dc=example,dc=com
ldap_service_password_file = /etc/krb5.ldap
ldap_conns_per_server = 5
}
其中 ldap_kdc_dn 和 ldap_kadmind_dn 分别对应 Kerberos 访问 LDAP 数据库时的服务和管理帐号。前者需要有读权限,后者需要读写权限。此处为了简单方便统一用cn=root,dc=example,dc=com一个进行管理
说明: ldap_kerberos_container_dn must start with a 'cn'
2)ldap添加用户
user.ldif内容如下:
dn: cn=kerberos,dc=example,dc=com
cn: kerberos
objectClass: organizationalRole
dn: cn=root,dc=example,dc=com
cn: root
userPassword:: e1NTSEF9UTg2T1hqeXcreCtzck5yL1JEUzhLbTBGQ2tZeFBzWnI=
objectClass: simpleSecurityObject
objectClass: organizationalRole
执行命令:ldapadd-x -D"uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678-f user.ldif
管理员修改普通用户的密码:
ldappasswd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 12345678 "cn=root,dc=example,dc=com" -s New_PASS
3)生成访问ldap的服务密码文件
因为 Kerberos 需要有 ldap_kdc_dn 和 ldap_kadmind_dn 的密码才能访问 LDAP数据库,执行如个命令:
# kdb5_ldap_util -Duid=ldapadmin,ou=people,dc=example,dc=com -w 12345678stashsrvpw -f /etc/krb5.ldapcn=root,dc=example,dc=com
# cat /etc/krb5.ldap
4)创建kerberos数据库
kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com-H ldapi:// create -r EXAMPLE.COM -s
5)重启Kerberos
service krb5kdc restart
6)测试:添加用户
# kadmin.local
kadmin.local: addprinc test
然后
#slapcat |grep "test"