OpenLDAP

来自 ArchWiki
(重定向自 LDAP

OpenLDAP 是 LDAP 协议的开源实现。LDAP 服务器基本上是一个非关系型数据库,它针对访问进行了优化,但不对写入数据进行优化。它主要用作地址簿(例如电子邮件客户端)或各种服务的身份验证后端(例如 Samba,它用于模拟域控制器,或 Linux 系统身份验证,它取代了 /etc/passwd),并且基本上保存了用户数据。

注意: 与 OpenLDAP 相关的以 ldap 开头的命令(如 ldapsearch)是客户端实用程序,而以 slap 开头的命令(如 slapcat)是服务器端实用程序。

本页面是基本 OpenLDAP 安装和健全性检查的起点。

提示: 目录服务是一个庞大的主题。因此,配置可能很复杂。如果您对这些概念完全陌生,这个 是一个很好的入门介绍,它易于理解,即使您是 LDAP 新手,也能帮助您入门。

安装

OpenLDAP 包含 LDAP 服务器和客户端。安装 它,使用软件包 openldap

配置

服务器

注意
  • 如果您有旧的 slapd.conf 配置文件,您可以简单地使用以下命令将其转换为新的 cn=config 数据库:
$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
  • 如果您已经在本机上安装了 OpenLDAP 数据库,并且想要删除它,则可以通过删除 /var/lib/openldap/openldap-data/ 内的所有内容来删除它。因此,请备份您的 DB_CONFIG

Slapd 服务器将其配置直接存储在其数据库中。因此,我们需要将我们的配置编写为 LDIF 文件并导入它。

首先,创建目录 /var/lib/openldap/openldap-data/,您的 LDAP 数据库内容(OpenLDAP 称之为“数据库 1”)将存储在此目录中

# install -m 0700 -o ldap -g ldap -d /var/lib/openldap/openldap-data/

现在我们需要为 LDAP 配置数据库(“数据库 0”)创建一个位置

# install -m 0760 -o root -g ldap -d /etc/openldap/slapd.d

创建一个文件 /etc/openldap/config.ldif,其中包含以下最简化的有用配置

/etc/openldap/config.ldif
# The root config entry
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /run/openldap/slapd.args
olcPidFile: /run/openldap/slapd.pid

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

# TODO: Include further schemas as necessary
include: file:///etc/openldap/schema/core.ldif

# The config database
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcRootDN: cn=Manager,$BASEDN

# The database for our entries
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcSuffix: $BASEDN
olcRootDN: cn=Manager,$BASEDN
olcRootPW: $PASSWD
olcDbDirectory: /var/lib/openldap/openldap-data
# TODO: Create further indexes
olcDbIndex: objectClass eq

有一些选项您需要更改

  • 每个出现的 $BASEDN 都必须替换为有效的 DN。如果您拥有域名 example.com,您很可能想要选择 dc=example,dc=com
  • $PASSWD 必须替换为加盐和哈希的密码,您可以使用运行 slappasswd 来生成密码。

此外,您可能需要考虑添加更多 模式 并创建额外的 索引 以调整数据库的性能。具体细节将取决于您的用例,但这里有一些建议。对于 LDAP 身份验证,您应该包含以下三个模式,以便能够使用用于存储用户的 posixAccount 对象类。

注意: 额外的索引必须是前面块的一部分。换行符将导致配置文件损坏
# TODO: Create further indexes
olcDbIndex: objectClass eq
olcDbIndex: uid pres,eq
olcDbIndex: mail pres,sub,eq
olcDbIndex: cn,sn pres,sub,eq
olcDbIndex: dc eq

# Additional schemas
# RFC1274: Cosine and Internet X.500 schema
include: file:///etc/openldap/schema/cosine.ldif
# RFC2307: An Approach for Using LDAP as a Network Information Service
# Check RFC2307bis for nested groups and an auxiliary posixGroup objectClass (way easier)
include: file:///etc/openldap/schema/nis.ldif
# RFC2798: Internet Organizational Person
include: file:///etc/openldap/schema/inetorgperson.ldif

允许使用 chsh 登录 ldap 用户帐户,通常选择 shell /bin/bash。然后以 ldap 用户身份导入这些设置

[ldap]$ slapadd -n 0 -F /etc/openldap/slapd.d/ -l /etc/openldap/config.ldif

或者,您也可以直接以 root 身份运行此命令。但是,如果您这样做,请确保 /etc/openldap/slapd.d/ 仍然可以被 ldap 访问

# slapadd -n 0 -F /etc/openldap/slapd.d/ -l /etc/openldap/config.ldif
# chown -R ldap:ldap /etc/openldap/*

如果一切正常,您现在将在 /etc/openldap/slapd.d 下的目录中看到诸如 cn=config 之类的名称。

默认情况下,OpenLDAP 将在所有接口上以未加密的方式监听。要使其仅在本地 IP 接口上监听,您可以编辑 slapd.service 读取的环境文件

/etc/conf.d/slapd
SLAPD_URLS="ldap://127.0.0.1/ ldap://[::1]"
SLAPD_OPTIONS=

最后,通过启动 slapd.service 守护程序来启动它。

注意
  • 如果您希望您的目录接受来自网络的请求,您应该考虑使用 TLS。有关详细信息,请参阅 #OpenLDAP over TLS
  • 如果您计划将您的 LDAP 服务器用于身份验证,您可能需要检查 LDAP 身份验证#LDAP 服务器设置 中的访问控制配置。
  • Berkeley DB (BDB) 不应再使用。 slapd(8) 的 mdb 后端是普通 slapd 数据库的推荐主后端。它使用 OpenLDAP 自己的 Lightning Memory-Mapped Database (LMDB) 库来存储数据,旨在取代 Berkeley DB 后端。官方仓库 中的 OpenLDAP 软件包默认为 mdb。

客户端

客户端配置文件位于 /etc/openldap/ldap.conf

它非常简单:您只需更改 BASE 以反映服务器的后缀,以及 URI 以反映服务器的地址,例如

/etc/openldap/ldap.conf
BASE            dc=example,dc=com
URI             ldap://127.0.0.1

如果您决定使用 SSL

  • URI 条目中的协议(ldap 或 ldaps)必须与 slapd 配置一致
  • 如果您决定使用 TLS,请在 ldap.conf 中添加 TLS_REQCERT allow
  • 如果您使用来自 CA 的签名证书,请在 ldap.conf 中添加行 TLS_CACERTDIR /usr/share/ca-certificates/trust-source

创建初始条目

注意: 如果您计划将您的 LDAP 服务器用于身份验证,您应该导入 LDAP 身份验证 文章中的 base.ldif,而不是按照这里的说明进行操作。

配置好客户端后,您可能想要创建根条目和管理器角色的条目

$ ldapadd -x -D 'cn=Manager,dc=example,dc=com' -W
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example
description: Example directory

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
^D

第一行之后的文本在 stdin 上输入,或者可以使用 -f 选项或文件重定向从文件中读取。

测试你的新 OpenLDAP 安装

这很容易,只需运行以下命令

$ ldapsearch -x '(objectclass=*)' -b 'dc=example,dc=com'

或者以 rootdn 身份进行身份验证(将 -x 替换为 -D user -W),使用我们上面的示例配置

$ ldapsearch -D "cn=Manager,dc=example,dc=com" -W '(objectclass=*)' -b 'dc=example,dc=com'

现在您应该看到有关数据库的一些信息。

OpenLDAP over TLS

注意: 上游文档 比本节更有用/更完整

如果您通过网络访问 OpenLDAP 服务器,尤其是在服务器上存储了敏感数据的情况下,您可能会面临有人嗅探以明文形式发送的数据的风险。下一部分将指导您如何在 LDAP 服务器和客户端之间设置 SSL 连接,以便加密发送数据。

为了使用 TLS,您必须拥有证书。出于测试目的,自签名证书就足够了。要了解有关证书的更多信息,请参阅 OpenSSL

警告: OpenLDAP 无法使用与密码关联的证书。

创建自签名证书

要创建自签名证书,请键入以下内容

$ openssl req -new -x509 -nodes -out slapdcert.pem -keyout slapdkey.pem -days 365

系统将提示您输入有关 LDAP 服务器的信息。大部分信息可以留空。最重要的信息是公用名称。必须将其设置为 LDAP 服务器的 DNS 名称。如果您的 LDAP 服务器的 IP 地址解析为 example.org,但其服务器证书显示的 CN 为 bad.example.org,则 LDAP 客户端将拒绝该证书,并且将无法协商 TLS 连接(显然结果是完全不可预测的)。

现在证书文件已创建,将它们复制到 /etc/openldap/ssl/(如果此目录不存在,请创建它)并保护它们。 slapdcert.pem 必须是世界可读的,因为它包含公钥。另一方面,出于安全原因,slapdkey.pem 应该仅对 ldap 用户可读

# mv slapdcert.pem slapdkey.pem /etc/openldap/ssl/
# chmod -R 755 /etc/openldap/ssl/
# chmod 400 /etc/openldap/ssl/slapdkey.pem
# chmod 444 /etc/openldap/ssl/slapdcert.pem
# chown ldap /etc/openldap/ssl/slapdkey.pem

配置 slapd 使用 SSL

编辑配置以告知 LDAP 证书文件所在的位置,方法是执行以下命令

注意: 最新版本的 OpenLDAP (2.4.45) 使用 OpenSSL 而不是 GnuTLS。这意味着当前版本的 OpenLDAP 确实知道如何处理 DEFAULT TLSCipherSuite。为了证明这一点,可以运行 ldd /usr/bin/slapd
ldapmodify -D 'cn=Manager,dc=example,dc=com' -W
dn: cn=config
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/ssl/slapdcert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/ssl/slapdkey.pem

如果您使用的是来自证书颁发机构(例如 Let’s Encrypt)的签名 SSL 证书,您还需要指定根证书数据库和您的中间证书的路径。您还需要更改 .pem 文件和中间目录的所有权,以使它们对用户 ldap 可读

ldapmodify -D 'cn=Manager,dc=example,dc=com' -W
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/ldap.my-domain.com/chain.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/ldap.my-domain.com/cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/ldap.my-domain.com/privkey.pem
-
add: olcTLSCACertificatePath
olcTLSCACertificatePath: /usr/share/ca-certificates/trust-source

SSLv2/v3

禁用 SSLv2/v3 并使用强密码。

ldapmodify -D 'cn=Manager,dc=example,dc=com' -W
dn: cn=config
add: olcTLSProtocolMin
olcTLSProtocolMin: 3.3
-
add: olcTLSCipherSuite
olcTLSCipherSuite: DEFAULT:!kRSA:!kDHE
-

TLSProtocolMin 指定线格式的最低版本,因此“3.3”实际上意味着 TLSv1.2。

TLSCipherSuite 指定 OpenSSL 密码列表,slapd 将从中选择协商 TLS 连接时使用的密码,按优先级降序排列。除了这些特定的密码之外,您还可以使用 OpenSSL 支持的任何通配符。 注意: DEFAULT 是一个通配符。有关密码、通配符和支持的选项的描述,请参阅 ciphers(1ssl)

注意: 要查看本地 OpenSSL 安装支持哪些密码,请键入以下内容:openssl ciphers -v ALL:COMPLEMENTOFALL。始终通过将 TLSCipherSuite 提供给 OpenSSL 命令来测试哪些密码将实际启用,例如:openssl ciphers -v 'DEFAULT'

启动启用 SSL 的 slapd

注意: StartTLS 不需要这样做,它与未加密的 LDAP 监听在同一端口上。

您将必须编辑 slapd.service 读取的环境文件,以更改 slapd 监听的协议

/etc/conf.d/slapd
SLAPD_URLS="ldaps:///"
SLAPD_OPTIONS=

本地主机连接不需要使用 SSL。因此,如果您想在本地访问服务器,则应将 SLAPD_URLS 行更改为

SLAPD_URLS="ldap://127.0.0.1 ldaps:///"

然后重启 slapd.service。如果之前已启用,请立即重新启用它。

注意: 如果您在上面创建了自签名证书,请务必在客户端上的 /etc/openldap/ldap.conf 中添加 TLS_REQCERT allow,否则它将无法连接到服务器。

下一步

你现在已经完成了基本的 LDAP 安装。下一步是设计你的目录。目录的设计很大程度上取决于你的使用目的。如果你是 LDAP 新手,可以考虑从将要使用该目录的特定客户端服务(PAM, Postfix 等)推荐的目录设计开始入手。

用于系统身份验证的目录请参考 LDAP 身份验证 文章。

一个不错的 Web 前端是 phpLDAPadmin

备份 LDAP

务必备份 LDAP 数据库和配置,以防因任何原因需要恢复。

导出配置

[ldap]$ slapcat -vF /etc/openldap/slapd.d -n 0 -l "$(hostname)-ldap-mdb-config-$(date '+%F').ldif"

导出数据库

[ldap]$ slapcat -v -n 1 -l "$(hostname)-ldap-database-$(date '+%F').ldif"

恢复 LDAP

导入配置

[ldap]$ slapadd -v -n 0 -F /etc/openldap/slapd.d -l <filename from config export>

导入数据库

[ldap]$ slapadd -v -n 1 -F /etc/openldap/slapd.d -l <filename from database export>

故障排除

slapd 配置检查

您可以使用以下命令检查配置设置:

$ slaptest -F /etc/openldap/slapd.d/ -v

客户端身份验证检查

如果您无法连接到服务器进行非安全身份验证

$ ldapsearch -x -H ldap://ldaservername:389 -D cn=Manager,dc=example,dc=exampledomain

以及使用 TLS 安全身份验证时

$ ldapsearch -x -H ldaps://ldaservername:636 -D cn=Manager,dc=example,dc=exampledomain

LDAP 服务器突然停止

如果您注意到 slapd 似乎启动但随后停止,请尝试运行

# chown -R ldap:ldap /var/lib/openldap

以允许 slapd 以用户 "ldap" 的身份写入其数据目录。

LDAP 服务器无法启动

尝试从命令行启动服务器并启用调试输出

# slapd -u ldap -g ldap -h ldaps://ldaservername:636 -d Config,Stats

参见