在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 连接》。

相关推荐
龙龙博客37 分钟前
LVS+Keepalived 实现高可用负载均衡
运维·负载均衡·lvs
职略37 分钟前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
Iᴛ's ᴅᴇsᴛɪɴʏ²⁸.2 小时前
Nginx反向代理和负载均衡
运维·nginx·负载均衡
cui_win4 小时前
nginx-限制客户端并发数
运维·nginx·限流·limit_conn·限制并发
King's King5 小时前
自动化立体仓库出入库能力及堆垛机节拍
运维·自动化
一颗星的征途5 小时前
宝塔-Linux模板常用命令-centos7
linux·运维·服务器
打打打劫5 小时前
Linux字符设备驱动
linux
cssl-虞老师5 小时前
Ubuntu安装Docker
linux·ubuntu·docker
yumuing blog5 小时前
【论文解读】AGENTLESS:揭开基于LLM的软件工程代理的神秘面纱,重塑软件工程自动化新基线
运维·自动化·软件工程·llama
Xu-小安安6 小时前
linux less命令详解
linux·less