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,核心步骤如下:
安装 saslauthd 软件包,按发行版选择:
- rpm 系发行版:使用
cyrus-sasl包 - deb 系发行版:使用
sasl2-bin包
- rpm 系发行版:使用
启用服务:
systemctl enable saslauthd.service选择认证机制并设置机制相关的参数(例如 LDAP 或 PAM),具体可参考 saslauthd 的官方文档。
每次修改配置后重启服务:
systemctl restart saslauthd.service
三、把 LDAP 设置为 saslauthd 的认证机制
saslauthd 本身支持多种认证机制,为了让 ScyllaDB 的登录请求通过它流向 LDAP,必须把 LDAP 列为 saslauthd 的认证机制。按发行版不同,配置位置有别:
rpm 系发行版:编辑
/etc/sysconfig/saslauthd,添加:MECH=ldapdeb 系发行版:编辑
/etc/default/saslauthd,添加:MECHANISMS=ldap
四、配置 /etc/saslauthd.conf 连接 LDAP
仅声明机制还不够,还需要编辑/etc/saslauthd.conf,为你的 LDAP 服务器提供充分的参数值。典型的配置项包括:
| 参数 | 作用 | 示例值 |
|---|---|---|
ldap_servers | LDAP 服务器地址(URI 格式,多个用空格分隔) | ldap://ldap.example.com:389 |
ldap_search_base | 搜索用户的基准 DN | ou=People,dc=example,dc=com |
ldap_filter | 定位用户的 LDAP 过滤器模板(%u会被替换为登录用户名) | (uid=%u) |
ldap_bind_dn | saslauthd 执行 bind 操作使用的 DN | cn=admin,dc=example,dc=com |
ldap_password | bind 密码 | secret |
ldap_starttls | 是否启用 STARTTLS | yes |
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()方法做了以下几件事:
- 从凭据字典中强制提取
USERNAME_KEY与PASSWORD_KEY,缺失即抛出认证异常; - 可选地提取
SERVICE_KEY与REALM_KEY(缺省为空字符串); - 调用
authenticate_with_saslauthd(),将username、password、service、realm四元组(即 auth/saslauthd_authenticator.hh 中的saslauthd_credentials)打包后写入 Unix 域套接字; - 读取 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_template、ldap_attr_role、ldap_bind_dn、ldap_bind_passwd等参数定义查询模板。这两项能力配置项同属 auth/config.hh 中的认证配置结构,认证与授权可以配合使用,形成“LDAP 校验身份 + LDAP 下发角色”的完整方案。
排错建议
- 启用 LDAP 角色管理器的调试日志:给 ScyllaDB 可执行文件传参
--logger-log-level ldap_role_manager=debug,可看到 ScyllaDB 收到的 LDAP 响应详情; - 先用
ldapsearch手工验证查询模板能对一个用户返回正确的角色条目,再用ldapurl把参数转换成 URL 作为ldap_url_template的基线(注意ldapsearch与ldapurl的-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),仅供参考