我正在尝试使用 syncrepl 为 LDAP 设置复制服务器。我想使用 Kerberos 来验证消费者,因为我们已经设置了它,而且它似乎更安全。我的提供商和消费者的数据库定义如下。
当我启动消费者时,出现以下错误:
GSSAPI Error: Unspecified GSS failure. Minor code may provide more information
(Credentials cache file '/tmp/krb5cc_55' not found)
我认为这意味着消费者没有有效的 TGT。如何配置消费者以获取有效的 TGT?我读过一些较旧的资料,建议使用 k5start 或 cron 作业。这仍然是这样做的方法吗?
slapd.conf 手册页指出authcid
和authzid
可以与一起使用bindmethod=sasl
,但没有指定应如何格式化它们。我应该在这里放置 DN 还是 kerberos 主体或者其他内容?我需要指定这些吗?
感谢您的帮助
消费者配置:
database bdb
suffix "dc=example"
rootdn "uid=someuser,cn=realm,cn=gssapi,cn=auth"
directory /var/lib/ldap
dirtyread
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
syncrepl rid=1
provider=ldap://provider.realm
type=refreshAndPersist
starttls=yes
searchbase="dc=example"
schemachecking=off
bindmethod=sasl
saslmech=gssapi
retry="10 +"
提供商配置
database bdb
suffix "dc=example"
rootdn "uid=someuser,cn=realm,cn=gssapi,cn=auth"
directory /var/lib/ldap
dirtyread
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
答案1
我认为这意味着消费者没有有效的 TGT。
是的,就是这个意思。
如何配置消费者以获取有效的 TGT?我读过一些较旧的资料,建议使用 k5start 或 cron 作业。这仍然是这样做的方法吗?
不确定 cron,但 k5start 仍然是一个很好的方法。
但最近的 MIT Kerberos 支持一种称为客户端 keytab 启动,设置起来要简单得多:只需添加$KRB5_CLIENT_KTNAME
到 slapd 的环境中,并将其指向与 相同的文件$KRB5_KTNAME
。(假设您有一个单独的 keytab ldap/*
。您应该有。)
最后,您可以告诉 slapd 使用 gss-proxy,它类似于 Kerberos 的 ssh-agent。设置GSS_USE_PROXY=1
并配置 /etc/gssproxy 以将 slapd 识别为发起方(客户端)和接受方(服务器)。
slapd.conf 手册页指出 authcid 和 authzid 可以与 bindmethod=sasl 结合使用,但未指定应如何格式化它们。我应该在这里放置 DN 还是 kerberos 主体,或者其他内容?我需要指定这些吗?
我不记得验证码与 GSSAPI 一起提供服务(如果有的话)– IIRC,此机制会自动使用从您的票证确定的身份,因此无需手动指定它。
在接受端,slapd 会将收到的 Kerberos 主体转换为伪 DN,如uid=foo@realm,cn=gssapi,cn=auth
,您可以直接在 ACL 中使用它,或者使用授权正则表达式(又名olcAuthzRegexp) 将其翻译为更佳的 DN。
同时,授权码以相同的方式工作,与机制无关。它是可选的,但如果您指定它,那么它必须是以 为前缀的 DNdn:
或以 为前缀的用户名u:
。(这里的用户名,如 authcids,被转换为伪 DN 并经过olcAuthzRegexp,并使用结果 DN。)
如果策略允许,slapd 将授予您 authzid 所拥有的权限。(这类似于 LDAP 的 sudo。)
答案2
我使用以下配置使 syncrepl 能够进行 Kerberos 身份验证。本网站关于 nslcd.conf 的说法,authzid
应该是“dn:<distinguished name>”或“u:<user name>”的形式。我还使用 k5start 为someuser@REALM
at创建了一个缓存文件/tmp/krb5cc_55
,并执行了chown ldap:ldap
。请注意,55 是 ldap uid;但是,我不确定是否有必要将文件命名为此。在我的提供程序配置中,我指定someuser
为 以rootdn
允许它访问整个数据库。
我只是想澄清一下,这对我有用,但我对 ldap 的了解有限,所以我不能保证它在其他地方也能起作用,而且我不知道这个配置中的所有内容是否都是必要的。
syncrepl rid=1
provider=ldap://provider.realm
type=refreshAndPersist
starttls=yes
searchbase="dc=realm"
schemachecking=off
retry="10 +"
tls_cacert="/path/to/ca.crt"
bindmethod=sasl
saslmech=gssapi
authcid="someuser@REALM"
authzid="uid=someuser,cn=realm,cn=gssapi,cn=auth"