配置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-devel compat-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

$echo 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

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 slapdrestart

如果不生效,执行如下命令:

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:example com

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工具:

yuminstall 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 -w12345678 -D'uid=ldapadmin,ou=people,dc=example,dc=com' "uid=test,ou=people,dc=example,dc=com"

$ ldapdelete -x -w12345678 -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  -w12345678 stashsrvpw -f /etc/krb5.ldap cn=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"


下一章节:

Kerberos+LDAP认证整合http://blog.csdn.net/zhouyuanlinli/article/details/78403004


参考链接:

https://yq.aliyun.com/articles/25631

http://www.cnblogs.com/zhaojonjon/p/5967281.html


版权声明:本文为ZhouyuanLinli原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。