OpenLDAP提供了灵活和良好支持的LDAP目录服务。 然而,开箱即用的服务器本身通过未加密的网络连接进行通信。 在本指南中,我们将演示如何使用STARTTLS加密与OpenLDAP的连接,以将常规连接升级到TLS。我们将使用Ubuntu 14.04作为我们的LDAP服务器。
在您开始使用本指南,您应该有一个非root用户sudo
设置您的服务器上。 要设置此类型的用户,按照我们的Ubuntu 14.04的初始设置指南 。
我们将在本指南中介绍如何在Ubuntu 14.04服务器上安装OpenLDAP。 如果您已在服务器上安装OpenLDAP,则可以跳过相关的安装和配置步骤。
有两种方法使用SSL / TLS加密LDAP连接。
传统上,需要被加密的LDAP连接一个独立的端口上进行处理,通常是636
。 整个连接将使用SSL / TLS包装。 这个过程称为SSL上的LDAP,使用ldaps://
协议。 此加密方法现已废弃。
STARTTLS是一种替代方法,现在是加密LDAP连接的首选方法。 STARTTLS通过在连接过程中/之后使用SSL / TLS将其加以包装,从而“升级”非加密连接。 这允许未加密和加密的连接由同一端口处理。 本指南将使用STARTTLS来加密连接。
在开始之前,我们应该设置服务器,以便正确解析其主机名和完全限定域名(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,将第二个字段更改为短主机名。 对于我们的例子,它看起来像这样:
. . .
127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost
. . .
保存并在完成后关闭文件。
您可以通过键入以下内容来检查是否正确配置了这些值:
hostname
这应该返回你的短主机名:
ldap
键入以下命令检查FQDN:
hostname -f
这应该返回FQDN:
ldap.example.com
确保您的主机名设置正确后,我们可以安装我们需要的软件。 如果您已经安装并配置了OpenLDAP,则可以跳过第一个子部分。
如果你还没有安装OpenLDAP,现在是解决这个问题的时候了。 更新服务器的本地软件包索引并通过键入以下内容安装软件:
sudo apt-get update
sudo apt-get install slapd ldap-utils
系统将要求您提供LDAP管理密码。 随意跳过提示,因为我们将立即重新配置。
为了访问我们需要的一些额外的提示,我们将在安装后重新配置包。 为此,请键入:
sudo dpkg-reconfigure slapd
使用以下信息作为起点,适当回答提示:
example.com
(使用服务器的域名,再减去主机这将被用于创建信息树的基本条目。)一旦配置了OpenLDAP服务器,我们就可以安装我们用来加密我们的连接的包。 Ubuntu OpenLDAP包是针对GnuTLS SSL库编译的,因此我们将使用GnuTLS来生成我们的SSL凭证:
sudo apt-get install gnutls-bin ssl-cert
在安装了所有工具后,我们可以开始创建加密我们的连接所需的证书和密钥。
要加密我们的连接,我们需要配置一个证书颁发机构,并使用它来为我们的基础架构中的LDAP服务器签署密钥。 因此,对于我们的单服务器设置,我们将需要两组密钥/证书对:一个用于证书颁发机构本身,另一个用于与LDAP服务关联。
要创建表示这些实体所需的证书,我们将创建一些模板文件。 这些将包含的信息是, certtool
工具,以创建具有适当的属性证书需要。
首先创建一个目录来存储模板文件:
sudo mkdir /etc/ssl/templates
首先为证书颁发机构创建模板。 我们将调用文件ca_server.conf
。 在文本编辑器中创建并打开文件:
sudo nano /etc/ssl/templates/ca_server.conf
我们只需要提供几个信息,以便成功创建证书颁发机构。 我们需要通过添加指定的证书将是一个CA(证书授权机构) ca
选项。 我们还需要cert_signing_key
选项给生成的证书签署其他证书的能力。 我们可以设置cn
任何描述性的名称,我们希望我们的证书颁发机构:
cn = LDAP Server CA
ca
cert_signing_key
保存并关闭文件。
接下来,我们可以为我们的所谓的LDAP服务器证书的模板ldap_server.conf
。 创建和使用您的文本编辑器打开文件sudo
特权:
sudo nano /etc/ssl/templates/ldap_server.conf
在这里,我们将提供几个不同的信息。 我们将提供我们的组织的名称,并设置tls_www_server
, encryption_key
和signing_key
选项,使我们的证书有它需要的基本功能。
该cn
此模板必须在LDAP服务器的FQDN相匹配。 如果此值不匹配,则客户端将拒绝服务器的证书。 我们还将设置证书的到期日期。 我们将创建一个10年的证书,以避免管理频繁更新:
organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652
保存并在完成后关闭文件。
现在我们有了我们的模板,我们可以创建我们的两个密钥/证书对。 我们需要首先创建证书颁发机构的集合。
使用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服务器生成一个私钥。 我们将再次把生成的密钥中/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进程将无法访问自己的密钥。
一组名为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配置以使用我们所做的文件。 我们将通过创建包含我们的配置更改的LDIF文件并将其加载到我们的LDAP实例中来实现。
移动到你的主目录,并打开一个名为addcerts.ldif
。 我们将在这个文件中进行配置更改:
cd ~
nano addcerts.ldif
要更改配置,我们需要针对cn=config
的配置DIT的条目。 我们需要指定我们想要修改条目的属性。 后来,我们需要添加olcTLSCACertificateFile
, olcCertificateFile
和olcCertificateKeyFile
它们的属性和设置正确的文件位置。
最终结果将如下所示:
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服务器交互,您可以通过复制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
选项指向我们刚刚创建的文件:
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
保存并关闭文件。
您现在应该可以升级您的连接通过将使用STARTTLS -Z
使用OpenLDAP的实用程序时的选项。 您可以通过传递两次来强制STARTTLS升级。 通过键入以下内容进行测试:
ldapwhoami -H ldap:// -x -ZZ
这将强制STARTTLS升级。 如果这是成功的,你应该看到:
anonymous
如果您配置错误,您可能会看到类似如下的错误:
ldap_start_tls: Connect error (-11)
additional info: (unknown error code)
如果从远程服务器连接到OpenLDAP服务器,则需要完成类似的过程。 首先,您必须将CA证书复制到客户端计算机。 你可以用轻松地做到这一点scp
实用程序。
如果使用SSH密钥连接到OpenLDAP服务器,并且客户端计算机也是远程的,则需要将它们添加到代理,并在连接到客户端计算机时转发它们。
为此,在本地计算机上,通过键入以下命令启动SSH代理:
eval $(ssh-agent)
通过键入以下内容将SSH密钥添加到代理:
ssh-add
现在,当你加入连接到您的LDAP客户端机器,你可以转发您的SSH密钥-A
标志:
ssh -A user@ldap_client
一旦连接到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
文件:
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
保存并在完成后关闭文件。
键入以下内容来测试STARTTLS升级:
ldapwhoami -H ldap://ldap.example.com -x -ZZ
如果STARTTLS升级成功,您应该会看到:
anonymous
我们已成功配置了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
响应应该看起来像这样:
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:
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
Confidentiality required (13)
Additional information: TLS confidentiality required
我们可以证明STARTTLS连接仍然正常工作:
ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
dn: dc=example,dc=com
dn: cn=admin,dc=example,dc=com
您现在应该有一个配置了STARTTLS加密的OpenLDAP服务器。 使用TLS加密与OpenLDAP服务器的连接允许您验证要连接的服务器的身份。 它还屏蔽来自中间方的流量。 当通过开放网络连接时,加密流量至关重要。