如何加密的OpenLDAP连接使用STARTTLS

介绍

OpenLDAP提供了灵活和良好支持的LDAP目录服务。 然而,开箱即用的服务器本身通过未加密的网络连接进行通信。 在本指南中,我们将演示如何使用STARTTLS加密与OpenLDAP的连接,以将常规连接升级到TLS。 我们将使用Ubuntu 14.04作为我们的LDAP服务器。

先决条件

在您开始使用本指南,您应该有一个非root用户sudo设置您的服务器上。 要设置此类型的用户,按照我们的Ubuntu 14.04的初始设置指南

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

通过SSL的LDAP与使用STARTTLS的LDAP

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

传统上,需要被加密的LDAP连接一个独立的端口上进行处理,通常是636 整个连接将使用SSL / TLS包装。 这个过程称为SSL上的LDAP,使用ldaps://协议。 此加密方法现已废弃。

STARTTLS是一种替代方法,现在是加密LDAP连接的首选方法。 STARTTLS通过在连接过程中/之后使用SSL / TLS将其加以包装,从而“升级”非加密连接。 这允许未加密和加密的连接由同一端口处理。 本指南将使用STARTTLS来加密连接。

设置主机名和FQDN

在开始之前,我们应该设置服务器,以便正确解析其主机名和完全限定域名(FQDN)。 这是必要的,以便我们的证书由客户端验证。 我们假设我们的LDAP服务器将一台机器上托管与的FQDN ldap.example.com

要设置主机中的所有服务器上的相关地方,使用hostnamectl命令和set-hostname选项。 将主机名设置为短主机名(不包括域名组件):

sudo hostnamectl set-hostname ldap

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

sudo nano /etc/hosts

找到映射行127.0.1.1 IP地址。 将IP地址后的第一个字段更改为服务器的FQDN,将第二个字段更改为短主机名。 对于我们的例子,它看起来像这样:

/ etc / hosts
. . .

127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost

. . .

保存并在完成后关闭文件。

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

hostname

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

短主机名
ldap

键入以下命令检查FQDN:

hostname -f

这应该返回FQDN:

FQDN设置
ldap.example.com

安装LDAP服务器和GnuTLS软件

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

安装OpenLDAP服务器

如果你还没有安装OpenLDAP,现在是解决这个问题的时候了。 更新服务器的本地软件包索引并通过键入以下内容安装软件:

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

系统将要求您提供LDAP管理密码。 随意跳过提示,因为我们将立即重新配置。

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

sudo dpkg-reconfigure slapd

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

  • 省略OpenLDAP服务器配置? (我们想要的原始数据库和配置)
  • DNS域名: example.com (使用服务器的域名,再减去主机这将被用于创建信息树的基本条目。)
  • 机构名称: 示例公司 (这只会被添加到基本条目为您的组织的名称)
  • 管理员密码:[任何你想要的]
  • 确认密码:[必须与上述相符]
  • 后端数据库的使用方法:HDB(出了两种选择,这有最多的功能)
  • 您是否希望在清除slapd时删除数据库? (您的选择,选择“是”允许完全干净的删除,选择“否”即使在删除软件时保存您的数据)
  • 将旧的数据库吗
  • 允许的LDAPv2协议?

安装SSL组件

一旦配置了OpenLDAP服务器,我们就可以安装我们用来加密我们的连接的包。 Ubuntu OpenLDAP包是针对GnuTLS SSL库编译的,因此我们将使用GnuTLS来生成我们的SSL凭证:

sudo apt-get install gnutls-bin ssl-cert

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

创建证书模板

要加密我们的连接,我们需要配置一个证书颁发机构,并使用它来为我们的基础架构中的LDAP服务器签署密钥。 因此,对于我们的单服务器设置,我们将需要两组密钥/证书对:一个用于证书颁发机构本身,另一个用于与LDAP服务关联。

要创建表示这些实体所需的证书,我们将创建一些模板文件。 这些将包含的信息是, certtool工具,以创建具有适当的属性证书需要。

首先创建一个目录来存储模板文件:

sudo mkdir /etc/ssl/templates

创建CA模板

首先为证书颁发机构创建模板。 我们将调用文件ca_server.conf 在文本编辑器中创建并打开文件:

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

我们只需要提供几个信息,以便成功创建证书颁发机构。 我们需要通过添加指定的证书将是一个CA(证书授权机构) ca选项。 我们还需要cert_signing_key选项给生成的证书签署其他证书的能力。 我们可以设置cn任何描述性的名称,我们希望我们的证书颁发机构:

caserver.conf
cn = LDAP Server CA
ca
cert_signing_key

保存并关闭文件。

创建LDAP服务模板

接下来,我们可以为我们的所谓的LDAP服务器证书的模板ldap_server.conf 创建和使用您的文本编辑器打开文件sudo特权:

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

在这里,我们将提供几个不同的信息。 我们将提供我们的组织的名称,并设置tls_www_serverencryption_keysigning_key选项,使我们的证书有它需要的基本功能。

cn此模板必须在LDAP服务器的FQDN相匹配。 如果此值不匹配,则客户端将拒绝服务器的证书。 我们还将设置证书的到期日期。 我们将创建一个10年的证书,以避免管理频繁更新:

ldapserver.conf
organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652

保存并在完成后关闭文件。

创建CA密钥和证书

现在我们有了我们的模板,我们可以创建我们的两个密钥/证书对。 我们需要首先创建证书颁发机构的集合。

使用certtool效用来生成专用密钥。 /etc/ssl/private目录是由非root用户的保护,并适当的位置来放置私钥我们将生成。 我们可以生成私钥并将其写入一个文件称为ca_server.key本名录中由内键入:

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

现在,我们可以使用我们刚刚生成的私钥和我们在上一部分创建的模板文件来创建证书颁发机构证书。 我们将写在一个文件中/etc/ssl/certs称为目录ca_server.pem

sudo 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的清晰度。

我们可以通过键入以下内容生成相应的键:

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

一旦我们拥有LDAP服务器的私钥,我们就拥有为服务器生成证书所需的一切。 我们将需要引入到目前为止所创建的几乎所有组件(CA证书和密钥,LDAP服务器密钥和LDAP服务器模板)。

我们将把证书中/etc/ssl/certs目录并将其命名为ldap_server.pem 我们需要的命令是:

sudo 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

给OpenLDAP访问LDAP服务器密钥

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

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

sudo usermod -aG ssl-cert openldap

现在,我们的OpenLDAP用户可以访问该目录。 我们仍然需要给该组的所有权ldap_server.key文件,但这样我们就可以让读取访问。 ssl-cert上通过键入文件组的所有权:

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

现在,给ssl-cert组对文件的读取权限:

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

我们的OpenSSL进程现在可以正确访问密钥文件。

配置OpenLDAP以使用证书和密钥

我们有我们的文件,并正确配置了对组件的访问。 现在,我们需要修改我们的OpenLDAP配置以使用我们所做的文件。 我们将通过创建包含我们的配置更改的LDIF文件并将其加载到我们的LDAP实例中来实现。

移动到你的主目录,并打开一个名为addcerts.ldif 我们将在这个文件中进行配置更改:

cd ~
nano addcerts.ldif

要更改配置,我们需要针对cn=config的配置DIT的条目。 我们需要指定我们想要修改条目的属性。 后来,我们需要添加olcTLSCACertificateFileolcCertificateFileolcCertificateKeyFile它们的属性和设置正确的文件位置。

最终结果将如下所示:

addcerts.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key

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

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

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

sudo service slapd force-reload

我们的客户现在可以自己加密的连接到服务器比传统ldap://使用STARTTLS端口。

设置客户端计算机

为了连接到LDAP服务器并启动STARTTLS升级,客户端必须具有对证书颁发机构证书的访问权限,并且必须请求升级。

在OpenLDAP服务器上

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

首先,从复制CA证书/etc/ssl/certs目录到内的文件/etc/ldap目录中。 我们称这个文件ca_certs.pem 此文件可用于存储此计算机上的客户端可能希望访问的所有CA证书。 为了我们的目的,这将只包含单个证书:

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

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

sudo nano /etc/ldap/ldap.conf

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

/etc/ldap/ldap.conf
. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

保存并关闭文件。

您现在应该可以升级您的连接通过将使用STARTTLS -Z使用OpenLDAP的实用程序时的选项。 您可以通过传递两次来强制STARTTLS升级。 通过键入以下内容进行测试:

ldapwhoami -H ldap:// -x -ZZ

这将强制STARTTLS升级。 如果这是成功的,你应该看到:

STARTTLS成功
anonymous

如果您配置错误,您可能会看到类似如下的错误:

STARTTLS故障
ldap_start_tls: Connect error (-11)
    additional info: (unknown error code)

配置远程客户端

如果从远程服务器连接到OpenLDAP服务器,则需要完成类似的过程。 首先,您必须将CA证书复制到客户端计算机。 你可以用轻松地做到这一点scp实用程序。

将SSH密钥转发到客户端

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

为此,在本地计算机上,通过键入以下命令启动SSH代理:

eval $(ssh-agent)

通过键入以下内容将SSH密钥添加到代理:

ssh-add

现在,当你加入连接到您的LDAP客户端机器,你可以转发您的SSH密钥-A标志:

ssh -A user@ldap_client

复制CA证书

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

scp user@ldap.example.com:/etc/ssl/certs/ca_server.pem ~/

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

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

调整客户端配置

接下来,我们可以调整LDAP实用程序的全局配置文件指向我们的ca_certs.pem文件。 打开文件sudo特权:

sudo nano /etc/ldap/ldap.conf

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

/etc/ldap/ldap.conf
. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

保存并在完成后关闭文件。

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

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

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

STARTTLS成功
anonymous

强制连接使用TLS(可选)

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

如果您希望为每个连接强制STARTTLS升级,您可以调整服务器的设置。 我们将只适用这一要求到正规的DIT,而不是访问下面的配置DIT cn=config项。

首先,需要找到适当的条目进行修改。 我们将打印OpenLDAP服务器有关信息的所有DIT(目录信息树:LDAP服务器处理的条目的层次结构)以及配置每个DIT的条目的列表。

在OpenLDAP服务器上,键入:

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

响应应该看起来像这样:

由OpenLDAP提供的DIT
dn: olcDatabase={1}hdb,cn=config
olcSuffix: dc=example,dc=com

如果服务器配置为处理多个DIT,则可能有更多的DIT和数据库对。 在这里,我们有一个的基本条目单DIT dc=example,dc=com ,这将是一个域创建的条目example.com 这DIT的配置由处理olcDatabase={1}hdb,cn=config项。 记下要强制加密的DIT的DN。

我们将使用LDIF文件进行更改。 在主目录中创建LDIF文件。 我们将其称之为forcetls.ldif

nano ~/forcetls.ldif

在内部,定位您要强制TLS的DN。 就我们而言,这将是dn: olcDatabase={1}hdb,cn=config 我们将设置changetype为“修改”,并添加olcSecurity属性。 将属性的值设置为“tls = 1”以强制TLS用于此DIT:

Forcetls.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1

保存并在完成后关闭文件。

要应用更改,请键入:

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

键入以下命令重新加载OpenLDAP服务:

sudo service slapd force-reload

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

ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
TLS需要失败
Confidentiality required (13)
Additional information: TLS confidentiality required

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

ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
TLS需要成功
dn: dc=example,dc=com

dn: cn=admin,dc=example,dc=com

结论

您现在应该有一个配置了STARTTLS加密的OpenLDAP服务器。 使用TLS加密与OpenLDAP服务器的连接允许您验证要连接的服务器的身份。 它还屏蔽来自中间方的流量。 当通过开放网络连接时,加密流量至关重要。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏