轻量级目录访问协议(LDAP)是一种标准协议,旨在通过网络管理和访问分层目录信息。目录服务在开发内部网和与互联网程序共享用户、系统、网络、服务和应用的过程中占据了重要地位。例如,目录服务可能提供了组织有序的记录集合,通常有层级结构,例如公司电子邮件目录。同理,也可以提供包含了地址和电话号码的电话簿。 用例子来说,一个用语言描述的LDAP的搜索如:“在公司邮件目录中搜索公司位于那什维尔名字中含有“Jessy”的有邮件地址的所有人。请返回他们的全名,电子邮件,头衔和简述。
在本教程中,我们将讨论如何在Ubuntu 16.04上安装和配置OpenLDAP服务器。之后,我们将安装phpLDAPadmin,一个用于查看和操作LDAP信息的Web界面。我们将使用腾讯云SSL证书来保护Web界面和LDAP服务。
在开始本教程之前,您应该使用Apache和PHP设置Ubuntu 16.04服务器。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。如何安装LAMP请参考这篇文章。
此外,由于我们将在Web界面中输入密码,因此我们应该使用SSL加密来保护Apache。您需要SSL证书,如何设置此证书取决于你是否拥有可解析该服务器的域名。
我们的第一步是安装LDAP服务器和一些相关的程序。我们需要的软件包都可以在Ubuntu的默认存储库中找到。
登录您的服务器,我们将刷新本地包索引,然后安装我们想要的包:
sudo apt-get update
sudo apt-get install slapd ldap-utils
在安装过程中,系统会要求您选择并确认LDAP的管理员密码。您可以在这里输入任何内容,并将有机会在短时间内更新它。
即使我们刚刚安装了软件包,我们还需继续重新配置它。slapd软件包能够提出许多重要的配置问题,但默认情况下会在安装过程中跳过这些问题。通过下面的命令,我们可以访问所有提示:
sudo dpkg-reconfigure slapd
在这个过程中有很多新的问题需要回答。我们将接受大多数默认值。我们先来看看问题:
“NO”
输入两次安全密码
MDB
NO
YES
NO
此时,您的LDAP服务器已配置并正在运行。我们需要打开防火墙上的LDAP端口,以便外部客户端可以连接,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。:
sudo ufw allow ldap
让我们测试我们的ldapwhoami
连接,它应该返回我们连接的用户名:
ldapwhoami -H ldap:// -x
anonymous
anonymous
是我们想要的结果,因为我们在ldapwhoami
没有登录LDAP服务器的情况下运行。接下来,我们将设置一个Web界面来管理LDAP数据。
虽然通过命令行管理LDAP功能很强大,但使用Web界面更容易。我们将安装phpLDAPadmin,这是一个提供此功能的PHP应用程序。Ubuntu存储库包含一个phpLDAPadmin包。你可以用apt-get
安装它:
sudo apt-get install phpldapadmin
这将安装应用程序,启用必要的Apache配置,并重新加载Apache。Web服务器现在配置为服务应用程序,但我们需要进行一些其他更改。我们需要配置phpLDAPadmin以使用我们的域名。
首先在文本编辑器中使用root权限打开主配置文件:
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','name'
。此配置告诉phpLDAPadminLDAP层次结构的根目录。这基于我们在重新配置slapd
包时输入的值。在我们选择的示例example.com
中,我们需要将每个域组件(所有内容都不是点)放入dc=
符号中,从而将其转换为LDAP语法:
$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。
对phpLDAPadmin进行了必要的配置更改后,我们就可以开始使用它了。在Web浏览器中导航到该应用程序。请务必将您的域名替换为以下高亮显示的区域:
https://example.com/phpldapadmin
加载phpLDAPadmin登录页面。单击页面左侧菜单中的Login链接。登录表单将会显示:
Login DN是您将要使用的用户名。它包含cn=
节作为帐户名称,以及如前面步骤所述您为服务器选择的分为多个dc=
部分的域名。我们在安装期间设置的默认管理员帐户称为admin,因此对于我们的示例,我们将输入以下内容:
cn=admin,dc=example,dc=com
输入域的相应字符串后,输入您在配置期间创建的管理员密码,然后单击“Authenticate”按钮。
您将进入主界面:
此时,您将登录到phpLDAPadmin界面。您可以添加用户,组织单位,群组和关系。LDAP可以灵活地构建数据和目录层次结构。您可以创建任何类型的结构,并为它们的交互方式创建规则。这些步骤适用于phpLDAPadmin,所以请继续学习如何使用界面和构建数据。
现在我们已经登录并熟悉了Web界面,让我们再花点时间为我们的LDAP服务器提供更多安全性。
虽然我们已经加密了我们的Web界面,但外部LDAP客户端仍然连接到服务器并以纯文本形式传递信息。让我们使用腾讯云的SSL证书为我们的LDAP服务器添加密。
进入SSL证书管理控制台
单击【申请证书】
查看申请域名型证书型号,单击【确定】
填写申请域名,例如qcloud.com,cloud.tencent.com,demo.test.qlcoud.com。
证书默认支持收到DNS验证,验证方法可查看详情。
提交申请成功后弹窗提示如下,需要前往【证书详情页】获取CName记录添加解析:
获取CName记录如Tips中显示,需要尽快成功添加解析,方可通过CA机构审核:
由于slapd守护程序作为用户openldap运行,并且腾讯云的加密证书只能由root用户读取,因此我们需要进行一些调整以允许slapd访问证书。我们将创建一个脚本将证书复制到/etc/ssl/SSL
证书和密钥的标准系统目录。
首先,打开shell脚本的新文本文件:
sudo nano /usr/local/bin/renew.sh
这将打开一个空白文本文件。粘贴以下脚本。请务必更新该部分以反映腾讯云加密证书的存储位置。下载证书后,你需要找到正确的值。
#!/bin/sh
SITE=example.com
# move to the correct Tencent Cloud SSL directory 这里选择你证书的目录
cd /etc/Tencent_Cloud_SSL/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
此脚本进入腾讯云的加密证书目录,将文件复制到/etc/ssl
,然后更新私钥的权限,使其可由系统的ssl-cert
组读取。它也会重新启动slapd
。
保存并关闭该文件,然后使其可执行:
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
命令包装在rootshell中。如果我们不这样做,*
通配符文件名扩展将与您的非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
我们需要将openldap用户添加到ssl-cert组,以便slapd
读取私钥:
sudo usermod -aG ssl-cert openldap
重新启动slapd
以便它获取新组:
sudo systemctl restart slapd
最后,我们需要配置slapd
实际使用这些证书和密钥。为此,我们将所有配置更改放在LDIF文件中,然后使用ldapmodify
命令将更改加载到LDAP服务器中。
打开一个新的LDIF文件:
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
更改:
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
强制安全连接的选项:
ldapwhoami -H ldap://example.com -x -ZZ
我们在使用安全连接时需要完整的主机名,因为客户端将检查以确保主机名与证书上的主机名匹配。这可以防止攻击者拦截您的连接并冒充您的服务器的中间人攻击。
ldapwhoami
命令应该没有返回anonymous
。这时,我们已经成功加密了我们的LDAP连接。
在本教程中,我们安装并配置了OpenLDAP
服务器和phpLDAPadmin
Web界面。我们还在两台服务器上设置了SSL加密。我们设置的系统非常灵活,您可以根据需要设计自己的组织架构并管理资源组。感谢你的阅读,更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Install and Configure OpenLDAP and phpLDAPadmin on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。