如何在Ubuntu16.04上安装和配置OpenLDAP和phpLDAPadmin
介绍
轻量级目录访问协议 (LDAP) 是一种标准协议,旨在通过网络管理和访问分层目录信息。 它可用于存储任何类型的信息,但它最常用作集中式身份验证系统或用于公司电子邮件和电话目录。
在本指南中,我们将讨论如何在 Ubuntu 16.04 上安装和配置 OpenLDAP 服务器。 然后我们将安装 phpLDAPadmin,这是一个用于查看和操作 LDAP 信息的 Web 界面。 我们将使用来自 Let's Encrypt 的 SSL 证书保护 Web 界面和 LDAP 服务,Let's Encrypt 是免费和自动证书的提供商。
先决条件
在开始本教程之前,您应该有一个使用 Apache 和 PHP 设置的 Ubuntu 16.04 服务器。 您可以按照我们的教程 如何在 Ubuntu 16.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈,跳过第 2 步,因为我们不需要 MySQL 数据库服务器。
此外,由于我们将在 Web 界面中输入密码,因此我们应该使用 SSL 加密来保护 Apache。 阅读 如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Apache 以下载和配置免费的 SSL 证书。 您将需要一个域名来完成此步骤。 我们也将使用这些相同的证书来提供安全的 LDAP 连接。
注意: Let's Encrypt 教程假设您的服务器可以访问公共互联网。 如果不是这种情况,您将不得不使用不同的证书提供商,或者您的组织自己的证书颁发机构。 无论哪种方式,您都应该能够以最少的更改完成本教程,主要是关于证书的路径或文件名。
第 1 步 — 安装和配置 LDAP 服务器
我们的第一步是安装 LDAP 服务器和一些相关的实用程序。 幸运的是,我们需要的软件包都可以在 Ubuntu 的默认存储库中找到。
登录到您的服务器。 由于这是我们在此会话中第一次使用 apt-get
,我们将刷新本地包索引,然后安装我们想要的包:
sudo apt-get update sudo apt-get install slapd ldap-utils
在安装过程中,系统会要求您选择并确认 LDAP 的管理员密码。 您可以在此处输入任何内容,因为您很快就有机会更新它。
即使我们刚刚安装了该软件包,我们仍将继续并重新配置它。 slapd
软件包可以询问很多重要的配置问题,但默认情况下在安装过程中会跳过它们。 我们通过告诉我们的系统重新配置包来访问所有提示:
sudo dpkg-reconfigure slapd
在这个过程中有很多新的问题需要回答。 我们将接受大部分默认设置。 让我们来看看这些问题:
- 省略 OpenLDAP 服务器配置? 否
- DNS域名? 此选项将确定目录路径的基本结构。 阅读消息以准确了解如何实施。 您实际上可以选择您想要的任何值,即使您不拥有实际域。 但是,本教程假设您有一个正确的服务器域名,因此您应该使用它。 我们将在整个教程中使用 example.com。
- 机构名称? 对于本指南,我们将使用示例作为我们组织的名称。 你可以选择任何你认为合适的东西。
- 管理员密码? 输入两次安全密码
- 数据库后端? MDB
- 清除 slapd 时删除数据库? 否
- 移动旧数据库? 是
- 允许 LDAPv2 协议? 否
此时,您的 LDAP 服务器已配置并正在运行。 打开防火墙上的 LDAP 端口,以便外部客户端可以连接:
sudo ufw allow ldap
让我们用 ldapwhoami
测试我们的 LDAP 连接,它应该返回我们连接的用户名:
ldapwhoami -H ldap:// -x
Outputanonymous
anonymous
是我们所期望的结果,因为我们在没有登录 LDAP 服务器的情况下运行了 ldapwhoami
。 这意味着服务器正在运行并回答查询。 接下来,我们将设置一个 Web 界面来管理 LDAP 数据。
第 2 步 — 安装和配置 phpLDAPadmin Web 界面
虽然很可能通过命令行管理 LDAP,但大多数用户会发现使用 Web 界面更容易。 我们将安装 phpLDAPadmin,这是一个提供此功能的 PHP 应用程序。
Ubuntu 存储库包含一个 phpLDAPadmin 包。 您可以使用 apt-get
安装它:
sudo apt-get install phpldapadmin
这将安装应用程序、启用必要的 Apache 配置并重新加载 Apache。
Web 服务器现在已配置为为应用程序提供服务,但我们需要进行一些额外的更改。 我们需要配置 phpLDAPadmin 以使用我们的域,并且不自动填充 LDAP 登录信息。
首先在文本编辑器中以 root 权限打开主配置文件:
sudo nano /etc/phpldapadmin/config.php
查找以 $servers->setValue('server','name'
开头的行。 在 nano
中,您可以通过键入 CTRL-W
,然后是字符串,然后是 ENTER
来搜索字符串。 您的光标将放置在正确的行上。
此行是 LDAP 服务器的显示名称,Web 界面将其用于有关服务器的标题和消息。 在此处选择任何合适的内容:
/etc/phpldapadmin/config.php
$servers->setValue('server','name','Example LDAP');
接下来,向下移动到 $servers->setValue('server','base'
行。 此配置告诉 phpLDAPadmin LDAP 层次结构的根是什么。 这是基于我们在重新配置 slapd
包时输入的值。 在我们的示例中,我们选择了 example.com
,我们需要通过将每个域组件(不是点)放入 dc=
表示法来将其转换为 LDAP 语法:
/etc/phpldapadmin/config.php
$servers->setValue('server','base', array('dc=example,dc=com'));
现在找到登录 bind_id
配置行,并在行首用 #
注释掉它:
/etc/phpldapadmin/config.php
#$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');
此选项在 Web 界面中预填充管理员登录详细信息。 如果我们的 phpLDAPadmin 页面是可公开访问的,那么这是我们不应该分享的信息。
我们需要调整的最后一件事是控制某些 phpLDAPadmin 警告消息的可见性的设置。 默认情况下,应用程序会显示很多关于模板文件的警告消息。 这些对我们当前对软件的使用没有影响。 我们可以通过搜索 hide_template_warning
参数、取消注释包含它的行并将其设置为 true 来隐藏它们:
/etc/phpldapadmin/config.php
$config->custom->appearance['hide_template_warning'] = true;
这是我们需要调整的最后一件事。 保存并关闭文件以完成。 我们不需要重新启动任何东西来使更改生效。
接下来我们将登录到 phpLDAPadmin。
第 3 步 — 登录 phpLDAPadmin Web 界面
对 phpLDAPadmin 进行了必要的配置更改后,我们现在可以开始使用它了。 在 Web 浏览器中导航到应用程序。 请务必将您的域替换为以下突出显示的区域:
https://example.com/phpldapadmin
phpLDAPadmin 登录页面将加载。 点击页面左侧菜单中的登录链接。 将显示一个登录表单:
Login DN 是您将使用的用户名。 它包含作为 cn=
部分的帐户名称,以及您为服务器选择的域名,如前面步骤中所述,分为 dc=
部分。 我们在安装过程中设置的默认管理员帐户称为 admin,因此对于我们的示例,我们将输入以下内容:
cn=admin,dc=example,dc=com
为您的域输入适当的字符串后,输入您在配置期间创建的管理员密码,然后单击 Authenticate 按钮。
您将被带到主界面:
此时,您已登录到 phpLDAPadmin 界面。 您可以添加用户、组织单位、组和关系。
LDAP 在您如何构建数据和目录层次结构方面非常灵活。 您可以创建您喜欢的任何类型的结构,还可以为它们的交互方式创建规则。
由于此过程在 Ubuntu 16.04 上与之前版本相同,因此您可以按照 Ubuntu 的 LDAP 安装文章的 添加组织单位、组和用户 部分中列出的步骤进行操作12.04。
这些步骤将在 phpLDAPadmin 的安装中运行良好,因此请继续练习使用该界面并学习如何构建数据。
现在我们已经登录并熟悉了 Web 界面,让我们花点时间为我们的 LDAP 服务器提供更高的安全性。
第 4 步 – 配置 StartTLS LDAP 加密
尽管我们已经加密了我们的 Web 界面,但外部 LDAP 客户端仍然连接到服务器并以纯文本形式传递信息。 让我们使用我们的 Let's Encrypt SSL 证书来为我们的 LDAP 服务器添加加密。
复制 Let's Encrypt 证书
因为 slapd
守护进程以 openldap 用户身份运行,并且 Let's Encrypt 证书只能由 root 用户读取,我们需要进行一些调整以允许slapd
访问证书。 我们将创建一个简短的脚本,将证书复制到 /etc/ssl/
,这是 SSL 证书和密钥的标准系统目录。 我们编写脚本来执行此操作,而不是手动输入命令的原因是,每当更新 Let's Encrypt 证书时,我们都需要自动重复此过程。 稍后我们将更新 certbot
cron 作业以启用此功能。
首先,为 shell 脚本打开一个新的文本文件:
sudo nano /usr/local/bin/renew.sh
这将打开一个空白文本文件。 粘贴以下脚本。 请务必更新 SITE=example.com
部分以反映您的 Let's Encrypt 证书的存储位置。 您可以通过使用 sudo ls /etc/letsencrypt/live
列出证书目录来找到正确的值。
/usr/local/bin/renew.sh
#!/bin/sh SITE=example.com # move to the correct let's encrypt directory cd /etc/letsencrypt/live/$SITE # copy the files cp cert.pem /etc/ssl/certs/$SITE.cert.pem cp fullchain.pem /etc/ssl/certs/$SITE.fullchain.pem cp privkey.pem /etc/ssl/private/$SITE.privkey.pem # adjust permissions of the private key chown :ssl-cert /etc/ssl/private/$SITE.privkey.pem chmod 640 /etc/ssl/private/$SITE.privkey.pem # restart slapd to load new certificates systemctl restart slapd
此脚本移动到 Let's Encrypt 证书目录,将文件复制到 /etc/ssl
,然后更新私钥的权限以使其可由系统的 ssl-cert 组读取。 它还会重新启动 slapd
,这将确保在从我们的 certbot
续订 cron 作业运行此脚本时加载新证书。
保存并关闭文件,然后使其可执行:
sudo chmod u+x /usr/local/bin/renew.sh
然后使用 sudo
运行脚本:
sudo /usr/local/bin/renew.sh
通过列出 /etc/ssl
中的新文件来验证脚本是否有效:
sudo su -c 'ls -al /etc/ssl/{certs,private}/example.com*'
上面的 sudo
命令与正常的有点不同。 su -c '. . .'
部分在执行之前将整个 ls
命令包装在 root shell 中。 如果我们不这样做,*
通配符文件名扩展将以您的非 sudo 用户的权限运行,并且它将失败,因为您的用户无法读取 /etc/ssl/private
。
ls
将打印三个文件的详细信息。 验证所有权和权限是否正确:
Output-rw-r--r-- 1 root root 1793 May 31 13:58 /etc/ssl/certs/example.com.cert.pem -rw-r--r-- 1 root root 3440 May 31 13:58 /etc/ssl/certs/example.com.fullchain.pem -rw-r----- 1 root ssl-cert 1704 May 31 13:58 /etc/ssl/private/example.com.privkey.pem
接下来,我们将使用 certbot
自动执行此操作。
更新 Certbot 更新 Cron 作业
我们需要更新我们的 certbot
cron 作业以在证书更新时运行此脚本:
sudo crontab -e
您应该已经有 certbot renew
行。 在下面添加突出显示的部分:
crontab
15 3 * * * /usr/bin/certbot renew --quiet --renew-hook /usr/local/bin/renew.sh
保存并关闭 crontab。 现在,每当 certbot
更新证书时,我们的脚本将运行以复制文件、调整权限并重新启动 slapd
服务器。
配置 slapd 以提供安全连接
我们需要将 openldap 用户添加到 ssl-cert 组,以便 slapd
可以读取私钥:
sudo usermod -aG ssl-cert openldap
重新启动 slapd
以获取新组:
sudo systemctl restart slapd
最后,我们需要配置 slapd
来实际使用这些证书和密钥。 为此,我们将所有配置更改放入 LDIF 文件(代表 LDAP 数据交换格式)中,然后使用 ldapmodify
命令将更改加载到我们的 LDAP 服务器中。
打开一个新的 LDIF 文件:
cd ~ nano ssl.ldif
这将打开一个空白文件。 将以下内容粘贴到文件中,更新文件名以反映您的域:
ssl.ldif
dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/example.com.fullchain.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/example.com.cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/example.com.privkey.pem
保存并关闭文件,然后使用 ldapmodify
应用更改:
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f ssl.ldif
OutputSASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config"
我们不需要重新加载 slapd
来加载新证书,这在我们使用 ldapmodify
更新配置时自动发生。 再运行一次ldapwhoami
命令,进行验证。 这次我们需要使用正确的主机名并添加 -ZZ
选项来强制安全连接:
ldapwhoami -H ldap://example.com -x -ZZ
使用安全连接时我们需要完整的主机名,因为客户端将检查以确保主机名与证书上的主机名匹配。 这可以防止中间人攻击,攻击者可以拦截您的连接并冒充您的服务器。
ldapwhoami
命令应该返回 anonymous
,没有错误。 我们已经成功地加密了我们的 LDAP 连接。
结论
在本教程中,我们安装并配置了 OpenLDAP slapd
服务器和 LDAP Web 界面 phpLDAPadmin。 我们还在两台服务器上设置了加密,并更新了 certbot
以自动处理 slapd
的 Let's Encrypt 证书更新过程。
我们建立的系统非常灵活,您将能够设计自己的组织架构并根据需要管理资源组。 有关管理 LDAP 的更多信息,包括更多命令行工具和技术,请阅读我们的教程 如何使用 OpenLDAP 实用程序管理和使用 LDAP 服务器。 有关保护 LDAP 服务器的更深入信息,包括如何强制所有客户端使用安全连接,请阅读 如何使用 STARTTLS 加密 OpenLDAP 连接。