在Kerberos数据库中找不到服务器ldap/example.com@EXAMPLE.COM。

11

编辑: 问题已经解决。详细信息可以在此消息末尾的故障排除部分找到。

我将详细步骤留在这里,以防可以帮助其他人。

设置OpenLDAP

I - 创建服务器

文档通常已过时,您会发现多种实现相同目的的方法。
根据我的阅读,创建服务器的现代方法是使用/etc/openldap/slapd.ldif而不是/etc/openldap/slapd.conf。下面是一个使用letsencrypt证书的示例配置。

您通常可以通过在其前面加上olc来将slapd.conf指令转换为slapd.ldif。只需确保它位于正确的dn块中即可。

确保您创建了一个可由ldap用户读取和写入的目录/etc/openldap/slapd.d,并且slapd已停止。使用sudo -u ldap命令将slapd.ldif插入slapd.d。我使用sudo -u ldap运行它,以便slapadd创建属于ldap用户的文件。您还可以在没有sudo的情况下运行slapadd,然后运行chown -R ldap:ldap /etc/openldap/slapd.d。这里重要的是/etc/openldap目录中的所有内容都可由用户slapd读取/写入。

$ sudo -u ldap slapadd -d -1 \
    -F /etc/openldap/slapd.d \
    -n 0 \
    -f /etc/openldap/slapd.ldif

OpenLDAP配置:

# /etc/openldap/slapd.ldif
------------------------------------
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /run/openldap/slapd.args
olcPidFile: /run/openldap/slapd.pid
olcTLSCipherSuite: ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
olcTLSCACertificateFile: /etc/letsencrypt/live/example/chain.pem
olcTLSCertificateFile: /etc/letsencrypt/live/example/cert.pem
olcTLSCertificateKeyFile: /etc/letsencrypt/live/example/privkey.pem
olcTLSVerifyClient: never

#
# Load dynamic backend modules:
#
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModuleload: back_mdb.so


dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///etc/openldap/schema/core.ldif
include: file:///etc/openldap/schema/cosine.ldif
include: file:///etc/openldap/schema/nis.ldif
include: file:///etc/openldap/schema/inetorgperson.ldif
include: file:///etc/openldap/schema/openldap.ldif
include: file:///etc/openldap/schema/kerberos.ldif
include: file:///etc/openldap/schema/openssh-lpk.ldif

# Frontend settings
#
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
olcAccess: to dn.base="" by * read
olcAccess: to dn.base="cn=Subschema" by * read
olcAccess: to * 
    by self write 
    by users read 
    by anonymous auth


#######################################################################
# LMDB database definitions
#######################################################################
#
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: {SSHA}anEncryptedPassword
olcDbDirectory: /var/lib/openldap-data
# Indices to maintain
olcDbIndex: objectClass        eq
olcDbIndex: uid                pres,eq
olcDbIndex: memberUid          eq
olcDbIndex: uidNumber          eq
olcDbIndex: gidNumber          eq
olcDbIndex: uniqueMember       eq
olcDbIndex: cn                 pres,sub,eq
olcDbIndex: mail               pres,sub,eq
olcDbIndex: sn                 pres,sub,eq
olcDbIndex: givenname          eq,subinitial
olcDbIndex: dc                 eq
olcDbIndex: krbPrincipalName   eq,pres,sub
olcAccess: to attrs=userPassword,shadowLastChange,krbPrincipalKey,givenName,sn,photo 
    by self write 
    by anonymous auth 
    by dn.base="cn=Manager,dc=example,dc=com" write 
    by * none
olcAccess: to * 
    by self read 
    by dn.base="cn=Manager,dc=example,dc=com" write 
    by * read

II - 设置目录信息树(DIT)

启动服务器:$ systemctl start slapd

这将创建一个/var/lib/openldap-data/data.mdb目录(在您的发行版上可能会有所不同)。如果遇到问题或想要重置OpenLDAP,您可以在停止slapd服务后删除/etc/openldap/slapd.d/* /var/lib/openldap-data/{data.mdb,lock.mdb},并返回步骤I。

我修改了我的slapd.service,以销毁/var/lib/openldap-data/lock.mdb,因为在我的设置中,当关闭slapd时,这个文件没有被删除,导致它无法重新启动。

slapd.service的内容:

# /etc/systemd/system/slapd.service
------------------------------------
[Unit]
Description=OpenLDAP Server Daemon
After=network.target

[Service]
# "-d n" stops slapd from forking
ExecStartPre = /bin/rm -f /var/lib/openldap-data/lock.mdb
ExecStart = /usr/lib64/openldap/slapd -u ldap -g ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS -d1
ExecStopPost = /bin/rm -f /var/lib/openldap-data/lock.mdb
Restart = always
RestartSec = 180

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/slapd.service.d/00gentoo.conf
------------------------------------
[Service]
Environment="HOME=/var/lib/openldap"
# Use the slapd configuration directory:
Environment="SLAPD_OPTIONS=-F /etc/openldap/slapd.d"
Environment="SLAPD_URLS=ldaps:/// ldap://127.0.0.1:389/ ldapi://127.0.0.1"
Environment="KRB5_KTNAME=FILE:/etc/openldap/ldap.keytab"

确保证书可以被LDAP用户读取:

$ useradd -r letsencrypt
$ chown -R letsencrypt:letsencrypt /etc/letsencrypt
$ gpasswd -a ldap letsencrypt
$ chmod 750 /etc/letsencrypt/{live,archive}

然后添加LDIF文件以构建DIT:

$ ldapadd -x -W -D "cn=Manager,dc=example,dc=com" -f ${PATH_TO_FILES}


注:${PATH_TO_FILES}为文件所在路径。
# example.com.ldif
------------------------------------
# Create example dn
dn: dc=example,dc=com
dc: example
objectClass: dcObject
objectClass: organization
o: Example Organization

# Create Manager role
dn: cn=Manager,dc=example,dc=com
cn: Manager
description: LDAP Administrator
objectClass: organizationalROle
objectClass: top
roleOccupant: dc=example,dc=com

# users.ldif
------------------------------------
dn: ou=People,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: People
description: Users of Example

# groups.ldif
------------------------------------
dn: ou=Group,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Group
description: Groups of Example

III - 设置LDAP客户端

配置ldap.conf:

# /etc/openldap/ldap.conf
------------------------------------
BASE    dc=example,dc=com
URI ldaps://example.com

TLS_CACERT      /etc/letsencrypt/live/example/chain.pem
TLS_REQCERT     allow
TIMELIMIT       2

设置Kerberos

I - 配置服务器

服务器配置(mit-krb5):

# /etc/krb5.conf
------------------------------------
[logging]
    default = FILE:/var/log/krb5/libs.log
    kdc = FILE:/var/log/krb5/kdc.log
    admin_server = FILE:/var/log/krb5/kadmind.log

[libdefaults]
    default_realm = EXAMPLE.COM

[realms]
    EXAMPLE.COM = {
        kdc = example.com
        admin_server = example.com
        default_domain = example.com
        database_module = openldap_ldapconf
    }

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

[dbdefaults]
    ldap_kerberos_container_dn = cn=krbContainer,dc=example,dc=com

[dbmodules]
    openldap_ldapconf = {
        db_library = kldap
        ldap_kdc_dn = "cn=Manager,dc=example,dc=com"

        ldap_kadmind_dn = "cn=Manager,dc=example,dc=com"

        ldap_service_password_file = /etc/krb5kdc/service.keyfile
        ldap_servers = ldaps://example.com
        ldap_conns_per_server = 5
    }

首先创建域:

$ kdb5_util -r EXAMPLE.COM create -s

II - 配置OpenLDAP后端

设置Kerberos OpenLDAP子树:

$ kdb5_ldap_util -D "cn=Manager,dc=example,dc=com" create -subtrees dc=example,dc=com -r EXAMPLE.COM -s -H ldap://127.0.0.1"

并在本地创建主密钥的副本,该密钥以加密形式驻留在KDC的本地磁盘上,以便与OpenLDAP链接:

$ kdb5_ldap_util -D "cn=Manager,dc=example,dc=com" stashsrvpw -f /etc/krb5kdc/service.keyfile cn=Manager,dc=example,dc=com

这也被称为stash文件

III - 创建一个principal

启动MIT Kerberos v5服务(krb5):

$ systemctl start krb5-kdc krb5-kadmind

Systemd服务已从ArchLinux软件包中获取(因为Gentoo没有提供这些文件):

krb5-kdc.service:

# /etc/systemd/system/krb5-kdc.service
------------------------------------
[Unit]
Description=Kerberos 5 KDC

[Service]
ExecStart=/usr/sbin/krb5kdc -n
Restart=always

[Install]
WantedBy=multi-user.target

krb5-kadmind:

# /etc/systemd/system/krb5-kadmind.service
------------------------------------
[Unit]
Description=Kerberos 5 administration server

[Service]
ExecStart=/usr/sbin/kadmind -nofork

[Install]
WantedBy=multi-user.target

使用 $ kadmin.local 启动 kadmin 控制台:

  • 创建一个 principal:$ add_principal root/admin@EXAMPLE.COM
  • 同时为当前用户创建一个 principal:$ add_principal root@EXAMPLE.COM
  • 退出: $ quit$ q

将此 principal 添加到 kadm5.acl 文件中:

# /var/lib/krb5kdc/kadm5.acl
------------------------------------
root/admin@EXAMPLE.COM *

四、配置密钥分发中心(KDC)

配置kdc.conf:

# /var/lib/krb5kdc/kdc.conf
------------------------------------
[kdcdefaults]
kdc_ports = 750,88

[realms]
EXAMPLE.COM = {
    database_name = /var/lib/krb5kdc/principal
    acl_file = /var/lib/krb5kdc/kadm5.acl
    key_stash_file = /var/lib/krb5kdc/.k5.EXAMPLE.COM
    kdc_ports = 750,88
    max_life = 10h 0m 0s
    max_renewable_life = 7d 0h 0m 0s
}

然后重新启动krb5服务:$ systemctl restart krb5-kdc krb5-kadmind

V - 设置saslauthd

SASLAuthD是一个守护进程,用于捕获来自LDAP的SASL请求并将其转换为Kerberos(或您使用的任何身份验证机制)请求。如果您想使用身份验证服务的密码而不是LDAP密码,则需要该服务,并且例如可以允许您使用以下内容:

userPassword: {SASL}user@EXAMPLE.COM

其中EXAMPLE.COM是您的领域,user是一个principal。

配置SASL2 slapd:

# /etc/sasl2/slapd.conf (Gentoo) or /usr/lib/sasl2 (Ubuntu)
------------------------------------
pwcheck_method:saslauthd

请确保 saslauthd 使用的是 Kerberos v5:

# /etc/conf.d/saslauthd (Gentoo) or /etc/default/saslauthd (Ubuntu)
------------------------------------
# -a describe the mechanism used
# -m is the working directory, where socket will be located
SASLAUTHD_OPTS="-a kerberos5 -m /run/saslauthd"

您可以在man页或使用$ saslauthd -h中检查参数。确保在这些文件中使用适当的变量。您可以在systemd设置上使用$ systemctl cat saslauthd查看哪个变量被使用。
还要确保socket (/run/saslauthd/mux)可被saslauthd读取/写入。
使用以下命令启动服务: $ systemctl start saslauthd,并检查saslauthd是否正常工作: $ testsaslauthd -r YOURREALM -u someusernameyouwant -p somepassword VI-设置GSSAPI/SASL身份验证
使用 $ kadmin.local 打开kadmin控制台,并创建GSSAPI主体和keytab文件:
首先,在Kerberos数据库中为目录服务器创建服务主体,并创建包含该主体项的密钥文件到openldap配置目录中。
您可以替换example.com的实例,但ldap / 应完全写入。
$ addprinc -randkey ldap/example.com@EXAMPLE.COM
$ ktadd -k /etc/openldap/ldap.keytab ldap/example.com@EXAMPLE.COM

然后为客户端创建一个主机原则和其密钥表。你可以替换 example.com 的实例,但是 host/ 应该字面上写成。

$ addprinc -randkey host/example.com@EXAMPLE.COM
$ ktadd -k /etc/krb5.keytab host/example.com@EXAMPLE.COM

退出: $ quit

确保ldap.keytab只能被ldap用户/组读取:

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

确保获取一个新的Kerberos票据:

$ kinit

完成了,您已经设置了一个使用OpenLDAP后端的Kerberos服务器。

现在,您可以告诉OpenLDAP在创建/修改用户时使用Kerberos密码:

userPassword: {SASL}root@EXAMPLE.COM

例如,您可以创建一个名为file.ldif的文件,其中包含以下内容,并使用之前提到的ldapadd进行添加:
dn: uid=root,ou=People,dc=example,dc=com
uid: root
cn: root
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {SASL}root@EXAMPLE.COM
loginShell: /bin/zsh
uidNumber: 0
gidNumber: 0
homeDirectory: /root
gecos: root

您也可以使用无参数的 ldapsearch 进行搜索。

故障排除

由于我的初始问题已经解决,所以在您遇到问题时,以下是一些提示:

在 Kerberos 数据库中未找到服务器 ldap/example.com@EXAMPLE.COM)

检查日志

  • slapd.service:使用 journalctl -xe(我的服务类型不是 Forking,标志 -d 9 将在 systemd 日志中打印日志。您可以使用 -d 0 禁用日志记录,但要保留标志 -d 或将其声明为 Type: Forking
  • krb5-kdc:查看 /var/log/krb5/kdc.log 或您在 /etc/krb5.conf 中设置的任何位置
  • krb5-kadmind:检查 /var/log/krb5/kadmind.log 或您在 /etc/krb5.conf 中设置的任何位置
  • saslauthd:您需要使用标志 -d 启用调试。在 shell 中运行带有此标志的 saslauthd,或将此标志添加到 /etc/conf.d/saslauthd(Gentoo)或 /etc/default/saslauthd(Ubuntu)中,并使用 journalctl -xe 查看它们。

问题

在 Kerberos 数据库中未找到服务器 ldap/example.com@EXAMPLE.COM

当我运行 $ ldapsearch$ ldapwhoami 时,出现以下错误:

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 (Server ldap/example.com@EXAMPLE.COM not found in Kerberos database)

解决方案

检查您是否正确执行了Kerberos设置的第五步和第六步。您需要一个可被OpenLDAP读取的keytab文件。您可以将其放在任何位置并按任何名称命名。同时,请确保环境变量KRB5_KTNAME已设置(无论是在systemd服务中还是在您的init系统/运行slapd的shell中),指向该keytab文件。

主机keytab应放置在/etc/krb5.keytab。对于ldapsearch / ldapapi可能不重要(我没有检查是否可以在没有它的情况下工作),但对于像SSSD这样的守护进程则是必需的。

问题

ldap_sasl_interactive_bind_s:凭据无效(49)

当我运行$ ldapsearch$ ldapwhoami时,出现以下错误:

SASL/GSSAPI authentication started
ldap_sasl_interactive_bind_s: Invalid credentials (49)
        additional info: SASL(-13): authentication failure: GSSAPI
Failure: gss_accept_sec_context

解决方案

尝试刷新您的Kerberos票证:$ kinit

致谢

希望这些步骤能够帮助其他一些初学者,感谢以下来源:

以及其他一些指南(请查看 Fedora 上的“设置 Kerberos 认证”)


我正在按照您的步骤进行操作,但在第五步设置saslauthd时,我找不到kerberos5作为认证提供程序。我的操作系统是SLES12。我是否缺少任何软件包?有什么想法吗? - orak
1个回答

5

好的,我最终解决了我的问题:

我只需要在Kerberos上创建服务器,并创建一个包含它的密钥文件。

$ addprinc -randkey ldap/example.com@EXAMPLE.COM
$ ktadd -k /etc/openldap/ldap.keytab ldap/example.com@EXAMPLE.COM

Slapd不知道那个文件,所以我在我的slapd.service中添加了环境变量:

# /etc/krb5.conf
------------------------------------
Environment="KRB5_KTNAME=FILE:/etc/openldap/ldap.keytab"

我还需要配置saslauthd并运行它:

配置守护进程:

# /etc/conf.d/saslauthd (gentoo) or /etc/default/saslauthd (ubuntu)
------------------------------------
# -a describe the mechanism used
# -m is the working directory, where socket will be located
SASLAUTHD_OPTS="-a kerberos5 -m /run/saslauthd"

配置选项:

# /etc/sasl2/slapd.conf (gentoo) or /usr/lib/sasl2 (ubuntu)
------------------------------------
pwcheck_method:saslauthd

开始它:$ systemctl start saslauthd

然后出现了一个错误:

SASL/GSSAPI authentication started
ldap_sasl_interactive_bind_s: Invalid credentials (49)
        additional info: SASL(-13): authentication failure: GSSAPI
Failure: gss_accept_sec_context

这是因为我的Kerberos票据已过期。 我只需运行$ kinit就可以解决问题了。
我编辑了问题,添加了“指南”部分的遗漏步骤,请随意编辑名称/改进/复制/粘贴。谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接