加载中…
个人资料
郭金鹏
郭金鹏
  • 博客等级:
  • 博客积分:0
  • 博客访问:826,977
  • 关注人气:40
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
谁看过这篇博文
加载中…
正文 字体大小:

配置OpenLDAP使用Kerberos验证

(2010-02-05 15:49:47)
标签:

杂谈

      前言

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

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

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

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

      环境准备
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
如果依赖于别的包,也一并安装


      配置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-sha1 des-cbc-crc des-cbc-md5
default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc des-cbc-md5
permitted_enctypes = des3-hmac-sha1 des-cbc-crc des-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:normal des-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/下面。

启动krb5kdc和kadmin两个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)知道所有principal的secret key,但每个principal对应的对象只知道自己的那个secret key。这也是“共享密钥“的由来。
作为例子,下面我们将会创建3个principal,类型分别是service,host,user。

4.5.1        创建principal for user
> Kadmin.local –q “addprinc [email]ldapadmin@EXAMPLE.COM[/email]”
系统会提示输入密码(password)。请注意密码本身并不是key。这里只是为了人类使用的方便而使用密码。真正的key是算法作用在密码上产生的一串byte序列。
4.5.2        创建principal for ldap service
> kadmin.local -q "addprinc -randkey ldap/ldap.example.com@EXAMPLE.COM"
注意这次系统不会提示输入密码,因为我们使用了 –randkey 指定了一个随机密码。因为ldap server是程序,它不会介意使用真正的key。
4.5.3        创建principal for host
> kadmin.local –q “addprinc –randkey host/client.example.com@EXAMPLE.COM”
同样,我们为一个主机生成了一个principal。基于同样的理由,我们使用了 –randkey参数。[/float]

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

4.6.1        取得ldap service的key
> kadmin.local –q “ktadd –k /tmp/ldapsrv.keytab ldap/ldap.example.com”
-k 指定把key存放在一个本地文件中

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

4.6.3        如果你高兴的话,你甚至也可以取得user的key
> 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
这里演示了你确实可以直接使用user的key,而不是口令来通过kerberos的验证。如果你在前面导出了user ldapadmin的key,可以验证一下。同时如果你运行kinit ldapadmin,那么即使输入了正确的password,系统仍然提示密码错误。

      配置Ldap使用kerberos
Ldap是如何使用kerberos的呢?这个过程是这样的。Ldap使用SASL的GSSAPI做身份验证。而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 cache FILE:/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)
        additional info: SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.  Minor code may provide more information (No credentials cache found)

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

> klist
查看ticket,注意下面两行
    Default principal: [email]ldapadmin@EXAMPLE.COM[/email]
    Valid starting     Expires            Service principal
    01/03/08 13: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 service的ticket。
    valid starting     Expires            Service principal
    01/03/08 13:59:39  01/04/08 13:59:39  krbtgt/EXAMPLE.COM@EXAMPLE.COM
    01/03/08 14: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.conf和keytab文件拷贝到本地。
> scp krb5.example.com:/etc/krb5.conf /etc
> scp krb5.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


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

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

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

在命令行运行ldap server
> slapd –d9
-d9指定调试级别

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

      Trouble shooting

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

2.        Cannot contact any KDC 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 found in Kerberos database while getting initial credentials
在运行kinit –k principal –t keytab后,得到上面的错误
检查你的principal名字是否写对。我有几次遇到这样的错误都是打字错误引起的。

0

阅读 收藏 转载 喜欢 打印举报
已投稿到:
  

新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有