kerberos+ldap

基于Kerberos +LDAP的集中用户认证及授权系统搭建实验

[root@localhost openldap]# kinit ldapadmin
kinit: Cannot resolve network address for KDC in realm "EXAMPLE.COM" while getting initial credentials

问题解决:可能的方法:编辑我的/etc/hosts文件并将以下内容添加到其中:10.0.0.1 example.com(krb5.conf里面的realm设置的域名)

 

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

 

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 等命令来修改而不是直接编辑。下面所有用户的添加,配置的修改都是生成.ldif后缀的文件然后使用ldapdelete, ldapmodify等命令是其生效

 

默认配置文件保存在 /etc/openldap/slapd.d,将其备份:

cp -rf /etc/openldap/slapd.d /etc/openldap/slapd.d.bak

 

添加一些基本配置,并引入 kerberos 和 openldap 的 schema:

(ldap的schema定义了ldap目录所应遵循的结构和规则,schema给ldap服务器提供了ldap目录中的类别,属性等识别的方式,让这些可以被ldap服务器识别)

cp  /usr/share/doc/krb5-server-ldap-1.9/kerberos.schema  /etc/openldap/schema/

touch /etc/openldap/slapd.conf

vim /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,否则有可能会报错

启动slapd  service slapd start

删除该目录中的所有文件,否则无法启动LDAP服务

rm -f  /etc/openldap/slapd.d/cn=config/cn=schema/*

 或者去目录下面删除所有的重复项

3、启动服务

启动 LDAP 服务:

chkconfig --level 345 slapd on

 service slapd start

启动失败,重新更新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

再启动service slapd start

 

查看状态,验证服务端口:

ps aux | grep slapd | grep -v grep

netstat -tunlp  | grep :389

 

4、LDAP集成Kerberos

先装上kerberos服务之后再进行集成

1安装并开启ntp服务

yum intall -y ntp

 service ntpd start

安装完成后,

2安装kerberos服务器

yum install -y krb5-server krb5-libs krb5-workstation krb5- krb5-auth-dialog

查看安装版本:

rpm -qa krb5-server-ldap

修改kerberos配置文件

vim /etc/krb5.conf

[logging]

 default = FILE:/var/log/krb5libs.log

 kdc = FILE:/var/log/krb5kdc.log

 admin_server = FILE:/var/log/kadmind.log

[libdefaults]

 default_realm = EXAMPLE.COM

 dns_lookup_realm = false

 dns_lookup_kdc = false

 ticket_lifetime = 24h

 renew_lifetime = 7d

 forwardable = true

[realms]

 EXAMPLE.COM = {

  kdc = 192.168.10.130:88 (Kerberos服务器ip)

  admin_server = 192.168.10.130:749

  default_domain = EXAMPLE.COM

 }

[domain_realm]

 .example.com = EXAMPLE.COM

 example.com = EXAMPLE.COM

其中,EXAMPLE.COM可任取,但需要前后统一。

vim /var/kerberos/krb5kdc/kdc.conf   ,不用改

创建/初始化kerberos database

(设置数据库管理密码是12345678  EXAMPLE.COM是数据库名[-r 指定 的realm name ])

/usr/sbin/kdb5_util create -s -r EXAMPLE.COM  (-s表示生成stash file 并再其中存储master server key[ krb5kdc] -r 制定一个 realm name ,当krb5。conf中定义了多个realm时才是必要的)

vim /var/kerberos/krb5kdc/kadm5.acl

 

启动kerberos服务

   service krb5kdc start

service kadmin start

 

当数据库创建好了 ,/var/Kerberos/krb5kdc/目录下生成

Kadm5.acl

kdc.conf

principal

principal.adm5

principal.kadmin5.lock

principal.ok

 

为了使Kerberos能够绑定到OpenLDAP服务器,需要创建一个管理员用户和一个principal,并生成keytab文件

设置该文件的权限为LDAP服务运行用户可读(一般为ldap):

 添加数据库管理员:

新建一管理用户 ldapadmin 密码是12345678

kadmin.local -q "addprinc ldapadmin@EXAMPLE.COM"  (生成指定key的principal

新建另一个用户 ldap/c2bde55 (-randkey 是生成随机key的principal)

kadmin.local -q "addprinc -randkey ldap/c2bde55@EXAMPLE.COM"

  

拓展:

查看principal: listprincs

修改用户密码:change_password -pw xxx 用户

删除principal :delete_principal 用户

 

形成ldap.keytab文件

kadmin.local -q "ktadd -k /etc/openldap/ldap.keytab ldap/c2bde55@EXAMPLE.COM"2

 chown ldap:ldap /etc/openldap/ldap.keytab && chmod 640 /etc/openldap/ldap.keytab

 

使用ldapadmin用户测试:

kinit ldapadmin

  

重启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}bdb.ldif 可以看到一些默认的配置,例如:

olcSuffix: dc=my-domain,dc=com

olcRootDN: cn=Manager,dc=my-domain,dc=com

 

建立modify.ldif文件,内容如下:

vim /etc/openldap/slapd.d/modify.ldif

dn: olcDatabase={2}bdb,cn=config

changetype: modify

replace: olcSuffix

olcSuffix: dc=example,dc=com

dn: olcDatabase={2}bdb,cn=config

changetype: modify

replace: olcRootDN

# Temporary lines to allow initial setup

olcRootDN: uid=ldapadmin,ou=people,dc=example,dc=com

dn: olcDatabase={2}bdb,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}bdb,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即可

 

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";

 

生成模板文件:导入的系统用户信息,变成ldif格式

/usr/share/migrationtools/migrate_base.pl > /opt/base.ldif

 

然后,可以修改该文件,然后执行导入命令:

 ldapadd -x -D "uid=ldapadmin,ou=people,dc=example,dc=com" -w 123456 -f /opt/base.ldif

 

将test用户导入到 ldap 中,可以有选择的导入指定的用户:

# 先添加用户

useradd test

# 查找系统上的 test用户,将test的用户信息导入passwd.txt

grep -E "test" /etc/passwd >/opt/passwd.txt

使用工具将passwd.txt 变成 ldif格式的文件

/usr/share/migrationtools/migrate_passwd.pl /opt/passwd.txt /opt/passwd.ldif

最后再将passwd.ldif 中的信息导入到 /etc/openslapd/slapd.d中

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' -w 12345678  " uid=test,ou=people,dc=example,dc=com" -S

密码修改为 123456

 

删除(就不要删除了,否则还得新建)

删除用户

# 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、客户端配置 开启另外一台虚拟机 ip是192.168.10.131

安装openldap客户端:

yum install openldap-clients -y

修改 /etc/openldap/ldap.conf 以下两个配置:

BASE    dc=example,dc=com

URI     ldap://192.168.10.130(服务器IP)

vim /etc/krb5.conf

 

然后,运行下面命令测试:

先删除 ticket

运行kdestroy会报异常

 

运行ldapsearch -x -b 'dc=example,dc=com'

(注意此时应该到服务器端关闭防火墙,不然运行这个命令会报错)

 

# 重新获取 ticket

kinit ldapadmin  

 

没有报错

运行 ldapsearch -b 'dc=example,dc=com'  -x

 

# ldapwhoami -x

 

#直接输入 ldapsearch -x 不会报错

 

# 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末尾内容如下:

[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添加用户

vim user.ldif内容如下:

dn: cn=kerberos,dc=example,dc=com

cn: kerberos          #这是添加的一个kerberos用户

objectClass: organizationalRole

dn: cn=root,dc=example,dc=com

cn: root                  #这是添加一个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 123456

把密码修改出123456

 

3)生成访问ldap的服务密码文件

因为 Kerberos 需要有 ldap_kdc_dn 和 ldap_kadmind_dn 的密码才能访问 LDAP数据库,执行如个命令:12345678

# kdb5_ldap_util -D uid=ldapadmin,ou=people,dc=example,dc=com  -w 12345678 stashsrvpw -f /etc/krb5.ldap cn=root,dc=example,dc=com

 

这里输入的是12345678

# cat /etc/krb5.ldap

 

4)创建kerberos数据库   密码:12345678  123456   123456

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

 

密码是123456

然后

# slapcat |grep “test”

 

使用Kerberos+LDAP进行认证整合,LDAP进行账号管理,Kerberos进行认证。

1)采用该 LDAP作为用户认证。

只需要对用户 (如uid=test,ou=People,dc=example,dc=com)添加 userPassword成员即可。如果通过 命令行添加,需要先准备如下文件(userPassword对应的密码为123456):

vim  test.ldif

dn: uid=test,ou=People,dc=example,dc=com

changetype: modify

add: userPassword

userPassword:: e1NTSEF9Ym0rZXloV1ExalB1aWNEVU1BaHlNM0hZVHh3REIrWU4K

然后执行命令

# ldapmodify -x -D 'cn=root,dc=example,dc=com' -w 123456 -h 127.0.0.1 -f test.ldif

 

 命令执行成功后,通过

# ldapsearch -x -D 'uid=test,ou=People,dc=example,dc=com' -w 123456 127.0.0.1 -b 'ou=People,dc=example,dc=com'

确认。

 

2)使用 Kerberos 认证。

需要将用户的密码域做如下修改(userPassword 对应的密码由echo -n "{SASL}test@EXAMPLE.COM" | base64生成):

dn: uid=test,ou=People,dc=example,dc=com

changetype: modify

replace: userPassword

userPassword:: e1NBU0x9dGVzdEBFWEFNUExFLkNPTQ==

执行ldapmodify -x -D 'cn=root,dc=example,dc=com' -w 123456 -h 127.0.0.1 -f test.ldif应用该修改。

 

3)修改配置

# vim /etc/sysconfig/saslauthd

修改值

MECH=kerberos5

重启:service saslauthd restart

 

创建vim /etc/sasl2/slapd.conf文件

内容:pwcheck_method: saslauthd

重启:service slapd restart

4)执行命令:service saslauthd status -l查看是否报错

 不报错

 执行如下操作:

# kadmin.local -q "ank -clearpolicy -randkey host/c2bde55"

# kadmin.local -q "ktadd host/c2bde55"

 

# service saslauthd restart

# ps -aux | grep saslauthd

 

# kadmin.local -q 'ank -pw 123456 test'

配置 test 用户的密码为:123456

# testsaslauthd -u test -p 123456

 

报错执行以下命令

 kadmin.local -q "ank -clearpolicy -randkey host/localhost"

kadmin.local -q "ktadd host/localhost"

  

配置 test 用户的密码为:123456 成功

 

至此, Kerberos 认证测试成功。

执行 ldapsearch测试LDAP 认证是否成功

ldapsearch -x -D 'uid=test,ou=People,dc=example,dc=com' -w 123456 -h 127.0.0.1 -b 'ou=People,dc=example,dc=com'

 结果成功

如果不成功执行:

kadmin.local -q "ank -clearpolicy -randkey host/localhost"

kadmin.local -q "ktadd host/localhost"

客户端验证:将服务器端的防火墙关闭

ldapsearch -x -D 'uid=test,ou=People,dc=example,dc=com' -w 123456 -h 192.168.10.130(服务器ip地址) -b 'ou=People,dc=example,dc=com'

 

 

原文地址:https://www.cnblogs.com/wsnan/p/11074636.html