前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
轻量目录访问协议(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 连接》。