OpenLDAP
OpenLDAP 是 LDAP 协议的开源实现。LDAP 服务器基本上是一个非关系型数据库,它针对访问进行了优化,但不对写入数据进行优化。它主要用作地址簿(例如电子邮件客户端)或各种服务的身份验证后端(例如 Samba,它用于模拟域控制器,或 Linux 系统身份验证,它取代了 /etc/passwd
),并且基本上保存了用户数据。
ldap
开头的命令(如 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
守护程序来启动它。
- 如果您希望您的目录接受来自网络的请求,您应该考虑使用 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
。
创建初始条目
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 指定 OpenSSL 密码列表,slapd 将从中选择协商 TLS 连接时使用的密码,按优先级降序排列。除了这些特定的密码之外,您还可以使用 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 是一个类似于 phpMyAdmin 风格的 Web 界面工具。
- LDAP 认证
- apachedirectorystudioAUR,来自 Arch User Repository,是一个基于 Eclipse 的 LDAP 查看器。与 OpenLDAP 安装完美兼容。