在 Kerberos 数据库中找不到服务器 ldap/example.com@EXAMPLE.COM
Server ldap/example.com@EXAMPLE.COM not found in Kerberos database
编辑: 问题终于解决了。详细信息可以在本邮件末尾的故障排除部分找到。
我在这里留下了详细的步骤,以防它能帮助到别人。
设置 OpenLDAP
我-创建服务器
文档经常过时,您会找到多种实现相同目的的方法。
根据我的阅读,创建服务器的现代方法是使用 /etc/openldap/slapd.ldif
而不是 /etc/openldap/slapd.conf
。下面是使用 letsencrypt 证书的示例配置。
您通常可以在 slapd.ldif
中转换 slapd.conf
指令,方法是在其前面添加 olc
。只需确保它位于正确的 dn
块中。
确保创建一个目录 /etc/openldap/slapd.d
可由 ldap 用户读写,并且 slapd
已停止。使用 slapadd
命令将你 slapd.ldif
插入 slapd.d
。我 运行 它使用 sudo -u ldap
以便 slapadd
创建 ldap 用户拥有的文件。您也可以 运行 slapadd
不带 sudo
然后 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
服务后 rm -rf /etc/openldap/slapd.d/* /var/lib/openldap-data/{data.mdb,lock.mdb}
并 return 到步骤 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}
然后添加构建 DIT 的 ldif 文件:
$ ldapadd -x -W -D "cn=Manager,dc=example,dc=com" -f ${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
我-配置服务器
服务器配置 (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 file。
III - 创建主体
启动 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 控制台
- 创建主体:
$ add_principal root/admin@EXAMPLE.COM
- 同时为您当前的用户创建一个主体:
$ add_principal root@EXAMPLE.COM
- 退出:
$ quit
或 $ q
将此主体添加到 kadm5.acl
:
# /var/lib/krb5kdc/kadm5.acl
------------------------------------
root/admin@EXAMPLE.COM *
IV - 配置密钥分发中心 (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 is the daemon that will catch SASL 来自 LDAP 的请求并将它们转换为 Kerberos(或您使用的任何身份验证机制)请求。如果您想使用您的身份验证服务的密码而不是 LDAP 密码,则需要它,例如:
userPassword: {SASL}user@EXAMPLE.COM
其中 EXAMPLE.COM
是您的领域,user
是主体。
配置 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"
您可以在手册页或使用 $ saslauthd -h
中查看参数。确保在此文件中使用适当的变量。您可以在 systemd 设置中看到哪个与 $ systemctl cat saslauthd
一起使用。
还要确保套接字 (/run/saslauthd/mux
) 可由 saslauthd
读取/写入。
使用
启动服务
$ systemctl start saslauthd
并检查 saslauthd
是否正常使用:
$ testsaslauthd -r YOURREALM -u someusernameyouwant -p somepassword
VI - 设置 GSSAPI/SASL 身份验证
使用 $ kadmin.local
打开 kadmin 控制台并创建 GSSAPI 主体和密钥表文件:
首先在 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 user/group 可读:
$ 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
进行搜索。
疑难解答
因为我最初的问题现在已经解决了
Server ldap/example.com@EXAMPLE.COM not found in Kerberos database)
当您遇到一些问题时,这里有一些提示:
查看日志
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
去看看他们。
问题
Server ldap/example.com@EXAMPLE.COM not found in Kerberos database
当我 运行 $ 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 设置的步骤 V 和 VI。您需要一个 OpenLDAP 可读的密钥表。您可以将其放置在您想要的位置并根据需要命名。还要确保环境变量 KRB5_KTNAME
已设置(在 systemd 服务中或在您的初始化系统中/在 shell 您 运行 slapd 中),指向该密钥表。
主机密钥表应放置在 /etc/krb5.keytab
。它对于 ldapsearch / ldapapi 可能并不重要(我没有检查它是否可以在没有它的情况下工作)但它对于诸如 SSSD.
之类的守护进程是必需的
问题
ldap_sasl_interactive_bind_s: Invalid credentials (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
学分
希望这些步骤可以帮助其他一些初学者,致谢:
- https://wiki.archlinux.org/index.php/Kerberos
- https://help.ubuntu.com/lts/serverguide/kerberos-ldap.html
和其他一些指南(在 Fedora 上查看 Setting Up Kerberos Authentication
)
好的,所以我终于解决了我的答案:
我只需要在 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
它解决了问题。
我编辑了问题以将缺少的步骤添加到 "guide" 部分,请随意编辑名称/改进它/复制/粘贴。谢谢。
编辑: 问题终于解决了。详细信息可以在本邮件末尾的故障排除部分找到。
我在这里留下了详细的步骤,以防它能帮助到别人。
设置 OpenLDAP
我-创建服务器
文档经常过时,您会找到多种实现相同目的的方法。
根据我的阅读,创建服务器的现代方法是使用 /etc/openldap/slapd.ldif
而不是 /etc/openldap/slapd.conf
。下面是使用 letsencrypt 证书的示例配置。
您通常可以在 slapd.ldif
中转换 slapd.conf
指令,方法是在其前面添加 olc
。只需确保它位于正确的 dn
块中。
确保创建一个目录 /etc/openldap/slapd.d
可由 ldap 用户读写,并且 slapd
已停止。使用 slapadd
命令将你 slapd.ldif
插入 slapd.d
。我 运行 它使用 sudo -u ldap
以便 slapadd
创建 ldap 用户拥有的文件。您也可以 运行 slapadd
不带 sudo
然后 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
服务后 rm -rf /etc/openldap/slapd.d/* /var/lib/openldap-data/{data.mdb,lock.mdb}
并 return 到步骤 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}
然后添加构建 DIT 的 ldif 文件:
$ ldapadd -x -W -D "cn=Manager,dc=example,dc=com" -f ${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
我-配置服务器
服务器配置 (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 file。
III - 创建主体
启动 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
:
- 创建主体:
$ add_principal root/admin@EXAMPLE.COM
- 同时为您当前的用户创建一个主体:
$ add_principal root@EXAMPLE.COM
- 退出:
$ quit
或$ q
将此主体添加到 kadm5.acl
:
# /var/lib/krb5kdc/kadm5.acl
------------------------------------
root/admin@EXAMPLE.COM *
IV - 配置密钥分发中心 (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 is the daemon that will catch SASL 来自 LDAP 的请求并将它们转换为 Kerberos(或您使用的任何身份验证机制)请求。如果您想使用您的身份验证服务的密码而不是 LDAP 密码,则需要它,例如:
userPassword: {SASL}user@EXAMPLE.COM
其中 EXAMPLE.COM
是您的领域,user
是主体。
配置 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"
您可以在手册页或使用 $ saslauthd -h
中查看参数。确保在此文件中使用适当的变量。您可以在 systemd 设置中看到哪个与 $ systemctl cat saslauthd
一起使用。
还要确保套接字 (/run/saslauthd/mux
) 可由 saslauthd
读取/写入。
使用
启动服务$ systemctl start saslauthd
并检查 saslauthd
是否正常使用:
$ testsaslauthd -r YOURREALM -u someusernameyouwant -p somepassword
VI - 设置 GSSAPI/SASL 身份验证
使用 $ kadmin.local
打开 kadmin 控制台并创建 GSSAPI 主体和密钥表文件:
首先在 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 user/group 可读:
$ 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
进行搜索。
疑难解答
因为我最初的问题现在已经解决了
Server ldap/example.com@EXAMPLE.COM not found in Kerberos database)
当您遇到一些问题时,这里有一些提示:
查看日志
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
去看看他们。
问题
Server ldap/example.com@EXAMPLE.COM not found in Kerberos database
当我 运行 $ 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 设置的步骤 V 和 VI。您需要一个 OpenLDAP 可读的密钥表。您可以将其放置在您想要的位置并根据需要命名。还要确保环境变量 KRB5_KTNAME
已设置(在 systemd 服务中或在您的初始化系统中/在 shell 您 运行 slapd 中),指向该密钥表。
主机密钥表应放置在 /etc/krb5.keytab
。它对于 ldapsearch / ldapapi 可能并不重要(我没有检查它是否可以在没有它的情况下工作)但它对于诸如 SSSD.
问题
ldap_sasl_interactive_bind_s: Invalid credentials (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
学分
希望这些步骤可以帮助其他一些初学者,致谢:
- https://wiki.archlinux.org/index.php/Kerberos
- https://help.ubuntu.com/lts/serverguide/kerberos-ldap.html
和其他一些指南(在 Fedora 上查看 Setting Up Kerberos Authentication
)
好的,所以我终于解决了我的答案:
我只需要在 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
它解决了问题。
我编辑了问题以将缺少的步骤添加到 "guide" 部分,请随意编辑名称/改进它/复制/粘贴。谢谢。