admin 管理员组

文章数量: 887021


2023年12月17日发(作者:visibility的动词)

1 前言

假设你的Openldap已经配置好并成功运行,本文只是介绍如何使Openldap使用Kerberos来验证用户身份。

本配置在FC5上通过,在使用rhe时,很可能会有不同的情况。

2 名词解释

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 环境准备

3.1 环境

(10.10.11.11)

(10.10.11.12)

(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/

2. /var/kerberos/krb5kdc/

3. /var/kerberos/krb5kdc/

4.1 配置/etc/

这个配置文件设置整个kerberos环境的,所以不但server,而且client也会使用它。

[logging]

default = FILE:/var/log/

kdc = FILE:/var/log/

admin_server = FILE:/var/log/

[libdefaults]

default_realm =

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]

= {

kdc = :88

admin_server = :749

default_domain =

}

[domain_realm]

. =

=

[kdc]

profile = /var/kerberos/krb5kdc/

[appdefaults]

pam = {

debug = false

ticket_lifetime = 36000

renew_lifetime = 36000

forwardable = true

krb4_convert = false

}

4.2 配置/var/kerberos/krb5kdc/

这个配置文件是专门为kdc定义的参数

[kdcdefaults]

v4_mode = nopreauth

[realms]

= {

#master_key_type = des3-hmac-sha1

acl_file = /var/kerberos/krb5kdc/

dict_file = /usr/share/dict/words

admin_keytab = /var/kerberos/krb5kdc/

supported_enctypes = des3-hmac-sha1:normal arcfour-hmac:normal

des-cbc-crc:v4 des-hmac-sha1:normal des-cbc-md5:normal

des-cbc-crc:afs3

}

des-cbc-crc:normal

4.3 配置/var/kerberos/krb5kdc/

此文件是Access control配置。下面是一个最简单但系统可以工作的配置。根据实际情况

设置你自己的访问控制

*/***************** *

4.4 创建realm

> kdb5_util create -r –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

> –q “addprinc *********************”

系统会提示输入密码(password)。请注意密码本身并不是key。这里只是为了人类使用的方便而使用密码。真正的key是算法作用在密码上产生的一串byte序列。

4.5.2 创建principal for ldap service

>-q"addprinc-randkeyldap/****************************"注意这次系统不会提示输入密码,因为我们使用了 –randkey 指定了一个随机密码。因为ldap server是程序,它不会介意使用真正的key。

4.5.3 创建principal for host

> –q“addprinc–randkeyhost/******************************”

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

4.6 获得key

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

4.6.1 取得ldap service的key

> –q “ktadd –k /tmp/ ldap/”

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

4.6.2 取得host的key

> –q “ktadd –k

/tmp/host_ host/”

4.6.3 如果你高兴的话,你甚至也可以取得user的key

> –q “ktadd –k /tmp/user_ 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_

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

5 配置Ldap使用kerberos

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

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

5.1 配置ldap server

> vi /etc/openldap/

添加一行

rootdn "uid=ldapadmin,cn=gssapi,cn=auth"

注释掉下面两行,如果有的话

#rootdn "cn=Manager,dc=example,dc=com"

#rootpw {SSHA}7XF8TnEH8Hlv+0XU2Tiqk9bTR32Ixtbx

5.2 配置kerberos环境

> scp :/etc/ /etc#这里使用scp,你也可以通过其他方便的方式。

> scp :/tmp/ /tmp

> ktutil

> rkt /tmp/ #读取key到内存中

> wkt /etc/ #写key到系统的默认keytab文件,一般是 /etc/

然后重启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 #注意不要用-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,注意下面两行

Defaultprincipal:********************* Valid starting Expires Service principal

01/03/08 13:59:39 01/04/08 13:59:39 krbtgt/***********************

> ldapsearch –h

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/*********************** 01/03/08 14:02:12 01/04/08

13:59:39 ldap/**********************************

5.4 配置ldap client

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

和上面一样,首先把和keytab文件拷贝到本地。

> scp :/etc/ /etc

> scp :/tmp/host_ /tmp

初始化host principal,取得tgt

> kinit –k host/ –t /tmp/host_

> klist

测试

> ldapsearch –h

6 调试

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

查看kdc的log

> tail -100f /var/log/

查看某个principal是否有效

> kinit –k principalName –t keytabFilePath

在命令行运行ldap server

> slapd –d9

-d9指定调试级别

在Ldap client端调试

> ldapsearch –d9 –h ldapServerAddress

7 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

在运行kinit –k principal –t keytab后,得到上面的错误

检查DNS,/etc/hosts看是否能按照名字访问kdc server。如果能ping通,但还是出现这样的错误,试作把/etc/里的

kdc = :88

admin_server = :749

主机名字改为ip地址

3. Client not found in Kerberos database while getting initial

credentials

在运行kinit –k principal –t keytab后,得到上面的错误

检查你的principal名字是否写对。我有几次遇到这样的错误都是打字错误引起的。


本文标签: 使用 系统 密码 认证 配置