我在 httpd 2.4 中执行 LDAP 授权以及 Kerberos 身份验证。我从 ldap 检索 objectSID,发现其格式不可读。
引用这和这,已使用 ReWriteMap 使用该脚本将 objectSid 解码为RewriteRule .* - [E=SID:${SIDConvert:%{AUTHORIZE_objectSid}e}]
。AUTHORIZE_objectSid 是我从 LDAP 查询中获得的。但我得到的输出是 S-1-0-0-0-0。
我已经单独使用值测试了脚本,它产生了正确的结果。
输入:AQUAAAAAAAUVAAAAkuA8d4B49TEjX2Nr4tAJAA==
输出:S-1-5-21-2000478354-838170752-1801674531-643298
从 ldap 查询传递硬编码值,它产生正确的结果。
- 传递动态值-产生如上所述。S-1-0-0-0-0。
所以我猜测来自 ldap 的值不是预期的格式。如何知道/调试?任何想法/参考都将不胜感激。
答案1
您有地图脚本的源代码...要了解脚本中发生的情况,您只需添加有关其作为输入接收的内容的日志记录调用(发送到系统日志或写入某个文件)。
但是,我注意到您的示例都使用 Base64。SID 以原始二进制格式存储和检索 - 而不是 Base64。(Base64 只是ldapsearch
检测到非 ASCII 值时输出的内容,但它不是实际 LDAP 属性中存储的内容。)
所以我怀疑问题是:
您的脚本需要 Base64,但来自 Apache 的输入不是 Base64 编码的,因此脚本无法理解该输入。
此外,二进制 SID 可能包含 NUL(0x00)字节,并且经常需要字符串的扩展(例如环境变量始终是字符串)会将其截断到第一个 NUL 字节并忽略其余部分。
就我个人而言,我会避免处理原始 SID – 我会创建一个包含授权用户的 Active Directory 组并使用进行匹配Require ldap-group
。