OpenLDAP
OpenLDAP 是 LDAP 协议的开源实现。LDAP 服务器基本上是一个非关系型数据库,它针对访问(而非写入)数据进行了优化。它主要用作地址簿(例如,电子邮件客户端)或各种服务(例如 Samba,用于模拟域控制器,或 Linux 系统身份验证,用于替换 /etc/passwd
)的身份验证后端,并且基本上保存用户数据。
ldap
开头的与 OpenLDAP 相关的命令(如 ldapsearch
)是客户端实用程序,而以 slap
开头的命令(如 slapcat
)是服务器端。本页面是基本 OpenLDAP 安装和健全性检查的起点。
安装
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
来启动 slapd 守护程序。
- 如果您希望您的目录接受来自网络的请求,您应该考虑使用 TLS。有关详细信息,请参阅 #OpenLDAP over TLS。
- 如果您计划使用 LDAP 服务器进行身份验证,您可能需要查看 LDAP 身份验证#LDAP 服务器设置 中的访问控制配置。
- Berkeley DB (BDB) 不应再使用。 slapd(8) 的 mdb 后端是正常的 slapd 数据库的推荐主后端。它使用 OpenLDAP 自己的 Lightning 内存映射数据库 (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
。
创建初始条目
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。
创建自签名证书
要创建自签名证书,请输入以下内容
$ 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 证书文件所在的位置,方法是执行以下命令
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 指定 slapd 在协商 TLS 连接时将从中选择的 OpenSSL 密码列表,按偏好顺序递减。除了这些特定密码之外,您还可以使用 OpenSSL 支持的任何通配符。 注意: DEFAULT 是一个通配符。有关密码、通配符和支持选项的描述,请参阅 ciphers(1ssl)。
openssl ciphers -v ALL:COMPLEMENTOFALL
。始终通过将 TLSCipherSuite 提供给 OpenSSL 命令来测试哪些密码将实际启用,例如:openssl ciphers -v 'DEFAULT'
。启动带有 SSL 的 slapd
您将必须编辑由 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
另请参阅
- OpenLDAP 软件管理员官方指南
- phpLDAPadmin 是一款 Web 界面工具,风格类似于 phpMyAdmin。
- LDAP 身份验证
- apachedirectorystudioAUR 来自 Arch 用户仓库,是一款基于 Eclipse 的 LDAP 查看器。与 OpenLDAP 安装完美配合。