kerberos整合ldap进行服务器认证

1        前言
假设你的Openldap已经配置好并成功运行,本文只是介绍如何使Openldap使用Kerberos来验证用户身份。
本配置在FC5上通过,在使用rhe时,很可能会有不同的情况。

2       
名词解释
2.1        Kerberos

基于共享密钥的安全机制,由MIT发明,现在已经被标准化,最新是版本5,简称krb5Kerberos特别适合局域网络,Windows2k及以上系统的安全机制即基于kerberosKerberos有多个实现版本,本文使用的一个它的实现叫做mit¬-kerberos

2.2        SASL

简单认证和安全层(Simple Authentication and Security Layer)。也是一套RFC定义的标准。它的核心思想是把用户认证和安全传输从应用程序中隔离出来。像SMTP协议在定义之初都没有考虑到用户认证等问题,现在SMTP可以配置使用SASL来完成这方面的工作。Openldap同样如此。
SASL
支持多种认证方法,比如
•        ANONYMOUS:
无需认证。
•        PLAIN
:明文密码方式(cleartext password)
•        DIGEST-MD5: HTTPDigest
兼容的安全机制,基于MD5,可以提供数据的安全传输层。这个是方便性和安全性结合得最好的一种方式。也是默认的方式。
•        GSSAPI
Generic Security Services Application Program Interface
Gssapi
本身是一套API,由IETF标准化。其最主要也是著名的实现是基于Kerberos的。所以一般说到gssapi都暗指kerberos实现。
•        EXTERNAL
:认证已经在环境中实现了,比如SSL/TLS, IPSec.

2.3        Cyrus SASL

Cyrus-SASLSASL协议最常用的一个实现。其他实现还有GNU SASL等。

3       
环境准备
3.1       
环境
ldap.example.com(10.10.11.11)

krb5.example.com(10.10.11.12)
client.example.com(10.10.11.13)

3.2        安装软件包
Kerberos server: Krb5-server

Sasl-gssapi: Cyrus-sasl-gssapi
Kerberos client: Krb5-client
如果依赖于别的包,也一并安装


4       
配置Kerberos server

配置文件包括下面3个文件
1.        /etc/krb5.conf

2.        /var/kerberos/krb5kdc/kdc.conf
3.       /var/kerberos/krb5kdc/kadm5.acl

4.1        配置/etc/krb5.conf
这个配置文件设置整个kerberos环境的,所以不但server,而且client也会使用它。
[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

default_tgs_enctypes = des3-hmac-sha1des-cbc-crc des-cbc-md5
default_tkt_enctypes = des3-hmac-sha1des-cbc-crc des-cbc-md5
permitted_enctypes = des3-hmac-sha1 des-cbc-crcdes-cbc-md5
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes


[realms]
EXAMPLE.COM = {
  kdc = krb5.example.com:88
  admin_server = krb5.example.com:749
  default_domain = example.com
}

[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
}

4.2        配置/var/kerberos/krb5kdc/kdc.conf
这个配置文件是专门为kdc定义的参数
[kdcdefaults]

v4_mode = nopreauth
[realms]
EXAMPLE.COM = {
  #master_key_type = des3-hmac-sha1
  acl_file =/var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab =/var/kerberos/krb5kdc/kadm5.keytab

  supported_enctypes =des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normaldes-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3

}

4.3       
配置/var/kerberos/krb5kdc/kadm5.acl
此文件是Access control配置。下面是一个最简单但系统可以工作的配置。根据实际情况设置你自己的访问控制
*/admin@EXAMPLE.COM    *


4.4        创建realm
> kdb5_util create -r EXAMPLE.COM –s

kerbers数据库文件都放在/var/kerberos/krb5kdc/下面。

启动krb5kdckadmin两个service
> service krb5kdc start

> service kadmin start

4.5        创建Principal
Kerberos安全机制里,一个principal就是realm里的一个对象,一个principal总是和一个密钥(secret key)成对出现的。
这个principal的对应物可以是service,可以是host,也可以是user,对于Kerberos来说,都没有区别。
Kdc(Key distribute center)
知道所有principalsecret key,但每个principal对应的对象只知道自己的那个secret key。这也是共享密钥的由来。
作为例子,下面我们将会创建3principal,类型分别是servicehostuser

4.5.1       
创建principal for user
> Kadmin.local –q “addprinc 
ldapadmin@EXAMPLE.COM
系统会提示输入密码(password)。请注意密码本身并不是key。这里只是为了人类使用的方便而使用密码。真正的key是算法作用在密码上产生的一串byte序列。
4.5.2       
创建principal for ldap service
> kadmin.local -q "addprinc -randkeyldap/ldap.example.com@EXAMPLE.COM"

注意这次系统不会提示输入密码,因为我们使用了 –randkey 指定了一个随机密码。因为ldap server是程序,它不会介意使用真正的key
4.5.3       
创建principal for host
> kadmin.local –q “addprinc –randkeyhost/client.example.com@EXAMPLE.COM”

同样,我们为一个主机生成了一个principal。基于同样的理由,我们使用了 –randkey参数。

4.6       
获得key
创建了principal之后,我们需要把keykdc里取出来(kdc知道所有principalkey),交给对应的对象。在kerberos世界里,这个key一般存放在以keytab作为扩展名的文件里。

4.6.1        取得ldap servicekey
> kadmin.local –q “ktadd –k/tmp/ldapsrv.keytab ldap/ldap.example.com”

-k 指定把key存放在一个本地文件中

4.6.2       
取得hostkey
> kadmin.local –q “ktadd –k/tmp/host_client.keytab  host/client.example.com”


4.6.3        如果你高兴的话,你甚至也可以取得userkey
> kadmin.local –q “ktadd –k/tmp/user_ldapadmin.keytab ldapadmin”

但是我不建议你这样做,因为一旦这样做以后,你先前设置的密码就失效了。以后只能使用此keytab文件来通过身份验证。

4.7       
测试
那么下面的步骤演示了kerberos验证用户身份。
> kinit ldapadmin

系统会提示输入密码,如果一切正常,那么会安静的返回。实际上,你已经通过了kerberos的身份验证,且获得了一个Service TGT(Ticket-Granting Ticket). Service TGT的意义是,在一段时间内,你都可以用此TGT去请求某些service,比如ldap service,而不需要再次通过kerberos的认证。

> klist

这条命令会查看系统当前的ticket

> kdestory

这条命令会destroy掉系统当前cache的所有ticket

> kinit –k ldapadmin –t/tmp/user_ldapadmin.keytab

这里演示了你确实可以直接使用userkey,而不是口令来通过kerberos的验证。如果你在前面导出了user ldapadminkey,可以验证一下。同时如果你运行kinit ldapadmin,那么即使输入了正确的password,系统仍然提示密码错误。

5       
配置Ldap使用kerberos
Ldap
是如何使用kerberos的呢?这个过程是这样的。Ldap使用SASLGSSAPI做身份验证。而SASL-GSSAPI的实现正好是Kerberos

首先要配置ldap server,然后配置Kerberos

5.1       
配置ldap server
> vi /etc/openldap/slapd.conf

添加一行
rootdn         "uid=ldapadmin,cn=gssapi,cn=auth"

注释掉下面两行,如果有的话
#rootdn       "cn=Manager,dc=example,dc=com"

#rootpw      {SSHA}7XF8TnEH8Hlv+0XU2Tiqk9bTR32Ixtbx

5.2       
配置kerberos环境
> scp krb5.example.com:/etc/krb5.conf /etc#
这里使用scp,你也可以通过其他方便的方式。
> scp krb5.example.com:/tmp/ldapsrv.keytab/tmp 

> ktutil
> rkt /tmp/ldapsrv.keytab #读取key到内存中
> wkt /etc/krb5.keytab #
key到系统的默认keytab文件,一般是   /etc/krb5.keytab

然后重启ldap server
> service ldap restart


5.3        测试
> klist

klist: No credentials cache found (ticket cacheFILE:/tmp/krb5cc_0)

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
> ldapsearch  -h ldap.example.com #注意不要用-x参数
SASL/GSSAPI authentication started

ldap_sasl_interactive_bind_s: Local error (-2)
        additionalinfo: SASL(-1): generic failure: GSSAPI Error: Unspecified GSSfailure.  Minor code may provide more information (No credentialscache found)

> kinit ldapadmin 
#用户ldapadmin通过kerberos的验证

> klist 

查看ticket,注意下面两行
    Default principal: 
ldapadmin@EXAMPLE.COM
    Valid starting    Expires           Service principal

    01/03/0813:59:39  01/04/08 13:59:39  krbtgt/EXAMPLE.COM@EXAMPLE.COM

> ldapsearch –h ldap.example.com
Something printed out. You got it!

>klist
注意,现在多了一条访问ldap serviceticket
    valid starting    Expires           Service principal

    01/03/0813:59:39  01/04/08 13:59:39  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    01/03/0814:02:12  01/04/08 13:59:39  ldap/flnxldap11.EXAMPLE.com@EXAMPLE.COM

5.4        配置ldap client
下面我们要配置主机client.example.com具有访问ldap server的能力。一般这种配置是为了使用ldap作为系统的身份认证机制,和PAM结合起来使用。这方面的配置我也不太了解,也没法深入介绍。我这里只是演示如何使用host principal

和上面一样,首先把krb5.confkeytab文件拷贝到本地。
> scp krb5.example.com:/etc/krb5.conf /etc

> scpkrb5.example.com:/tmp/host_client.keytab /tmp 

初始化host principal,取得tgt
> kinit –k host/client.example.com –t/tmp/host_client.keytab 

> klist

测试
> ldapsearch –h ldap.example.com 



6        调试
Kerbers
LDAP都是比较复杂的系统。一般出现问题后都要现把问题定位到ldapkerberos。下面是一些查看log信息的机制。

查看kdclog
> tail -100f /var/log/krb5kdc.log


查看某个principal是否有效
> kinit –k principalName –t keytabFilePath


在命令行运行ldap server
> slapd –d9

-d9指定调试级别

Ldap client端调试
> ldapsearch –d9 –h ldapServerAddress


7        Trouble shooting

1.        Clock skew toogreat while getting initial credentials
在运行kinit –k principal –t keytab后,得到上面的错误。
这是因为时间不同步引起的。Kerberos是时间敏感的。所以所有的主机和kerberos server时间一定要同步。

2.        Cannot contact anyKDC for requested realm....

在运行kinit –k principal –t keytab后,得到上面的错误
检查DNS/etc/hosts看是否能按照名字访问kdc server。如果能ping通,但还是出现这样的错误,试作把/etc/krb5.con里的
  kdc = krb5.example.com:88

  admin_server = krb5.example.com:749
主机名字改为ip地址

3.        Client not foundin Kerberos database while getting initial credentials

在运行kinit –k principal –t keytab后,得到上面的错误,检查你的principal名字是否写对。我有几次遇到这样的错误都是打字错误引起的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值