ScyllaDB LDAP 认证配置指南:基于 SaslauthdAuthenticator 接入 LDAP 服务器
2026/9/15 10:55:30 网站建设 项目流程

ScyllaDB LDAP 认证配置指南:基于 SaslauthdAuthenticator 接入 LDAP 服务器

【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb

本指南讲解如何在 ScyllaDB 中启用基于 LDAP 服务器的用户认证:通过配置系统级saslauthd守护进程对接 LDAP,并切换 ScyllaDB 的内置SaslauthdAuthenticator认证器,使所有客户端登录凭据交由 LDAP 校验。读完本文,你将掌握 saslauthd 的 LDAP 机制配置、mux 套接字定位、scylla.yaml 认证项调整、连通性自测与排错方法,并理解该认证链路在 ScyllaDB 源码中的实现细节。

一、认证架构:ScyllaDB 如何把登录交给 LDAP

ScyllaDB 默认使用PasswordAuthenticator在数据库内部完成认证(用户名与密码以角色形式保存在system_auth中,详见 authentication.rst)。而当企业希望复用已有的 LDAP 目录服务时,ScyllaDB 提供了第二种路径:认证外包给第三方工具 saslauthd,再由 saslauthd 对接 LDAP。

整个链路如下:

CQL 客户端 │ 用户名 + 密码 ▼ ScyllaDB(SaslauthdAuthenticator) │ 通过 Unix domain socket(mux) ▼ saslauthd(认证代理守护进程) │ MECH=ldap ▼ LDAP 服务器(校验凭据)

ScyllaDB 通过自定义认证器SaslauthdAuthenticator完成这件事。从源码 auth/saslauthd_authenticator.hh 可以看到它的职责描述:当被要求认证时,把凭据交给 saslauthd,根据其响应决定允许或拒绝登录。该认证器内部只保存一个_socket_path,即 saslauthd 监听的 Unix 域套接字路径。

配置完成后,任何对 ScyllaDB 的登录都会由SaslauthdAuthenticator处理,其 Java 限定名为com.scylladb.auth.SaslauthdAuthenticator,见 auth/saslauthd_authenticator.cc。

二、前置准备:安装并启用 saslauthd

在配置 LDAP 之前,必须先安装 saslauthd。完整的通用安装流程见 saslauthd.rst,核心步骤如下:

  1. 安装 saslauthd 软件包,按发行版选择:

    • rpm 系发行版:使用cyrus-sasl
    • deb 系发行版:使用sasl2-bin
  2. 启用服务

    systemctl enable saslauthd.service
  3. 选择认证机制并设置机制相关的参数(例如 LDAP 或 PAM),具体可参考 saslauthd 的官方文档。

  4. 每次修改配置后重启服务

    systemctl restart saslauthd.service

三、把 LDAP 设置为 saslauthd 的认证机制

saslauthd 本身支持多种认证机制,为了让 ScyllaDB 的登录请求通过它流向 LDAP,必须把 LDAP 列为 saslauthd 的认证机制。按发行版不同,配置位置有别:

  • rpm 系发行版:编辑/etc/sysconfig/saslauthd,添加:

    MECH=ldap
  • deb 系发行版:编辑/etc/default/saslauthd,添加:

    MECHANISMS=ldap

四、配置 /etc/saslauthd.conf 连接 LDAP

仅声明机制还不够,还需要编辑/etc/saslauthd.conf,为你的 LDAP 服务器提供充分的参数值。典型的配置项包括:

参数作用示例值
ldap_serversLDAP 服务器地址(URI 格式,多个用空格分隔)ldap://ldap.example.com:389
ldap_search_base搜索用户的基准 DNou=People,dc=example,dc=com
ldap_filter定位用户的 LDAP 过滤器模板(%u会被替换为登录用户名)(uid=%u)
ldap_bind_dnsaslauthd 执行 bind 操作使用的 DNcn=admin,dc=example,dc=com
ldap_passwordbind 密码secret
ldap_starttls是否启用 STARTTLSyes
ldap_timeout操作超时(秒)10

说明:不同发行版/版本的 cyrus-sasl 包对/etc/saslauthd.conf参数名可能略有差异,请以本机安装版本为准。配置完成后必须重启 saslauthd 服务使其生效。

五、验证 saslauthd 到 LDAP 的连通性

在把 ScyllaDB 接进来之前,先用testsaslauthd命令独立验证 saslauthd 的 LDAP 认证是否工作正常:

testsaslauthd -u <ldap用户名> -p <密码>

如果看到成功消息,说明 saslauthd 已经能正确通过 LDAP 校验凭据;如果失败,请先确认用户名和密码正确,然后查看 saslauthd 日志定位问题——可以执行dmesg -H,查找LOG_AUTH相关的输出。

六、定位 mux 套接字(Unix domain socket)

SaslauthdAuthenticator通过 saslauthd 的 mux 文件(即 saslauthd 对外提供服务的 Unix 域套接字)与 saslauthd 通信,因此必须找到它的完整路径:

  • rpm 系发行版:通常是/run/saslauthd/mux
  • deb 系发行版:通常是/var/run/sasl2/mux

七、配置 ScyllaDB 使用 SaslauthdAuthenticator

确认 saslauthd 已正确配置并运行后,修改 ScyllaDB 的配置文件/etc/scylla/scylla.yaml(仓库内的默认模板见 conf/scylla.yaml),修改以下两个条目:

authenticator: com.scylladb.auth.SaslauthdAuthenticator saslauthd_socket_path: /run/saslauthd/mux

其中:

  • authenticator:必须设置为com.scylladb.auth.SaslauthdAuthenticator,这是源码 auth/saslauthd_authenticator.cc 中qualified_java_name()返回的限定名;
  • saslauthd_socket_path:填上一步定位到的 mux 文件路径,它对应认证器构造时从配置读取的_socket_path(见 auth/saslauthd_authenticator.cc)。

注意:仓库模板中注释给出的示例默认值是/var/state/saslauthd/mux,实际请以你发行版上 mux 的真实路径为准,路径错误会导致认证全部失败。

修改完成后重启 ScyllaDB 服务器。从此以后,ScyllaDB 的所有登录尝试都会通过 saslauthd 进行认证。

八、在 ScyllaDB 中创建与 LDAP 对应的角色

认证成功后,用户还需要具备可用的 ScyllaDB 角色。请创建与 LDAP 服务器中同名的 ScyllaDB 角色:

  • 角色创建语法参考 CQL 参考文档中的安全部分;
  • 完整的基于角色的访问控制(RBAC)示例见 rbac-usecase.rst。

由于SaslauthdAuthenticator只负责验证凭据,角色本身仍由 ScyllaDB 的 role manager 管理。值得一提的是,从源码 auth/saslauthd_authenticator.cc 可以看出,该认证器的create/alter操作会直接抛出"Cannot create passwords with SaslauthdAuthenticator"异常——密码不在 ScyllaDB 中保存,而由 LDAP 全权负责。

九、认证过程源码解析

从实现层面看,auth/saslauthd_authenticator.cc 的authenticate()方法做了以下几件事:

  1. 从凭据字典中强制提取USERNAME_KEYPASSWORD_KEY,缺失即抛出认证异常;
  2. 可选地提取SERVICE_KEYREALM_KEY(缺省为空字符串);
  3. 调用authenticate_with_saslauthd(),将usernamepasswordservicerealm四元组(即 auth/saslauthd_authenticator.hh 中的saslauthd_credentials)打包后写入 Unix 域套接字;
  4. 读取 saslauthd 的应答,若应答前两个字节为OK则认证通过,否则抛出"Incorrect credentials"

协议细节方面:每个字段前都有 2 字节的网络序长度前缀(pack函数使用produce_be写入大端长度),应答也采用“2 字节长度 + 负载”的格式,源码注释引用了 cyrus-sasl 的saslauthd-main.c协议说明。另外,认证器在start()时会检查套接字文件是否存在,不存在则记录警告日志"saslauthd socket file ... doesn't exist"(见 auth/saslauthd_authenticator.cc),这是排查“全部登录失败”时很有用的第一个线索。

十、进阶:LDAP 角色管理(LDAP Authorization)

如果不仅要认证,还要让 LDAP 目录直接管理用户在 ScyllaDB 中的角色,可以进一步参考 ldap-authorization.rst:将role_manager设置为com.scylladb.auth.LDAPRoleManager,并通过ldap_url_templateldap_attr_roleldap_bind_dnldap_bind_passwd等参数定义查询模板。这两项能力配置项同属 auth/config.hh 中的认证配置结构,认证与授权可以配合使用,形成“LDAP 校验身份 + LDAP 下发角色”的完整方案。

排错建议

  • 启用 LDAP 角色管理器的调试日志:给 ScyllaDB 可执行文件传参--logger-log-level ldap_role_manager=debug,可看到 ScyllaDB 收到的 LDAP 响应详情;
  • 先用ldapsearch手工验证查询模板能对一个用户返回正确的角色条目,再用ldapurl把参数转换成 URL 作为ldap_url_template的基线(注意ldapsearchldapurl-s默认值不同,建议显式指定);
  • ldapsearch正常而 ScyllaDB 查不到结果,先核对 URL 模板中的主机与端口是否指向同一台 LDAP 服务器,再对比两边 LDAP 日志中的查询差异。

十一、总结

通过 saslauthd 对接 LDAP 是 ScyllaDB 在企业目录服务场景下的标准认证方案,配置链路清晰:安装并启用 saslauthd → 声明MECH=ldap→ 编写/etc/saslauthd.conf→ 用testsaslauthd自测 → 在 scylla.yaml 中启用com.scylladb.auth.SaslauthdAuthenticator并指向 mux 套接字 → 重启 ScyllaDB → 创建同名角色。配合 LDAP 角色管理器,还可以进一步把角色的授予也统一收归 LDAP 目录管理。仓库中对应的测试(如 test/ldap/ldap_connection_test.cc 与 test/pylib/ldap_server.py)可帮助你进一步验证该链路的正确性。

【免费下载链接】scylladbNoSQL data store using the Seastar framework, compatible with Apache Cassandra and Amazon DynamoDB项目地址: https://gitcode.com/GitHub_Trending/sc/scylladb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询