跳到主要内容

OpenLDAP 接入 NineData SSO

本文面向使用 OpenLDAP 管理人员账户信息的企业,提供将 OpenLDAP 接入单点登录(SSO)的最佳实践指南,以实现统一认证和授权管理。通过集成 OpenLDAP、phpLDAPadmin、Keycloak,您可以轻松通过 SSO 功能登录 NineData。

背景信息

OpenLDAP(Open Lightweight Directory Access Protocol)是一个开源的轻量级目录访问协议(LDAP)服务器,用于存储和管理组织的用户账号和身份信息,在企业中被广泛应用。而多数企业中存在着多个应用系统并行运行的情况,且这些应用系统通常拥有独立的身份认证和授权机制,导致用户需要为每个系统单独登录和管理账号。 将 OpenLDAP 接入 SSO 后,用户只需一次登录即可以无缝地访问其他系统,除了简化账号管理和系统登录流程带来的便利之外,还降低了账户信息泄露的风险,提高系统的整体安全性。

前提条件

  • 已创建或加入组织,并且该组织已开通 ,同时请确保您的包年包月订阅未过期。
  • 当前账号已切换到目标组织。更多信息,请参见切换到组织
  • 拥有 LDAP 服务器的 Root 权限,您可以在执行本文步骤前,先执行 sudo su 命令切换到 Root 账号。

环境说明

本文从 0 到 1 介绍所有需要的软件工具的安装以及配置方法,您可在阅读时忽略您系统中已有软件的操作步骤。本文所使用的环境说明如下:

  • 系统版本:CentOS Linux release 7.9.2009

    提示

    您可通过在命令行执行 cat /etc/*release 命令查看当前系统版本。

  • Docker 版本:24.0.0

  • Docker Compose 版本:2.17.3

  • OpenLDAP 版本:2.4.57

  • phpLDAPadmin 版本:1.2.5

  • KeyCloak 版本:9.0.0

步骤一:安装 Docker 和 Docker Compose

为方便安装和配置,本文使用 Docker 和 Docker Compose 来运行 OpenLDAP、OpenLDAPAdmin 以及 KeyCloak。

以下是 CentOS 或者 Red Hat Enterprise Linux(RHEL)等基于 RPM 包管理的 Linux 系统中使用 yum 命令的安装步骤。

单击展开流程说明
  1. 打开终端命令行工具,执行下列命令卸载旧版本的 Docker(如有):

    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  2. 安装 yum 包管理器扩展工具 yum-utils:

    sudo yum install -y yum-utils
  3. 设置 Docker 稳定版仓库:

    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  4. 安装最新版本的 Docker:

    sudo yum install docker-ce docker-ce-cli containerd.io
  5. 启动 Docker 服务:

    sudo systemctl start docker
  6. 验证 Docker 是否安装成功:

    sudo docker run hello-world
    提示

    命令行中输出以下内容,则说明 Docker 已经成功安装:

    Hello from Docker! This message shows that your installation appears to be working correctly. ...

步骤二:安装 OpenLDAP

为保证最佳实践的完整性,本文提供 OpenLDAP 的安装方式,如果您已经安装了 OpenLDAP,请忽略本节内容。

单击展开流程说明
  1. 打开终端命令行窗口,在任意目录下创建名为 docker-compose.yml 的文件,并通过编辑器(例如 vim)打开,复制粘贴下列内容并保存退出,各参数的说明请参见文件中的注释内容。

    version: '3'

    services:
    openldap:
    image: osixia/openldap # 使用 osixia/openldap 镜像来启动 OpenLDAP 服务。
    container_name: openldap # OpenLDAP 的容器名称,可自定义。
    environment: # 配置环境变量。
    - LDAP_ORGANISATION=Ninedata # OpenLDAP 的组织名称,将 NineData 更改为您的组织名称。
    - LDAP_DOMAIN=ninedata.com # OpenLDAP 的域名,更改为您自身的 OpenLDAP 服务域名。
    - LDAP_ADMIN_PASSWORD=your_password # OpenLDAP 服务的管理员密码。
    ports: # 配置 OpenLDAP 的服务端口。
    - "389:389" # 基于明文传输的 LDAP 服务端口,默认为 389。
    - "636:636" # 基于SSL/TLS 加密传输的 LDAP 服务端口,默认为 636。
    volumes: # 将 /var/lib/ldap 和 /etc/ldap/slapd.d 目录映射到本地的 ./data/ldap 和 ./data/slapd.d 目录,以便数据可以持久化保存。
    - ./data/ldap:/var/lib/ldap
    - ./data/slapd.d:/etc/ldap/slapd.d
  2. 进入 docker-compose.yml 文件所在目录,执行如下命令拉取并根据 docker-compose.yml 中配置的参数启动 OpenLDAP 服务:

    docker-compose up -d

    执行完成后,您可以执行 docker-compose ps 命令查看 OpenLDAP 服务的状态,STATUS 列显示为 Up 即代表启动成功。

步骤三:安装 phpLDAPadmin

phpLDAPadmin 用于管理和操作 OpenLDAP 中的用户信息,具有直观的界面,能够浏览目录结构、搜索和编辑目录中的条目、管理用户、组和其他 LDAP 对象。

  1. 打开终端命令行窗口,执行如下命令拉取 phpLDAPadmin Docker 镜像:

    docker pull osixia/phpldapadmin
  2. 创建并启动 phpLDAPadmin Docker 容器:

    docker run --name phpldapadmin-container -p 6443:443 --env PHPLDAPADMIN_LDAP_HOSTS=192.168.2.33 --detach osixia/phpldapadmin
    参数说明
    • --name phpldapadmin-container:自定义 phpLDAPadmin 容器的名称,其中 phpldapadmin-container 可以替换成您的自定义名称。
    • -p 6443:443:将本机的 6443 端口映射到容器的 443 端口,以便通过本机的 6443 端口访问 phpLDAPadmin 服务,您也可以使用其他端口号替换 6443。
    • --env PHPLDAPADMIN_LDAP_HOSTS=192.168.2.33:设置环境变量 PHPLDAPADMIN_LDAP_HOSTS,该环境变量指定了 LDAP 服务所在的主机地址,您需要将 192.168.2.33 替换为您实际的 LDAP 服务器地址。
    • --detach:在后台运行容器,防止阻塞终端。
    • osixia/phpldapadmin:指定要运行的 Docker 镜像名称。
  3. 在浏览器中访问 https://<IP 地址>:<端口>打开 phpLDAPadmin 登录页面(本示例中为 https://192.168.2.33:6443),单击左侧导航栏的 login,然后在右侧输入 Login DN 以及 Password,单击 Authenticate 登录 OpenLDAP 系统。

    • IP 地址:请根据上一步中实际配置的 PHPLDAPADMIN_LDAP_HOSTS 参数值填写。

    • 端口:请根据上一步中实际配置的 -p 参数值填写。

    • Login DN:登录信息,通常由多个 RDN(Relative Distinguished Name)组成,每个 RDN 由属性和属性值对组成,用逗号分隔。例如,一个典型的 DN 可能是 cn=admin,dc=ninedata,dc=com。其中 cn=admin 是 OpenLDAP 系统的管理员用户,dc=ninedata dc=com 是您自身的服务域名,这些配置信息在步骤二docker-compose.yml 文件中可以找到。

    • Password:OpenLDAP 服务的管理员密码,同样可以在步骤二docker-compose.yml 文件中找到。

    提示
    • 由于自签名证书问题,首次访问时,浏览器可能会拦截您的访问,此时需要单击高级,然后单击继续前往192.168.2.33(不安全)即可。本示例基于 Chrome 浏览器,不同浏览器的提示信息不同,请以实际情况为准。
    • 如果浏览器提示无法打开页面,或者报 ERR_INVALID_HTTP_RESPONSE 错误,请确保您使用的 URL 前缀为 https://,而非 http://
  4. 由于本示例为新装 OpenLDAP,里面没有数据,我们通过 phpLDAPadmin 向 OpenLDAP 中添加一个组织,并在组织中添加一条用户数据。

    1. 单击左侧导航栏中的域名,并在右侧页面中单击 Create a child entry

      create_ou

    2. 在选择创建模板页面,单击 Default

      create_ou2

    3. ObjectClasses 列表中,选择 organizationalUnit,然后单击 Proceed >> 按钮。

      create_ou3

    4. 在属性配置窗口,将 RDN 配置为 ou (ou),并在 ou 下方文本框中输入组织单位的名称,然后滚动页面至最下方,单击 Create Object 按钮。

      create_ou4

      提示

      您可根据需求补充其他组织单位的信息。

    5. 在确认页面,单击 Commit 即可。

      create_ou5

步骤四:安装 KeyCloak 并从 OpenLDAP 同步用户数据

Keycloak 是一个开源的身份和访问管理解决方案,提供了身份验证、授权和单点登录(SSO)功能。本章节介绍如何利用 KeyCloak 同步 OpenLDAP 中的用户数据,用于接入 SSO。

  1. 打开终端命令行工具,执行下列命令拉取 KeyCloak。

    docker pull jboss/keycloak:9.0.0
  2. 创建并启动 KeyCloak 容器。

    docker run --name keycloak-container -p 8443:8443 --env KEYCLOAK_USER=admin --env KEYCLOAK_PASSWORD=admin --detach jboss/keycloak:9.0.0
    参数说明
    • --name keycloak-container:自定义 KeyCloak 容器的名称,其中 keycloak-container 可以替换成您的自定义名称。
    • -p 8443:8443:将本机的 8443 端口映射到容器的 8443 端口,以便通过本机的 8443 端口访问 KeyCloak 服务,您也可以使用其他端口号替换本机 8443 端口。
    • --env KEYCLOAK_USER=admin:设置环境变量 KEYCLOAK_USER,该环境变量指定了 KeyCloak 服务的管理员账号为 admin,您可以自定义该账号。
    • --env KEYCLOAK_PASSWORD=admin:设置环境变量 KEYCLOAK_PASSWORD,该环境变量指定了 KeyCloak 服务的管理员密码为 admin,您可以自定义该密码。
    • --detach:在后台运行容器,防止阻塞终端。
    • jboss/keycloak:9.0.0:指定要运行的 Docker 镜像名称。
  3. 在浏览器中访问 https://<IP 地址>:<端口> 打开 KeyCloak 欢迎页面(本示例中为https://192.168.2.33:8443),单击 Administration Console 进入登录页面。

    • IP 地址:请根据您实际安装 KeyCloak 服务的主机地址填写。
    • 端口:请根据上一步骤中您实际配置的 -p 参数的值输入。

    keycloak1

    提示
    • 由于自签名证书问题,首次访问时,浏览器可能会拦截您的访问,此时需要单击高级,然后单击继续前往192.168.2.33(不安全)即可。本示例基于 Chrome 浏览器,不同浏览器的提示信息不同,请以实际情况为准。
    • 如果浏览器提示无法打开页面,或者报 ERR_INVALID_HTTP_RESPONSE 错误,请确保您使用的 URL 前缀为 https://,而非 http://
  4. 在登录页面,输入登录账号和密码,单击 Log In

    • 登录账号:请根据您在上一步骤中传入的 KEYCLOAK_USER 参数值输入,本示例的登录账号为 admin
    • 密码:请根据您在上一步骤中传入的 KEYCLOAK_PASSWORD 参数值输入,本示例的密码为 admin
  5. (可选)启用中文界面。

    单击展开流程说明
    1. 在左侧导航栏单击 Realm Settings,在右侧页面单击 Themes 页签,按照下图顺序进行配置并登出系统以应用配置。

      keycloak3

    2. 切换一次语言,然后重新登录 KeyCloak 即可。

      keycloak4

  6. 在左侧导航栏,单击用户联合,选择 ldap 作为用户数据库。

    keycloak5

  7. 添加用户联合提供程序页面,根据下图顺序进行配置。

    keycloak6

    keycloak7

    序号
    说明
    1选择 ldap 作为供应商。
    2输入 OpenLDAP 服务的连接地址,格式:ldap://<OpenLDAP 所在服务器 IP>:<端口>。输入后可以单击测试连接测试连通性。
    3由组织名称和域名组成,格式为ou=<组织名称>,dc=<服务域名>,dc=<服务域名>。示例:ou=ninedata,dc=ninedata,dc=com
    4由管理员用户名和域名组成,格式为cn=<管理员用户名>,dc=<服务域名>,dc=<服务域名>。示例:cn=admin,dc=ninedata,dc=com
    5输入访问 OpenLDAP 的管理员密码。
    6开启周期性完全同步,可定期自动同步 OpenLDAP 中增删改的成员信息。
    7保存更改。
  8. 单击保存后,页面上方提示 Success! The provider has been created. 即代表添加成功,单击同步所有用户即可将您 OpenLDAP 中的用户信息同步到 KeyCloak 中。

    keycloak8

  9. 在左侧导航栏,单击领域设置,右键单击 SAML 元数据另存为 .xml 文件备用。

    keycloak9

步骤五:配置 NineData SSO 登录

前提条件

您的角色为。更多关于角色的信息,请参见角色

操作步骤

  1. 登录 NineData 控制台,在左侧导航栏单击>,根据下图顺序配置 SSO。

    ldap_sso

    序号
    说明
    3打开 SSO 登录开关。
    4输入 SSO 组织名称,输入完成后,在 下方自动生成
    5下载元数据文件备用。
    6单击,选择 KeyCloak 中下载的 SAML 元数据,自动识别并填充下方信息。
    7开启该选项,后用户在通过 SSO 方式登录 NineData 时,系统将自动添加该用户到 NineData,您无需再到 NineData 控制台中提前新建 SSO 用户。
    8开启的情况下可选,指定自动加入的 SSO 用户默认绑定的角色,支持单选和多选。
    9保存修改。
  2. 用管理员账户(本示例的账号密码:admin/admin)登录 KeyCloak,在左侧导航栏单击客户端,并在页面右上角单击创建

    keycloak10

  3. 添加客户端页面,单击选择文件,导入 NineData 控制台中下载的 .xml 元数据文件(步骤 1 中的序号 5),单击保存后自动跳转到当前客户端的配置页,找到并关闭需要客户端签名的开关,滚动页面至底部,单击保存

  4. 在左侧导航栏,单击>,复制页面中的提供给对应用户即可。该用户通过自身的账号登录 KeyCloak 即可登录 NineData。

    sso_url

步骤六:用户通过 SSO 登录 NineData

前提条件

用户已从管理员处获取了

操作步骤

  1. 在浏览器中访问管理员提供的,页面自动跳转至 KeyCloak 登录页。

  2. 输入用户名密码,单击登录即可跳转至 NineData 控制台。

    sample

    提示

    该用户名和密码即管理员在 OpenLDAP 中录入的用户信息,录入方式请参见添加组织和用户

  3. 新用户登录 NineData 需要根据页面提示完善个人信息才可继续使用。

    personal_info