如何使用 STARTTLS 加密 OpenLDAP 连接

介绍

OpenLDAP 提供灵活且受支持的 LDAP 目录服务,但服务器本身通过未加密的 Web 连接进行通信,因此在本指南中,我们将展示如何使用 STARTTLS 加密连接到 OpenLDAP 以升级传统连接到 TLS。

前提条件

在您开始使用本指南之前,您应该在您的服务器上设置一个非 root 用户,以便设置此类型的用户,请遵循我们的 Ubuntu 14.04 初始安装指南

在本指南中,我们将介绍如何在 Ubuntu 14.04 服务器上安装 OpenLDAP. 如果您已经在服务器上安装了 OpenLDAP,您可以跳过相关的安装和配置步骤。

LDAP 超过 SSL 与 LDAP 与 STARTTLS

有两种方法可以使用 SSL/TLS 加密 LDAP 连接。

传统上,需要加密的LDAP连接被处理在一个单独的端口上,通常是636。整个连接将用SSL/TLS包装。

STARTTLS 是一种替代方法,现在是加密 LDAP 连接的首选方法。STARTTLS 通过在连接过程后/期间用 SSL/TLS 包装非加密连接来升级

设置主机名和 FQDN

在您开始之前,我们应该设置我们的服务器,以便它正确地解决其主机名称和完全合格的域名(FQDN)。这将是必要的,以便我们的证书被客户验证。我们将假定我们的LDAP服务器将被托管在一台机器上有ldap.example.com的FQDN。

要在您的服务器上的所有相关位置设置主机名,请使用hostnamectl命令与set-hostname选项。

1sudo hostnamectl set-hostname ldap

接下来,我们需要通过确保我们的 /etc/hosts 文件有正确的信息来设置我们的服务器的 FQDN:

1sudo nano /etc/hosts

查找描绘127.0.1.1 IP 地址的行。 将 IP 地址之后的第一个字段更改为服务器的 FQDN,第二个字段更改为短主机名。

1[label /etc/hosts]
2. . .
3
4127.0.1.1 ldap.example.com ldap
5127.0.0.1 localhost
6
7. . .

保存并关闭文件,当你完成。

您可以通过键入检查您是否正确配置了这些值:

1hostname

这应该返回你的短主机名:

1[label short hostname]
2ldap

检查FQDN通过键入:

1hostname -f

这应该返回FQDN:

1[label FQDN setting]
2ldap.example.com

安装LDAP服务器和GnuTLS软件

确保您的主机名是正确设置后,我们可以安装所需的软件. 如果您已经安装和配置了 OpenLDAP,您可以跳过第一个子部分。

安装 OpenLDAP 服务器

如果您尚未安装 OpenLDAP,现在是时候修复它了. 更新您的服务器的本地包索引并通过键入安装软件:

1sudo apt-get update
2sudo apt-get install slapd ldap-utils

您将被要求提供一个 LDAP 管理密码. 请放心跳过提示,因为我们将在之后立即重新配置。

为了访问我们需要的一些额外提示,我们将在安装后重新配置包。

1sudo dpkg-reconfigure slapd

适当地回答提示,使用下面的信息作为起点:

  • Omit OpenLDAP 服务器配置 ? ** 否** (我们需要初始数据库和配置)
  • DNS域名:QQexample.com`** (使用服务器域名,减去主机名. 这将用来创建信息树的基础条目)
  • 组织名称:实例公司 (此内容将简单地作为您的组织名称添加到基本条目) *管理员密码:[随你便]
  • 确认密码:[必须符合上
  • 使用的数据库后端:HDB (在两个选择中,这个功能最大)
  • 联合国 你想在被打掉后删除数据库吗? (你的选择) 选择 允许完全清除, 选择 保存您的数据, 即使软件被删除)
  • 移动旧数据库? ** 对**
  • 允许LDAPv2协议吗? ** 编号**

安装 SSL 组件

一旦您的 OpenLDAP 服务器已配置,我们可以继续安装我们将使用的包来加密我们的连接. Ubuntu OpenLDAP 包是针对 GnuTLS SSL 库编译的,所以我们将使用 GnuTLS 来生成我们的 SSL 凭证:

1sudo apt-get install gnutls-bin ssl-cert

安装了所有工具,我们可以开始创建加密连接所需的证书和密钥。

创建证书模板

为了加密我们的连接,我们需要配置证书权威并使用它来签署我们基础设施中的LDAP服务器(s)的密钥,因此,对于我们单一的服务器设置,我们需要两组密钥/证书对:一个用于证书权威本身,一个与LDAP服务相关联。

为了创建代表这些实体所需的证书,我们将创建一些模板文件,这些文件将包含certtool实用程序所需的信息,以创建具有相应属性的证书。

开始创建一个目录来存储模板文件:

1sudo mkdir /etc/ssl/templates

创建 CA 模板

首先创建证书权限的模板,我们将称呼该文件为 ca_server.conf. 在文本编辑器中创建并打开该文件:

1sudo nano /etc/ssl/templates/ca_server.conf

我们只需要提供几个信息才能成功创建证书授权机构. 我们需要通过添加ca选项来指定证书将是CA(证书授权机构)的。我们还需要cert_signing_key选项来赋予生成的证书签署额外的证书的能力。我们可以将cn设置为我们想要的证书授权机构的任何描述名称:

1[label caserver.conf]
2cn = LDAP Server CA
3ca
4cert_signing_key

保存并关闭文件。

创建LDAP服务模板

接下来,我们可以为我们的LDAP服务器证书创建一个模板,名为ldap_server.conf

1sudo nano /etc/ssl/templates/ldap_server.conf

在这里,我们将提供一些不同的信息,我们将提供我们组织的名称,并设置tls_www_server,encryption_keysigning_key选项,以便我们的Cert具有所需的基本功能。

本模板中的cn必须与 LDAP 服务器的 FQDN 匹配. 如果这个值不匹配,客户端将拒绝服务器的证书。

1[label ldapserver.conf]
2organization = "Example Inc"
3cn = ldap.example.com
4tls_www_server
5encryption_key
6signing_key
7expiration_days = 3652

保存并关闭文件,当你完成。

创建 CA 密钥和证书

现在我们有我们的模板,我们可以创建我们的两个密钥 / 证书对。

使用certtool实用程序生成私钥。/etc/ssl/private目录受到非 root 用户的保护,是我们将生成私钥的适当位置。我们可以生成私钥,并在该目录中写入名为ca_server.key的文件,键入:

1sudo certtool -p --outfile /etc/ssl/private/ca_server.key

现在,我们可以使用我们刚刚生成的私钥和我们在上一节中创建的模板文件来创建证书权威证书,我们将将此写入名为ca_server.pem/etc/ssl/certs目录中的文件:

1sudo certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem

我们现在有私钥和证书对我们的证书授权机构. 我们可以使用它来签署将用于实际加密LDAP会话的密钥。

创建LDAP服务密钥和证书

接下来,我们需要为我们的LDAP服务器生成一个私钥,我们将再次将生成的密钥放入/etc/ssl/private目录,以安全性为目的,并将文件称为ldap_server.key以澄清。

我们可以通过键入生成相应的密钥:

1sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key

一旦我们有 LDAP 服务器的私钥,我们将有所需的一切来生成服务器的证书,我们将需要拉进我们迄今为止创建的几乎所有组件(CA 证书和密钥,LDAP 服务器密钥和LDAP 服务器模板)。

我们将将证书放入/etc/ssl/certs目录,并命名为ldap_server.pem

1sudo certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem

向 LDAP 服务器密钥提供 OpenLDAP 访问

我们现在拥有我们需要的所有证书和密钥,但目前我们的OpenLDAP流程将无法访问它自己的密钥。

一个名为ssl-cert的组已经存在,作为/etc/ssl/private目录的组所有者,我们可以将我们的OpenLDAP流程运行在下面的用户(openldap)添加到这个组:

1sudo usermod -aG ssl-cert openldap

现在,我们的OpenLDAP用户可以访问目录,我们仍然需要给这个群组所有权的ldap_server.key文件,所以我们可以允许读取访问。

1sudo chown :ssl-cert /etc/ssl/private/ldap_server.key

现在,给ssl-cert读取组访问该文件:

1sudo chmod 640 /etc/ssl/private/ldap_server.key

我们的OpenSSL流程现在可以正确访问关键文件。

配置 OpenLDAP 以使用证书和密钥

我们有我们的文件,并正确配置了对组件的访问。现在,我们需要修改我们的OpenLDAP配置以使用我们创建的文件。

移动到您的主目录并打开一个名为addcerts.ldif的文件,我们将我们的配置更改放入此文件:

1cd ~
2nano addcerts.ldif

要进行配置更改,我们需要针对 DIT 配置的 cn=config 条目,我们需要指定我们想要修改条目的属性,然后我们需要添加 olcTLSCACertificateFileolcCertificateFileolcCertificateKeyFile 条目,并将其设置为正确的文件位置。

最终的结果将是这样的:

 1[label addcerts.ldif]
 2dn: cn=config
 3changetype: modify
 4add: olcTLSCACertificateFile
 5olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
 6-
 7add: olcTLSCertificateFile
 8olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
 9-
10add: olcTLSCertificateKeyFile
11olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key

完成后保存并关闭文件. 使用ldapmodify命令将更改应用于您的 OpenLDAP 系统:

1sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif

我们可以重新加载 OpenLDAP 来应用这些更改:

1sudo service slapd force-reload

我们的客户现在可以通过使用STARTTLS来通过传统的ldap://端口加密他们与服务器的连接。

设置客户端机器

为了连接到 LDAP 服务器并启动 STARTTLS 升级,客户端必须可以访问证书授权证书并要求升级。

在 OpenLDAP 服务器上

如果您正在从服务器本身与 OpenLDAP 服务器进行交互,则可以通过复制 CA 证书并调整客户端配置文件来设置客户端实用程序。

首先,将 CA 证书从 /etc/ssl/certs’ 目录复制到 /etc/ldap’ 目录中的文件中,我们将此文件命名为 ca_certs.pem. 此文件可用于存储此机器上的客户可能希望访问的所有 CA 证书。

1sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

现在,我们可以调整 OpenLDAP 实用程序的整个系统配置文件。在文本编辑器中打开配置文件,使用sudo特权:

1sudo nano /etc/ldap/ldap.conf

调整 TLS_CACERT 选项的值,以指向我们刚刚创建的文件:

1[label /etc/ldap/ldap.conf]
2. . .
3
4TLS_CACERT /etc/ldap/ca_certs.pem
5
6. . .

保存并关闭文件。

您现在应该能够通过使用 OpenLDAP 实用程序的 -Z 选项来升级您的连接以使用 STARTTLS。

1ldapwhoami -H ldap:// -x -ZZ

这迫使一个STARTTLS升级. 如果这是成功的,你应该看到:

1[label STARTTLS success]
2anonymous

如果您错误配置了某些东西,您可能会看到这样的错误:

1[label STARTTLS failure]
2ldap_start_tls: Connect error (-11)
3    additional info: (unknown error code)

配置远程客户端

如果您从远程服务器连接到您的 OpenLDAP 服务器,则需要完成类似的过程. 首先,您必须将 CA 证书复制到客户端机器。

向客户端传递SSH密钥

如果您使用 SSH 密钥连接到 OpenLDAP 服务器,并且您的客户端机也是远程的,则需要将它们添加到代理人中,并在连接到客户端机时传输。

要做到这一点,在本地机器上,通过键入开始 SSH 代理:

1eval $(ssh-agent)

将您的 SSH 密钥添加到代理人中,键入:

1ssh-add

现在,当您连接到 LDAP 客户端机时,您可以通过添加-A标志来转发 SSH 密钥:

1ssh -A user@ldap_client

复制 CA 证书

一旦连接到 OpenLDAP 客户端,您可以通过键入来复制 CA 证书:

1scp [email protected]:/etc/ssl/certs/ca_server.pem ~/

现在,将复制的证书附加到客户端知道的 CA 证书列表中,如果已存在,则将该证书附加到文件中,如果没有,则将创建该文件:

1cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem

调整客户端配置

接下来,我们可以调整 LDAP 实用程序的全球配置文件,以指向我们的 ca_certs.pem 文件。

1sudo nano /etc/ldap/ldap.conf

查找TLS_CACERT选项并将其设置为ca_certs.pem文件:

1[label /etc/ldap/ldap.conf]
2. . .
3
4TLS_CACERT /etc/ldap/ca_certs.pem
5
6. . .

保存并关闭文件,当你完成。

测试STARTTLS升级,键入以下内容:

1ldapwhoami -H ldap://ldap.example.com -x -ZZ

如果 STARTTLS 升级成功,您应该看到:

1[label STARTTLS success]
2anonymous

强制连接使用 TLS(可选)

我们已经成功配置了我们的OpenLDAP服务器,以便通过STARTTLS流程无缝地升级正常的LDAP连接到TLS,但这仍然允许未加密的会话,这可能不是你想要的。

如果您希望强制执行每个连接的STARTTLS升级,您可以调整服务器的设置,我们只会将此要求应用于常规DIT,而不是在cn=config入口下方可访问的DIT配置。

首先,您需要找到适当的输入来修改。我们将打印一份列表,列出OpenLDAP服务器有信息的所有DIT(目录信息树:LDAP服务器处理的输入等级),以及配置每个DIT的输入。

在您的 OpenLDAP 服务器上,键入:

1sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix

答案应该看起来像这样:

1[label DITs Served by OpenLDAP]
2dn: olcDatabase={1}hdb,cn=config
3olcSuffix: dc=example,dc=com

如果您的服务器配置为处理多个 DIT,您可能有多个 DIT 和数据库对,在这里,我们有一个单一的 DIT 与 dc=example,dc=com 的基本输入,这将是为 example.com 域创建的输入。

我们将使用 LDIF 文件进行更改,在您的主目录中创建 LDIF 文件,我们将其命名为 forcetls.ldif:

1nano ~/forcetls.ldif

在我们的情况下,这将是 dn:olcDatabase={1}hdb,cn=config. 我们将设置 changetype修改并添加 `olcSecurity’ 属性。

1[label forcetls.ldif]
2dn: olcDatabase={1}hdb,cn=config
3changetype: modify
4add: olcSecurity
5olcSecurity: tls=1

保存并关闭文件,当你完成。

要应用变更,类型:

1sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif

通过键入重新加载 OpenLDAP 服务:

1sudo service slapd force-reload

现在,如果您搜索dc=example,dc=com DIT,如果您不使用-Z选项来启动STARTTLS升级,则将被拒绝:

1ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
1[label TLS required failure]
2Confidentiality required (13)
3Additional information: TLS confidentiality required

我们可以证明 STARTTLS 连接仍然正常运作:

1ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
1[label TLS required success]
2dn: dc=example,dc=com
3
4dn: cn=admin,dc=example,dc=com

结论

您现在应该有一个使用 STARTTLS 加密配置的 OpenLDAP 服务器。使用 TLS 加密您的连接到 OpenLDAP 服务器,可以验证您正在连接的服务器的身份。

Published At
Categories with 技术
comments powered by Disqus