跳转至

LDAP 认证服务

概要: 本文介绍在Docker环境下部署LDAP认证服务,并在WebUI上管理用户。同时介绍一部分应用的LDAP配置

创建时间: 2023.06.28 00:36:09

更新时间: 2023.08.03 00:10:02

认识LDAP

LDAP协议

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,主要用于查询和修改目录服务提供者(如Active Directory)中的项目,它以树状结构存储数据库,读的性能高,但写入性能差,在企业中被广泛用于管理用户、组织结构以及权限等(不经常变更的数据)。
此外,AD(Active Directory)是微软实现的支持LDAP协议的数据库。

LDAP概念

DN(Distinguished Name),专有名称,LDAP中对象的唯一路径,一般而言由下面的几部分组成:

  1. DC(Domain Component),域组件,可以理解为域名的组成部分,LDAP中至少有一个DC。如 hello.org 可以表示为 dc=hello,dc=org
  2. OU(Organisation Unit),组织单元,类比公司中的部门。
  3. CN(Common Name),代表一个具体实例,即具体用户的名称(非路径)

Base DN处于目录树的顶级,可以理解为根,如hello.org的Base DN为dc=hello,dc=org

LDAP解析

举例,如果张三在A公司(hello.org)的IT部门,那么张三的DN为CN=ZhangSan,OU=ITDepartment,DC=hello,DC=org,查找顺序则由DC到CN,即:

  1. DC=org
  2. DC=hello
  3. OU=ITDepartment
  4. CN=ZhangSan

此外,如果A公司还有子公司,假如李四在子公司(subdomain.hello.org)的销售部,那么李四的DN为CN=LiSi,OU=SaleDepartment,DC=subdomain,DC=hello,DC=org,查找顺序也是由DC到CN,即:

  1. DC=org
  2. DC=hello
  3. DC=subdomain
  4. OU=SaleDepartment
  5. CN=LiSi

LDAP搜索

LDAP支持的过滤器语法如下:

  • = 等于
  • & 逻辑与
  • | 逻辑或
  • ! 逻辑非
  • * 通配符号

部署LDAP服务

使用docker-compose方式,docker-compose.yaml配置文件如下

YAML
# https://hub.docker.com/r/wheelybird/ldap-user-manager
version: "3"

services:
  ldap-server:  # https://github.com/osixia/docker-openldap
    image: osixia/openldap:latest
    container_name: ldap_server
    restart: always
    environment:
      - LDAP_ORGANISATION=hello
      - LDAP_DOMAIN=hello.org
      - LDAP_BASE_DN=dc=hello,dc=org
      - LDAP_ADMIN_PASSWORD=bad_pw_123
      - LDAP_RFC2307BIS_SCHEMA=true
      - LDAP_REMOVE_CONFIG_AFTER_SETUP=true
      - LDAP_TLS_VERIFY_CLIENT=never
    ports:
      - "20389:389"
    volumes:
      - ./openldap/var_lib_ldap:/var/lib/ldap
      - ./openldap/etc_ldap_slapd.d:/etc/ldap/slapd.d
    networks:
      - ldap-network

  ldap-manager:  # https://github.com/wheelybird/ldap-user-manager
    image: wheelybird/ldap-user-manager:latest
    container_name: ldap_manager
    restart: always
    environment:
      - LDAP_URI=ldap-server
      - LDAP_BASE_DN=dc=hello,dc=org
      - LDAP_ADMINS_GROUP=admins
      - LDAP_ADMIN_BIND_DN=cn=admin,dc=hello,dc=org
      - LDAP_ADMIN_BIND_PWD=bad_pw_123
      - LDAP_IGNORE_CERT_ERRORS=true
    ports:
      - "20080:80"
      - "20443:443"
    networks:
      - ldap-network

networks:
  ldap-network:
    name: ldap-network
    driver: bridge

配置项注意

  • ldap-server服务中的LDAP_ADMIN_PASSWORDldap-manager服务中的LDAP_ADMIN_BIND_PWD两个密码必须相同,为LDAP服务初始化的管理密码,注意务必更改密码,不要与上文配置示例一样
  • 两级dc,即dc=hello,dc=org,与域名LDAP_DOMAIN=hello.org保持一致,可以理解为组织名和域名后缀,注意上下必须保持一致
  • 在管理页面,我们登录的凭据中DN(Distinguished Name)作为唯一标识符,为cn=admin,dc=hello,dc=org,与之对应的登录密码为LDAP_ADMIN_BIND_PWD
  • 在访问WebUI时,浏览器必须使用容器中443向宿主机映射的端口20443才能访问,必须使用https前缀访问

配置LDAP服务

初始化管理员帐户

假设我们部署的机器IP为127.0.0.1,那么首先进入 https://127.0.0.1:20443/setup,忽略浏览器警告,点击高级,点击继续前往
image.png
输入docker-compose.yaml文件中LDAP_ADMIN_BIND_PWD的密码,点击登录
image.png
接下来是对于我们在启动服务时一些配置的确认,以及创建LDAP OU和初始化群组和配置,直接默认即可,点击继续
image.png
然后创建管理员帐户,此帐户用户在WebUI登录对已有帐户进行管理
image.png
然后我们创建一个管理员张三
image.png
初始化完毕
image.png

管理帐户

登录WebUI

首先使用上一步创建的张三进行登录,页面是 https://127.0.0.1:20443/log_in
image.png
登录成功后,可以进行管理用户和群组了
image.png

管理用户

新建帐户,点击 New user 即可,与创建管理员帐户类似,在下图我们创建了一个名为李四的用户
image.png
image.png
点击 Finished 返回上层后,我们可以看到用户李四已经添加成功,默认归属于everybody群组。如果需要修改用户信息,直接点击用户名即可
image.png
非常直观的用户属性编辑,无需赘述
image.png

管理群组

与管理用户类似,点击旁边的 Groups 即可管理群组信息
image.png
image.png
image.png

支持LDAP认证的服务

下面介绍一些支持LDAP认证的工具

Portainer使用LDAP认证

此处以社区版 Portainer CE 2.18.3 为例,在初始化服务后,侧边栏进入 Settings -- Authentication 选项

选取LDAP认证方式

image.png

测试LDAP连接

接下来,选取 Custom 类型的服务器类型

  • LDAP Server 中填写 LDAP服务器的外部访问地址
  • Reader DN 中填写管理员绑定的DN
  • Password 中填写管理员密码

image.png
然后点击 Test connectvity 如果check通过,继续下一步。

配置搜索范围

  • Base DN中填写上文的 LDAP_BASE_DN 值
  • Username attribute 中填写 uid
  • 内网环境客选择跳过TLS认证

image.png

保存配置

下面表黄的都是商业版特性,普通版不可用。
image.png
最后点击 Save settings 即可使用LDAP上保存的用户登录Portainer

参考