在Ubuntu 16.04上安装和配置OpenLDAP和phpLDAPadmin的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介

轻量目录访问协议(LDAP)是一种标准协议,旨在通过网络管理和访问分层目录信息。它可以用来存储任何类型的信息,尽管它最常用作集中式身份验证系统或企业电子邮件和电话目录。

在本指南中,我们将讨论如何在 Ubuntu 16.04 上安装和配置 OpenLDAP 服务器。然后,我们将安装 phpLDAPadmin,这是一个用于查看和操作 LDAP 信息的 Web 界面。我们将使用来自 Let's Encrypt 的 SSL 证书来保护 Web 界面和 LDAP 服务,Let's Encrypt 是一个提供免费自动证书的服务提供商。

先决条件

在开始本教程之前,您应该已经在 Ubuntu 16.04 服务器上安装了 Apache 和 PHP。您可以按照我们的教程《如何在 Ubuntu 16.04 上安装 Linux、Apache、MySQL、PHP(LAMP)堆栈》,跳过第 2 步,因为我们不需要 MySQL 数据库服务器。

另外,由于我们将在 Web 界面中输入密码,我们应该使用 SSL 加密来保护 Apache。请阅读《如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Apache》以下载和配置免费 SSL 证书。您需要一个域名来完成此步骤。我们将使用这些相同的证书来提供安全的 LDAP 连接。

步骤 1 --- 安装和配置 LDAP 服务器

我们的第一步是安装 LDAP 服务器和一些相关的实用程序。幸运的是,我们需要的软件包都可以在 Ubuntu 的默认软件库中找到。

登录到您的服务器。由于这是我们在本次会话中第一次使用 apt-get,我们将刷新本地软件包索引,然后安装我们需要的软件包:

command 复制代码
sudo apt-get update
sudo apt-get install slapd ldap-utils

在安装过程中,您将被要求选择并确认 LDAP 的管理员密码。您可以在这里输入任何内容,因为您将有机会稍后更新它。

尽管我们刚刚安装了软件包,但我们将立即重新配置它。slapd 软件包有能力询问许多重要的配置问题,但默认情况下在安装过程中会跳过这些问题。我们通过告诉系统重新配置软件包来获得所有提示:

command 复制代码
sudo dpkg-reconfigure slapd

在此过程中有相当多的新问题需要回答。我们将接受大多数默认值。让我们回答这些问题:

  • 忽略 OpenLDAP 服务器配置?选择 No
  • DNS 域名?
    • 此选项将确定您的目录路径的基本结构。阅读消息以了解这将如何实施。实际上,您可以选择任何值,即使您并不拥有实际的域名。但是,本教程假定您为服务器拥有适当的域名,因此您应该使用该域名。在整个教程中,我们将使用 example.com
  • 组织名称?
    • 对于本指南,我们将使用 example 作为我们组织的名称。您可以选择任何您认为合适的名称。
  • 管理员密码?输入两次安全密码
  • 数据库后端?选择 MDB
  • 在清除 slapd 时删除数据库?选择 No
  • 移动旧数据库?选择 Yes
  • 允许 LDAPv2 协议?选择 No

此时,您的 LDAP 服务器已配置并正在运行。打开防火墙上的 LDAP 端口,以便外部客户端可以连接:

command 复制代码
sudo ufw allow ldap

让我们使用 ldapwhoami 测试我们的 LDAP 连接,它应该返回我们连接的用户名:

command 复制代码
ldapwhoami -H ldap:// -x
复制代码
anonymous

anonymous 是我们期望的结果,因为我们在未登录到 LDAP 服务器的情况下运行了 ldapwhoami。这意味着服务器正在运行并且正在响应查询。接下来,我们将设置一个 Web 界面来管理 LDAP 数据。

步骤 2 --- 安装和配置 phpLDAPadmin Web 界面

虽然通过命令行管理 LDAP 是非常可能的,但大多数用户会发现使用 Web 界面更容易。我们将安装 phpLDAPadmin,这是一个提供此功能的 PHP 应用程序。

Ubuntu 软件库包含一个 phpLDAPadmin 软件包。您可以使用 apt-get 安装它:

command 复制代码
sudo apt-get install phpldapadmin

这将安装应用程序,启用必要的 Apache 配置,并重新加载 Apache。

Web 服务器现在已配置为提供应用程序,但我们需要进行一些额外的更改。我们需要配置 phpLDAPadmin 来使用我们的域,并且不自动填充 LDAP 登录信息。

首先,使用 root 权限在文本编辑器中打开主配置文件:

command 复制代码
sudo nano /etc/phpldapadmin/config.php

查找以 $servers->setValue('server','name' 开头的行。在 nano 中,您可以通过输入 CTRL-W,然后输入字符串,然后按 ENTER 来搜索字符串。您的光标将被放置在正确的行上。

这一行是您的 LDAP 服务器的显示名称,Web 界面将使用它来显示关于服务器的标题和消息。在此处选择任何合适的内容:

复制代码
$servers->setValue('server','name','Example LDAP');

接下来,移动到 $servers->setValue('server','base' 行。此配置告诉 phpLDAPadmin LDAP 层次结构的根是什么。这是基于我们在重新配置 slapd 软件包时输入的值。在我们的示例中,我们选择了 example.com,我们需要将其转换为 LDAP 语法,将每个域组件(除了点之外的所有内容)放入 dc= 表示法中:

复制代码
$servers->setValue('server','base', array('dc=example,dc=com'));

现在找到登录 bind_id 配置行,并在行的开头加上 # 进行注释:

复制代码

#$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com');

复制代码
这个选项会在 web 界面中预先填充管理员登录详细信息。如果我们的 phpLDAPadmin 页面是公开访问的,这是我们不应该分享的信息。

我们需要调整的最后一件事是控制 phpLDAPadmin 警告消息可见性的设置。默认情况下,应用程序会显示关于模板文件的许多警告消息。这些对我们当前使用软件没有影响。我们可以通过搜索 `hide_template_warning` 参数,取消注释包含它的行,并将其设置为 **true** 来隐藏它们:

$config->custom->appearance'hide_template_warning' = true;

复制代码
这是我们需要调整的最后一件事情。保存并关闭文件以完成。我们不需要重新启动任何东西来使更改生效。

接下来我们将登录到 phpLDAPadmin。

## 步骤 3 ------ 登录到 phpLDAPadmin Web 界面

在对 phpLDAPadmin 进行必要的配置更改后,我们现在可以开始使用它了。在 web 浏览器中导航到应用程序。确保将你的域替换为下面突出显示的区域:

https://example.com/phpldapadmin

复制代码
phpLDAPadmin 登录页面将加载。单击页面左侧菜单中的 **login** 链接。将呈现一个登录表单:

!phpLDAPadmin 登录页面

**Login DN** 是你将要使用的用户名。它包含帐户名称作为 `cn=` 部分,以及你在之前步骤中选择的服务器域名,分解为 `dc=` 部分。我们在安装过程中设置的默认管理员帐户名为 **admin**,所以对于我们的示例,我们将输入以下内容:

cn=admin,dc=example,dc=com

复制代码
在输入适合你域的适当字符串后,输入在配置过程中创建的管理员密码,然后单击 **Authenticate** 按钮。

你将被带到主界面:

!phpLDAPadmin 主页面

此时,你已经登录到 phpLDAPadmin 界面。你可以添加用户、组织单位、组和关系。

LDAP 在数据和目录层次结构的构建方式上非常灵活。你可以创建任何你想要的结构,并创建它们相互交互的规则。

由于这个过程在 Ubuntu 16.04 上与之前的版本相同,你可以按照 LDAP 安装文章中 Ubuntu 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` 定时作业以启用此功能。

首先,打开一个新的文本文件用于 shell 脚本:

```command
sudo nano /usr/local/bin/renew.sh

这将打开一个空白文本文件。粘贴以下脚本。确保更新 SITE=example.com 部分以反映你的 Let's Encrypt 证书存储位置。你可以使用 sudo ls /etc/letsencrypt/live 命令列出证书目录以找到正确的值。

复制代码
#!/bin/sh

SITE=example.com

# 移动到正确的 Let's Encrypt 目录
cd /etc/letsencrypt/live/$SITE

# 复制文件
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

# 调整私钥权限
chown :ssl-cert /etc/ssl/private/$SITE.privkey.pem
chmod 640 /etc/ssl/private/$SITE.privkey.pem

重新启动 slapd 以加载新证书

command 复制代码
systemctl restart slapd

该脚本进入 Let's Encrypt 证书目录,将文件复制到 /etc/ssl,然后更新私钥的权限,使其可被系统的 ssl-cert 组读取。它还重新启动 slapd,这将确保在我们的 certbot 续订定时任务运行时加载新证书。

保存并关闭文件,然后将其设置为可执行:

command 复制代码
sudo chmod u+x /usr/local/bin/renew.sh

然后使用 sudo 运行脚本:

command 复制代码
sudo /usr/local/bin/renew.sh

通过列出 /etc/ssl 中的新文件来验证脚本是否运行成功:

command 复制代码
sudo su -c 'ls -al /etc/ssl/{certs,private}/example.com*'

上述 sudo 命令与普通命令有些不同。su -c '. . .' 部分在执行整个 ls 命令之前将其包装在 root shell 中。如果我们不这样做,* 通配符文件名扩展将以您的非 sudo 用户权限运行,并且会因为您的用户无法读取 /etc/ssl/private 而失败。

ls 将打印有关三个文件的详细信息。验证所有权和权限是否正确:

复制代码
-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 续订定时任务

我们需要更新 certbot 定时任务,在证书更新时运行此脚本:

command 复制代码
sudo crontab -e

您应该已经有一个 certbot renew 行。添加下面突出显示的部分:

复制代码
15 3 * * * /usr/bin/certbot renew --quiet --renew-hook /usr/local/bin/renew.sh

保存并关闭 crontab。现在,每当 certbot 续订证书时,我们的脚本将被运行以复制文件、调整权限并重新启动 slapd 服务器。

配置 slapd 提供安全连接

我们需要将 openldap 用户添加到 ssl-cert 组,以便 slapd 可以读取私钥:

command 复制代码
sudo usermod -aG ssl-cert openldap

重新启动 slapd 以使其获取新组:

command 复制代码
sudo systemctl restart slapd

最后,我们需要配置 slapd 实际使用这些证书和密钥。为此,我们将所有配置更改放入一个 LDIF 文件中 ------ 即 LDAP 数据交换格式 ------ 然后使用 ldapmodify 命令将更改加载到我们的 LDAP 服务器中。

打开一个新的 LDIF 文件:

command 复制代码
cd ~
nano 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 应用更改:

command 复制代码
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f ssl.ldif
复制代码
SASL/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 选项以强制进行安全连接:

command 复制代码
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 连接》。

相关推荐
zhangfeng11331 分钟前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
夜月yeyue6 分钟前
STM32 DMA 双缓冲采样
linux·stm32·单片机·嵌入式硬件·系统架构
ScilogyHunter7 分钟前
Buildroot完全指南:从入门到实战
linux·嵌入式·buildroot
毕竟是shy哥15 分钟前
Claude Code 接入 DeepSeek 保姆级教程,WSL/Linux 通用
linux·安装教程·codex·deepseek·claude code·openclaw
AOwhisky24 分钟前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
无限进步_28 分钟前
从零实现一个迷你Shell——深入理解Linux命令行解释器
linux·运维·服务器·开发语言·c++·chrome
__Witheart__35 分钟前
rk3568 交叉编译链
ubuntu·rockchip
Adorable老犀牛1 小时前
nginx_exporter:Prometheus 监控 Nginx 基础指标
运维·nginx·prometheus
山里幽默的程序员1 小时前
DevOps 必备:盘点2026 年最强RESTful API 接口测试方案
运维·restful·devops·api开发·api开发工具
happymaker06261 小时前
Linux常见命令总结
linux·运维·服务器