雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

如何在 Bitnami Docker 容器中运行 OpenLDAP

2024-07-12 146

管理用户、组及其各种权限是任何组织中系统管理员的重要任务之一。为了方便起见,许多人选择使用目录服务。这提供了一个集中式数据库,其中保存有关计算机网络中资源和实体的所有信息。它使访问和管理有关网络上各种资源(例如用户、计算机、打印机、应用程序和其他设备)的信息变得更加容易。 Microsoft Active Directory 是最常用的目录服务之一。还有许多其他目录服务,例如 Novell eDirectory、LDAP 等。

轻量级目录访问协议缩写为LDAP,是一种用于访问和修改在 TCP/IP 上运行的基于 X.500 的目录服务的协议。该工具可用于通过网络对用户、系统和应用程序的信息进行身份验证和共享。

OpenLDAP 是 LDAP 的开源实现。该工具提供了丰富的 CLI,使构建和管理 LDAP 变得更加容易。 OpenLDAP 成为首选还有其他几个原因。其中一些包括:

  • 考虑到它是免费和开源的,它的成本效益
  • 它完全符合 LDAP 数据交换格式 (LDIF) 版本 1
  • 它支持简单身份验证、安全层和传输层安全
  • 它提供了灵活性,从而提供了广泛的适用性。
  • 它支持互联网协议版本6
  • 它具有跨平台支持。它支持 Mac、Windows 和 Linux 系统。

在本指南中,我们将学习如何在 Bitnami Docker 容器中运行 OpenLDAP。这种安装方法更简单,因为它消除了设置 OpenLDAP 时涉及的麻烦。感谢 Bitnami 将运行 OpenLDAP 所需的所有依赖项和库打包在一个轻量级容器中。

1.安装Docker容器引擎

在我们深入之前,建议您安装 Docker Engine 和 Docker Compose。为此,您可以使用以下指南:

  • 如何安装 Docker
  • 如何安装 Docker Compose

通过运行以下命令验证安装:

$ docker version
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:32:10 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7

$ docker-compose version
Docker Compose version v2.23.0

2.配置OpenLDAP容器

运行 OpenLDAP 时,您需要进行大量配置。 Bitnami Docker 容器支持许多配置或环境变量。以下是一些支持的变量:

  • LDAP_PORT_NUMBER:这是 OpenLDAP 侦听请求的端口。这里默认支持的端口是1389
  • LDAP_ROOT:这是 LDAP 树的基本 DN。例如dc=example,dc=org
  • LDAP_ADMIN_USERNAME:这是 LDAP 数据库的管理员用户
  • LDAP_ADMIN_PASSWORD:管理员用户所需的密码。
  • LDAP_ADMIN_PASSWORD_FILE:您可以使用它指向包含 LDAP 数据库管理员用户密码的文件,而不是直接在 YAML 中指定密码
  • LDAP_CONFIG_ADMIN_ENABLED:用于指定是否创建配置管理员用户。默认值:否
  • LDAP_CONFIG_ADMIN_USERNAME:LDAP 配置管理员用户的用户名。这与 LDAP_ADMIN_USERNAME 是分开的。默认值:管理员。
  • LDAP_CONFIG_ADMIN_PASSWORD:配置管理员的密码。
  • LDAP_CONFIG_ADMIN_PASSWORD_FILE:这指向包含 LDAP 配置管理员用户密码的文件。
  • LDAP_USERS:这是 LDAP 上以逗号分隔的用户列表。用户将在默认树中创建。例如用户01,用户02
  • LDAP_PASSWORDS:LDAP 用户使用的密码列表。例如:bitnami1,bitnami2
  • LDAP_USER_DC:这是用户的组织单位。默认值为用户。
  • LDAP_GROUP:这是用于新创建用户的组。默认:读者
  • LDAP_EXTRA_SCHEMAS:这用于在 OpenLDAP 的分布式模式中添加额外的模式。默认值:cosine、inetorgperson、nis
  • LDAP_SKIP_DEFAULT_TREE:用于指定是否跳过创建基于LDAP_USERS、LDAP_PASSWORDS、LDAP_USER_DC和LDAP_GROUP的默认LDAP树。
  • LDAP_CUSTOM_LDIF_DIR:用于指定用于引导数据库的 LDIF 文件的位置。
  • LDAP_CUSTOM_SCHEMA_FILE:无法添加为自定义 ldif 文件的架构文件的位置。
  • LDAP_CUSTOM_SCHEMA_DIR:这是无法添加为自定义 ldif 文件的自定义架构的目录。
  • LDAP_ULIMIT_NOFILES:这是打开文件描述符的最大数量。默认值:1024。
  • LDAP_PASSWORD_HASH:您希望在生成用户密码时使用的哈希值。必须是 {SSHA}、{SHA}、{SMD5}、{MD5}、{CRYPT} 和 {CLEARTEXT} 之一。默认值:{SSHA}。
  • LDAP_PPOLICY_HASH_CLEARTEXT:用于指定是否要自动对纯文本密码进行哈希处理。仅在 LDAP_CONFIGURE_PPOLICY 处于活动状态时应用。默认值:否。

您还可以选择使用以下变量来保护 OpenLDAP:

  • LDAP_ENABLE_TLS:用于指定是否为流量启用 TLS。默认为否。
  • LDAP_REQUIRE_TLS:用于设置连接是否必须使用 TLS。仅在 LDAP_ENABLE_TLS 处于活动状态时应用。默认为否。
  • LDAP_LDAPS_PORT_NUMBER:这是用于 TLS 安全流量的端口。支持特权端口(例如 636)。默认值:1636(非特权端口)。
  • LDAP_TLS_CERT_FILE:这是包含 TLS 流量的证书文件的文件。没有默认值。
  • LDAP_TLS_KEY_FILE:包含证书密钥的文件。没有默认值。
  • LDAP_TLS_CA_FILE:包含证书 CA 的文件。没有默认值。
  • LDAP_TLS_DH_PARAMS_FILE:具有 DH 参数的文件。没有默认值。

例如,您可以使用具有以下语法的 YAML 文件来保护您的 OpenLDAP 实例。

services:
  openldap:
  ...
    environment:
      ...
      - LDAP_ENABLE_TLS=yes
      - LDAP_TLS_CERT_FILE=/opt/bitnami/openldap/certs/openldap.crt
      - LDAP_TLS_KEY_FILE=/opt/bitnami/openldap/certs/openldap.key
      - LDAP_TLS_CA_FILE=/opt/bitnami/openldap/certs/openldapCA.crt
    ...
    volumes:
      - /path/to/certs:/opt/bitnami/openldap/certs
      - /path/to/openldap-data-persistence:/bitnami/openldap/
  ...

在本指南中,我们将使用 Docker Compose 配置和运行 OpenLDAP Bitnami 容器。首先,我们将下载示例 Docker Compose 文件:

curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/openldap/docker-compose.yml > docker-compose.yml

然后,您可以继续并根据需要修改容器。

vim docker-compose.yml

在文件中,您可以根据需要更新值。在本指南中,我们将使用最新的可用 Docker 映像并更新配置以适应我们的环境。

# Copyright VMware, Inc.
# SPDX-License-Identifier: APACHE-2.0

version: '2'

services:
  openldap:
    image: docker.io/bitnami/openldap:latest
    ports:
      - '389:1389'
      - '636:1636'
    environment:
      - LDAP_ADMIN_USERNAME=admin
      - LDAP_ADMIN_PASSWORD=adminpassword
      - LDAP_USERS=user01,user02
      - LDAP_PASSWORDS=password1,password2
      - LDAP_ROOT=dc=computingforgeeks,dc=org 
      - LDAP_ADMIN_DN=cn=admin,dc=computingforgeeks,dc=org 

    volumes:
      - 'openldap_data:/bitnami/openldap'

volumes:
  openldap_data:
    external: true

完成所有所需的设置后。保存文件并按如下所示继续操作。

3. 创建 OpenLDAP 持久卷

为了使容器在系统重新启动后保留其数据,我们需要创建持久存储。首先在主机上创建路径:

sudo mkdir -p /data/openldap

设置所需的权限和所有权:

sudo chmod 775 -R /data/openldap
sudo chown -R $USER:docker /data/openldap

在基于 Rhel 的系统上,您需要按如下所示配置 SELinux:

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

现在创建卷,如下所示:

docker volume create --driver local \
     --opt type=none \
     --opt device=/data/openldap \
     --opt o=bind openldap_data

检查卷是否存在:

$ docker volume list
DRIVER    VOLUME NAME
local     openldap_data

4. 在 Bitnami Docker 容器中启动 OpenLDAP

完成上述所有配置后,我们可以使用以下命令继续启动容器:

docker compose up -d

示例输出:

[+] Running 2/2
 ✔ openldap 1 layers [⣿]      0B/0B      Pulled                                          5.6s 
   ✔ f041216ccfa5 Pull complete                                                          1.2s 
[+] Running 2/2
 ✔ Network debian_default         Created                                                0.1s 
 ✔ Container debian-openldap-1    Started                                                0.5s 

检查容器是否已启动:

$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS                                                                              NAMES
bc79a32a90dc   bitnami/openldap:latest   "/opt/bitnami/script…"   42 seconds ago   Up 41 seconds   0.0.0.0:389->1389/tcp, :::389->1389/tcp, 0.0.0.0:636->1636/tcp, :::636->1636/tcp   debian-openldap-1

现在所有端口都可以通过防火墙:

##For UFW
sudo ufw allow 389/tcp
sudo ufw allow 636/tcp

##For Firewalld
sudo firewall-cmd --add-port=389/tcp --permanent
sudo firewall-cmd --add-port=636/tcp --permanent
sudo firewall-cmd --reload

5. 设置 OpenLDAP 客户端

为了测试一切是否正常,我们可以在所需的系统上设置 OpenLDAP 客户端。有多个关于如何设置 OpenLDAP 客户端的指南。

  • 如何设置 OpenLDAP 客户端

在本指南中,我们将设置一个 Ubuntu 客户端。首先要做的是设置客户端的主机名:

sudo hostnamectl set-hostname ldapclient.computingforgeeks.org

接下来,配置更新 /etc/hosts 的分辨率:

$ sudo vim /etc/hosts
##OpenLDAP server
192.168.200.56 ldapmaster.computingforgeeks.org

##OpenLDAP Client
192.168.200.52 ldapclient.computingforgeeks.org

确保客户端可以访问 OpenLDAP 服务器:

$ sudo ping -c3 ldapmaster.computingforgeeks.org
PING ldapmaster.computingforgeeks.org (192.168.200.56) 56(84) bytes of data.
64 bytes from ldapmaster.computingforgeeks.org (192.168.200.56): icmp_seq=1 ttl=64 time=0.232 ms
64 bytes from ldapmaster.computingforgeeks.org (192.168.200.56): icmp_seq=2 ttl=64 time=0.248 ms
64 bytes from ldapmaster.computingforgeeks.org (192.168.200.56): icmp_seq=3 ttl=64 time=0.232 ms

--- ldapmaster.computingforgeeks.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2032ms
rtt min/avg/max/mdev = 0.232/0.237/0.248/0.007 ms

然后安装所有必需的包:

sudo apt update -y && sudo apt -y install libnss-ldap libpam-ldap ldap-utils

继续并配置 LDAP URI。对于我们的例子,我们将使用 ldap://: 语法,如下所示:

设置搜索库的 ROOT DN

设置要使用的 LDAP 版本:

继续并设置本地根数据库管理员

回答下一个问题“LDAP 数据库是否需要登录?:”。

设置root账户:

提供管理员帐户的密码:

安装完成后,您的配置将保存在 /etc/ldap.conf

现在打开以下文件并对 passwdgroup 行进行以下更改:

$ sudo vim /etc/nsswitch.conf
passwd: compat systemd ldap
group: compat systemd ldap
shadow: compat

还需要修改下面的文件,修改第26行,如图所示:

$ sudo vim /etc/pam.d/common-password
##Line 26
password [success=1 user_unknown=ignore default=die] pam_ldap.so try_first_pass

您还需要允许在首次登录时创建用户的主目录。为此,请在文件末尾添加以下行:

$ sudo vim /etc/pam.d/common-session
session optional pam_mkhomedir.so skel=/etc/skel umask=077

现在保存更改并测试是否可以使用在 OpenLDAP 上创建的用户登录系统。例如:

ssh user01@localhost

示例输出:

判决

这标志着有关如何在 Bitnami Docker 容器中运行 OpenLDAP 的指南的结束。我希望你能从中学到一些东西。在此页面上查看更多内容:

  • 如何在 Docker 容器中运行 OpenLDAP 服务器
  • 在 Rocky Linux 8/AlmaLinux 8 上安装和配置 OpenLDAP 服务器
  • 将 TrueNAS 与 LDAP/Active Directory 集成以进行用户身份验证

更新于:4个月前
赞一波!

文章评论

评论问答