欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

配置Kerberos+LDAP整合教程,创建LDAP数据库

程序员文章站 2022-04-21 20:44:57
1、安装ldap yum install db4 db4-utils db4-devel cyrus-sasl* krb5-server-ldap -y yum install openl...

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"