LDAP Account Manager 9.7 配置参数详解
逐项讲清 LDAP Account Manager 主配置 config.cfg 与服务器 profile lam.conf 的参数语义与取值,日志、审计、会话超时、accessLevel、search 直登、useTLS 均已在 Debian 13.7 + LAM 9.7 实测,含 PrivateTmp 与审计权限排障实录。
LDAP Account Manager 9.7 配置参数详解
目标:讲清 LDAP Account Manager(LAM)两级配置文件的全部关键参数——主配置
config.cfg与服务器 profilelam.conf——的取值、语义、生效方式与实测行为,并沉淀配置排障实录。本文全部参数均已在 Debian 13.7(x86_64)+ OpenLDAP slapd 2.6.10 + Apache 2.4.69 + PHP 8.4.27 + LAM 9.7-1 环境逐项实测,实测日期 2026-10-28。
一、环境信息
- 操作系统:Debian 13.7(trixie,x86_64),systemd 引导
- 目录服务后端:OpenLDAP slapd 2.6.10+dfsg-1(同机部署,后缀
dc=example,dc=net) - Web 环境:Apache 2.4.69(event MPM)+ libapache2-mod-php(PHP 8.4.27)
- LDAP Account Manager:9.7-1(官方 deb 包,2026-10-02 发布),安装布局为 deb 形态(见第二节)
- 目录内测试条目:
uid=tester1,ou=people,dc=example,dc=net(密码q1w2e3r4)、cn=users,ou=groups,dc=example,dc=net - 演示账号:目录管理员 DN
cn=admin,dc=example,dc=net(密码q1w2e3r4);LAM 主配置密码q1w2e3r4! - LAM 服务器 profile:
lam,activeTypes为user,group
LAM 9.5 起要求 PHP 8.2+(9.6 起兼容 PHP 8.5),本文环境的 PHP 8.4.27 满足 9.7 全部要求。安装过程与版本选型见 《Debian 13 安装 LDAP Account Manager 9.7 指南》,软件定位与架构背景见 《LDAP Account Manager 介绍与选型指南》。
二、前置条件
LAM 的配置分两级、各自独立成文件,动手前先弄清"哪个文件管什么、放在哪、谁能改"。
第一级:主配置(全局唯一)。文件为 config.cfg,deb 包布局下在 /etc/ldap-account-manager/config.cfg。它管 LAM 自身的行为:默认 profile、会话超时、日志、审计日志、密码策略、配置库等。deb 包通过软链把安装目录里的配置视图统一到一处,实测软链关系:
ls -l /usr/share/ldap-account-manager/config /var/lib/ldap-account-manager/config/config.cfg
实测回显:
lrwxrwxrwx 1 root root 40 Oct 28 10:55 /usr/share/ldap-account-manager/config -> /var/lib/ldap-account-manager/config
lrwxrwxrwx 1 root root 39 Oct 28 10:55 /var/lib/ldap-account-manager/config/config.cfg -> /etc/ldap-account-manager/config.cfg
即 LAM 程序读的 config/config.cfg 最终落到 /etc/ldap-account-manager/config.cfg——直接编辑 /etc 下的文件即可,不必关心软链。
第二级:服务器 profile(可多个)。每个 profile 对应"一台后端 LDAP 服务器 + 一套账户类型设置",文件名即 profile 名(如 lam.conf 对应登录页的 profile lam),deb 布局在 /var/lib/ldap-account-manager/config/ 下。它管连接与业务:后端地址、管理员 DN、登录方式、账户类型与后缀、模块参数。
两个文件的修改入口各受不同密码保护:主配置文件由主配置密码保护(Web 上改主配置或任何 profile 都要输入它,首次访问强制从默认值 lam 改掉);profile 文件里还存有自己的 Passwd 哈希(登录页选 profile 后输入的"配置密码")。文件属主与权限实测:
ls -l /etc/ldap-account-manager/config.cfg /var/lib/ldap-account-manager/config/lam.conf
实测回显:
-rw-r--r-- 1 root root 2219 Oct 28 11:22 /etc/ldap-account-manager/config.cfg
-rw------- 1 www-data root 7987 Oct 28 11:36 /var/lib/ldap-account-manager/config/lam.conf
注意 lam.conf 属主是 www-data(Web 界面保存 profile 时由 PHP 进程写入),手工编辑后同样要保持该属主,否则 Web 端无法保存配置。
三、参数查看与修改方式
有两条修改路径,实测行为差异如下。
路径 A:Web 配置界面。主配置入口为 http://<服务器IP>/lam/config/mainlogin.php(输入主配置密码),profile 配置入口为主界面右上角 Edit server profiles(先选 profile,输入 profile 配置密码)。界面上改名即保存,保存动作由 www-data 完成,权限天然正确,适合日常运维。
路径 B:直接编辑文件。批量调整或无人值守部署时直接改 JSON 文件。两点必须注意:
其一,两个文件都是 JSON(9.0 起格式),改完先校验:
php -r 'json_decode(file_get_contents("/etc/ldap-account-manager/config.cfg")); echo json_last_error_msg() . PHP_EOL;'
实测回显(合法时输出):
No error
其二,文件改动对新会话生效,已有会话不受影响。LAM 在会话建立时把主配置与 profile 读进会话缓存(实测过程中改文件后复用旧会话,界面行为不变;换全新会话立即生效)。因此改完文件后无需重启 Apache,重新登录即可。这也意味着:排障时若"改了没反应",先确认浏览器拿到的是新会话(退出重登),再查文件是否真的保存成功。
另外提醒一个 JSON 细节:数值键(如 sessionTimeout、logLevel)的值是不带引号的数字,字符串键(如 logDestination)带引号。手工 sed 替换时若按 "logLevel": "4" 模式去匹配会落空(实测踩过),应按 "logLevel": 4 匹配。
四、参数总览
主配置 config.cfg 全键清单(9.7-1 deb 包出厂文件实测,共 50 行):
| 参数 | 出厂值 | 作用域 |
|---|---|---|
password | {CRYPT-SHA512}$6$... | 主配置密码哈希(CRYPT-SHA512) |
default | lam | 默认服务器 profile 名 |
sessionTimeout | 30 | 会话超时(分钟,滑动窗口,见 5.1.2) |
hideLoginErrorDetails | "false" | 登录页是否隐藏错误细节 |
logLevel | 4 | 日志级别(3=ERROR/4=WARNING/5=NOTICE/7=DEBUG) |
logDestination | "SYSLOG" | 日志去向(SYSLOG/REMOTE/NONE/文件路径) |
allowedHosts | "" | 管理界面 IP 白名单(空=不限制) |
passwordMinLength | 10 | 主配置密码最小长度 |
passwordMinUpper/MinLower/MinNumeric/MinClasses/MinSymbol | 0 | 主配置密码字符类要求 |
checkedRulesCount | -1 | 密码规则命中数要求(-1=全部) |
passwordMustNotContainUser/MustNotContain3Chars | "false" | 密码禁含用户名/连续 3 字符 |
externalPwdCheckUrl | "" | 外部密码检查接口 URL |
errorReporting | "default" | PHP 错误上报级别 |
allowedHostsSelfService | "" | 自助服务 IP 白名单(Pro) |
license/licenseEmail*/licenseWarningType | "" | LAM Pro 许可证设置 |
mailServer/mailUser/mailPassword/mailEncryption/mailAttribute/mailBackupAttribute | "" | 自助改密邮件通道(Pro) |
configDatabaseType | "files" | 主配置/ profile 存储方式(files 或 PDO 数据库) |
configDatabaseServer/Port/Name/User/Password/SSLCA | "" | 远程配置库连接参数(configDatabaseType 为 PDO 时生效) |
auditLogType | "NONE" | 审计日志类型(9.7 新增:FILE/REMOTE/SYSLOG/NONE) |
auditLogTarget | "" | 审计日志目标(FILE 时的文件路径 / REMOTE 时的地址) |
moduleSettings | base64 JSON | 请求访问等主配置级模块参数(Pro) |
smsProvider/smsApiKey/smsToken/smsAccountId/smsRegion/smsFrom/smsSubject/smsAttributes/smsDefaultCountryPrefix | "" | 短信通道(Pro 自助服务) |
服务器 profile lam.conf 关键键清单(出厂 profile lam 实测节选):
| 参数 | 出厂值 | 作用域 |
|---|---|---|
ServerURL | ldap://localhost:389 | 后端 LDAP 地址(可 ldaps://) |
useTLS | "no" | 是否在连接上发起 StartTLS |
followReferrals | "false" | 是否跟随引用 |
pagedResults | "false" | 是否分页查询(大目录建议开) |
searchLimit | "0" | 单次搜索结果上限(0=不限) |
serverDisplayName | "" | 登录页显示的服务器别名 |
Passwd | {CRYPT-SHA512}$6$... | profile 配置密码哈希 |
Admins | cn=admin,dc=my-domain,dc=com(出厂) | 可登录的管理员 DN 列表(分号分隔) |
activeTypes | user,group | 启用的账户类型 |
accessLevel | "100" | 界面权限级别(100/20/0,见 5.2.2) |
loginMethod | "list" | 登录方式(list=管理员列表/search=UID 搜索直登) |
loginSearchSuffix/loginSearchFilter/loginSearchDN/loginSearchPassword | 出厂占位 | search 模式四件套(见 5.2.3) |
httpAuthentication | "false" | 是否用 HTTP 基础认证替代 LAM 登录页 |
defaultLanguage | en_GB.utf8 | 默认界面语言 |
timeZone | Europe/London | 界面时区 |
typeSettings | JSON 对象 | 每个账户类型的后缀/列显示/模块(明文) |
moduleSettings | JSON 对象 | 模块级参数:UID/GID 取值范围等(明文,值为数组) |
toolSettings | JSON 对象 | 各工具(文件上传、OU 编辑器等)开关与参数 |
scriptPath/scriptServer/scriptRights/scriptUserName/scriptSSHKey | "" 等 | lamdaemon(配额/家目录管理)SSH 连接参数 |
twoFactorAuthentication 及一组 | "none" 等 | 双因素认证(WebAuthn/TOTP 等 6 种) |
pwdPolicyMinLength 等 | "" | 密码策略(可接 ppolicy) |
jobs*(jobsBindUser/jobsDatabase 等) | null | 定时任务(Pro)绑定与数据库 |
lamProMail* | 出厂模板 | 自助改密邮件模板(Pro) |
五、核心参数详解
5.1 主配置 config.cfg
5.1.1 password 与 default:主配置密码与默认 profile
default 指定登录页默认选中的 profile,也是访问 http://<服务器IP>/lam/ 时直接进入的 profile,取值必须是已存在的 profile 名。password 是主配置密码的 CRYPT-SHA512 哈希,出厂文件里没有该键(或为空)——这正是 LAM 检测"首次安装"的依据:主配置密码未设置时访问入口强制 302 到 setInitialPassword.php(实测响应头 Location: setInitialPassword.php)。
主配置密码的强度由本文件的 passwordMin* 组约束,出厂 passwordMinLength: 10 且要求含字母、数字与符号。实测把主配置密码设为 8 位纯字母数字的 q1w2e3r4 时页面拒绝并提示(抓取自响应 HTML):
class="statusTitle">Please enter at least 8 characters including letters, a number and a symbol.
改为 q1w2e3r4!(含符号)后通过。若想放宽,调低 passwordMinLength 或把字符类要求保持为 0,但生产环境不建议——主配置密码能改所有 profile 的 LDAP 管理员凭据,是 LAM 的最高权限口令。
5.1.2 sessionTimeout:会话超时(滑动窗口,实测)
sessionTimeout 是数字(分钟),出厂 30。它的实现是滑动窗口而非绝对过期:LAM 每次收到已登录请求时检查"会话计时 + N 分钟是否晚于当前时间",是则把计时刷新为当前时间(源码 lib/security.inc 第 131 行起):
if (($_SESSION['sec_sessionTime'] + (60 * $_SESSION['cfgMain']->sessionTimeout)) > time()) {
// ok, update time
$_SESSION['sec_sessionTime'] = time();
}
解读:只要两次请求间隔不超过 N 分钟,会话永不淘汰;连续无操作超过 N 分钟才会被踢。实测把 sessionTimeout 改为 1(数字),登录成功后静置 70 秒再访问主界面,返回的不是主界面而是一段 594 字节的跳转页(HTTP 状态码仍是 200,跳转由页面内 JS 完成):
<script type="text/javascript">
top.location.href = "./login.php?expired=yes";
</script>
<p>
<a target="_top" href="./login.php?expired=yes">Your session expired, click here to go back to the login page.</a>
</p>
而另一组对照实测:登录后每 40 秒访问一次(第 40 秒、第 80 秒各一次),第 80 秒的访问距上次活动仅 40 秒(小于 60 秒超时),会话依然有效。两组实测合并验证了滑动窗口语义。运维含义:反向代理或健康检查若周期性请求 LAM 页面,会不断"续命",看似永不超时——健康检查路径应选未登录可访问的地址。
5.1.3 logLevel 与 logDestination:日志级别与去向
logLevel 是数字,语义来自 PHP 的 syslog 级别常量(源码 lib/security.inc 的 logNewMessage() 只认四级,出厂 4):
| 数值 | 级别 | 实测记录到的典型内容 |
|---|---|---|
| 3 | ERROR | 登录失败、连接失败、无法读取 profile |
| 4 | WARNING(默认) | locale 警告、IP 变更拒绝、会话 ID 无效 |
| 5 | NOTICE | 登录成功 |
| 7 | DEBUG | 打开登录页、连接 LDAP、读会话等全流程 |
注意没有 6(INFO)档——LAM 的级别表跳过了它,设 6 等价于 7 之上的非标准值会被 logNewMessage 视为非法级别。级别判定为 $cfg->logLevel < $level 即丢弃,因此 4 能记录 ERROR+WARNING,7 记录全部。
logDestination 有四种取值,全部实测或按源码核实:
取值一:SYSLOG(出厂值)。日志经 PHP syslog() 交系统 syslog 服务(journald/rsyslog)。前提是系统的 /dev/log socket 可用——本测试环境中 systemd-journald 服务启动失败(systemctl is-active systemd-journald 返回 failed,logger 报 socket /dev/log: Connection refused),此时 SYSLOG 模式静默丢弃日志且无任何报错。这是 SYSLOG 模式排障的第一步:先确认 logger test 的消息能在 journalctl 里看到。
取值二:文件路径(如 /var/log/lam/lam.log)。逐行追加写文件。实测设为 /tmp/lam.log、logLevel 改 7 后,登录流程的完整 DEBUG 日志(原文摘录,会话 ID 以 <session> 代替):
2026-10-28 11:36:57: LDAP Account Manager (<session> - 127.0.0.1 - ) - DEBUG: Display login page
2026-10-28 11:36:57: LDAP Account Manager (<session> - 127.0.0.1 - cn=admin,dc=example,dc=net) - DEBUG: Connecting to LDAP server ldap://localhost:389
2026-10-28 11:36:57: LDAP Account Manager (<session> - 127.0.0.1 - cn=admin,dc=example,dc=net) - NOTICE: User cn=admin,dc=example,dc=net (127.0.0.1) successfully logged in.
2026-10-28 11:39:55: LDAP Account Manager (<session> - 127.0.0.1 - cn=admin,dc=example,dc=net) - ERROR: User cn=admin,dc=example,dc=net (127.0.0.1) failed to log in (wrong password). LDAP error, server says: Invalid credentials
2026-10-28 11:36:57: LDAP Account Manager (<session> - 127.0.0.1 - ) - WARNING: Unable to set locale, check if 'locale -a' returns en_GB.utf8
逐项说明:行格式为 时间: 前缀(session - 客户端IP - 绑定DN) - 级别: 消息,注意时间后带冒号;登录失败行会带上 LDAP 底层错误(Invalid credentials),排障价值很高;Unable to set locale 警告来自系统缺 en_GB.utf8 locale,装上对应 locale 即消除,不影响功能。
但这里有一个必须沉淀的排障实录:文件路径写 /tmp/lam.log 时,Web 端确实在写,却在 /tmp 下永远找不到文件。根因是 Debian 的 apache2.service 默认开启 PrivateTmp=yes(实测 systemctl show apache2 -p PrivateTmp 返回 PrivateTmp=yes),Apache 进程的 /tmp 被 systemd 映射到私有目录,实际文件落在:
ls -la /tmp/systemd-private-*/tmp/
实测回显:
-rw-r--r-- 1 www-data www-data 19235 Oct 28 11:42 lam.log
(完整路径形如 /tmp/systemd-private-<hash>-apache2.service-XXXX/tmp/lam.log,<hash> 每台机器不同。)结论:文件日志不要写 /tmp,生产环境应指向专用目录如 /var/log/lam/lam.log 并确保属主 www-data 可写。
另外,文件路径需通过 LAM 自身的合法性检查(源码 isValidLogFilename()):不得位于 /usr、/etc、/dev、/boot、/lib、/proc、/root、/run、/sys、/snap 或 Web 根目录内,且必须以 .log 或 .txt 结尾、路径中不得出现 ..。不合法的路径同样静默不写——文件日志"没内容"时按"路径合法性 → 目录写权限 → PrivateTmp"三步排查,本篇三个坑全踩过。
取值三:REMOTE(可写 REMOTE 或 REMOTE:<host>:<port>)。日志转发到远程 syslog 接收端,适合把多台 LAM 的日志集中。未搭建接收端时同样静默失败,本文未展开实测。
取值四:NONE。完全关闭运行日志(审计日志不受影响,见下节)。
5.1.4 auditLogType 与 auditLogTarget:审计日志(9.7 新增)
9.7 引入的可选审计日志,独立于运行日志:auditLogType 取 NONE(默认,关)/FILE/REMOTE/SYSLOG,auditLogTarget 在 FILE 模式下填文件路径。它与 logDestination 是两套开关——logDestination: NONE 不影响审计记录。
实测开启(auditLogType: "FILE"、auditLogTarget: "/var/lib/ldap-account-manager/tmp/lam-audit.log")后,失败登录与成功登录各触发一条(原文摘录):
2026-10-28 11:39:55 LDAP Account Manager AuditLog (<session> - 127.0.0.1 - cn=admin,dc=example,dc=net) - Login failed for server profile: lam
2026-10-28 11:39:55 LDAP Account Manager AuditLog (<session> - 127.0.0.1 - cn=admin,dc=example,dc=net) - Login to server profile: lam
search 直登模式下记录的是实际绑定的用户 DN:
2026-10-28 11:45:39 LDAP Account Manager AuditLog (<session> - 127.0.0.1 - uid=tester1,ou=people,dc=example,dc=net) - Login to server profile: lam
逐项说明:审计行格式与运行日志不同——时间后没有冒号,前缀多 AuditLog 字样;除登录事件外,9.7 的审计日志主要记录对目录的变更操作(官方发布说明口径:audit log 记录全部 LDAP 变更),登录事件也走同一文件。
审计文件不落盘的排障实录(黄金 FAQ):最初把 auditLogTarget 设为 /var/lib/ldap-account-manager/lam-audit.log,触发多次登录文件始终不生成。排查路径:JSON 合法(php -r json_decode 通过)→ 路径合法(不在屏蔽目录、.log 结尾)→ 最终定位目录写权限:
ls -ld /var/lib/ldap-account-manager
runuser -u www-data -- touch /var/lib/ldap-account-manager/lam-audit.log
实测回显:
drwxr-xr-x 5 root root 4096 Oct 28 11:22 /var/lib/ldap-account-manager
touch: cannot touch '/var/lib/ldap-account-manager/lam-audit.log': Permission denied
根因:deb 包安装后 /var/lib/ldap-account-manager/ 本身属主是 root:root(只有其下 config/、sess/、tmp/ 三个子目录属 www-data),LAM 写审计文件时 touch 失败被 @ 静默吞掉。解决二选一:把 auditLogTarget 指向已有写权限的位置(实测 /var/lib/ldap-account-manager/tmp/lam-audit.log 落盘成功),或手工 chown www-data 自建日志目录。改完用失败登录验证文件出现即可。
5.1.5 密码策略组:passwordMin*
这一组约束的是主配置密码(保护配置界面的那把钥匙),不是用户密码——用户密码策略在 profile 的 pwdPolicy* 与模块设置里。字段:passwordMinLength(长度)、passwordMinUpper/Lower/Numeric/Symbol(各类字符最少个数)、passwordMinClasses(至少覆盖几类字符)、checkedRulesCount(需命中的规则条数,-1 为全部)、passwordMustNotContainUser(禁含用户名)、passwordMustNotContain3Chars(禁含 3 连续字符)、externalPwdCheckUrl(调外部接口校验)。全部为数字或布尔,出厂仅 passwordMinLength: 10 非零。实测弱密码拒绝行为见 5.1.1。
5.1.6 configDatabase*:配置存储位置
configDatabaseType: "files"(默认)表示主配置与 profile 都落本地文件;改为 PDO 相关值后,configDatabaseServer/Port/Name/User/Password/SSLCA 生效,配置集中存到数据库,适合多台 LAM 共享配置。本文按默认 files 模式实测,多机共享配置的部署建议先在测试环境演练迁移。
5.2 服务器 profile lam.conf
5.2.1 连接组:ServerURL、useTLS、followReferrals、pagedResults、searchLimit
ServerURL 是后端 LDAP 地址,支持 ldap:// 与 ldaps://。useTLS 决定是否在 ldap:// 连接上再发起 StartTLS(ldaps:// 时无需也不应再开)。实测后端 slapd 未配置 TLS 时把 useTLS 改为 "yes",登录直接报错(HTTP 403,页面提示原文):
class="statusTitle">Cannot connect to specified LDAP server. Please try again.
底层行为与命令行 StartTLS 一致,ldapsearch -x -ZZ -H ldap://localhost ... 的原生报错可作对照:
ldap_start_tls: Protocol error (2)
additional info: unsupported extended operation
即服务器根本不支持 StartTLS 扩展操作。生产启用 TLS 的正确路径:给 slapd 配置证书(olcTLSCertificateFile 等)后再开 useTLS,或直接改用 ldaps://。
其余三个:followReferrals(分布式目录引用,单机关闭)、pagedResults(Simple Paged Results 分页,目录条目上万后建议 "true",避免一次搜索超时)、searchLimit(单次搜索上限条数,0 不限)。
5.2.2 管理与权限:Admins、Passwd、accessLevel
Admins 是允许登录本 profile 的 DN 列表(多个 DN 用分号分隔),出厂值 cn=admin,dc=my-domain,dc=com 必须改成你的目录管理员——同时 profile 文件里 typeSettings 的后缀(出厂 ou=People,dc=my-domain,dc=com)也要对应修改,否则首次登录初始化后缀时会被后端拒绝(实测报 Server is unwilling to perform (53) no global superior knowledge,即 LDAP 库里没有该后缀的父节点)。改完 profile 文件后必须重新登录,旧会话缓存的是旧 profile。
accessLevel 是字符串形式的数字,三档(源码 lib/config.inc 常量):"100" 全权读写、"20" 仅允许改密码、"0" 只读。实测 "0" 时的界面行为:登录正常,用户列表照常显示 tester1,但 New user 按钮消失(页面中 New user 出现次数为 0;恢复 "100" 后同页计数为 1)。适合给"只看不改"的审计/值班账号用——配合单独的只读 LDAP 绑定账号更稳妥(LAM 界面隐藏了按钮,但应避免把 Admins 里的高权 DN 泄露给只读用户)。
5.2.3 登录方式:loginMethod 与 search 四件套
loginMethod: "list"(出厂)为管理员列表模式:登录页下拉选择 DN,输入的是完整 DN(如 cn=admin,dc=example,dc=net)。
loginMethod: "search" 为搜索直登模式:用户输入短账号名(如 tester1),LAM 先用 loginSearchDN/loginSearchPassword 绑定目录,在 loginSearchSuffix 内按 loginSearchFilter 找到唯一条目,再用该条目 DN 与用户输入的密码完成最终绑定。实测配置:
"loginMethod": "search",
"loginSearchSuffix": "dc=example,dc=net",
"loginSearchFilter": "uid=%USER%",
"loginSearchDN": "cn=admin,dc=example,dc=net",
"loginSearchPassword": "q1w2e3r4"
实测结果:username=tester1&passwd=q1w2e3r4 登录成功(HTTP 302),审计日志记录实际绑定 DN 为 uid=tester1,ou=people,dc=example,dc=net;错误密码报 Wrong password/user name combination. Please try again.(HTTP 403)。两个易错点:其一,%USER% 是占位符,过滤条件必须含它;其二,search 模式下输入框期望的是 uid 短名——输入 DN 会报 Unable to find the user name in LDAP.(实测用 cn=admin,dc=example,dc=net 当用户名触发),且目录管理员的 DN(cn=admin 根条目)不含 uid 属性,天然无法通过 uid 搜索命中,管理员账号通常仍需 list 模式或单独建带 uid 的管理条目。loginSearchDN 建议用只读绑定账号而非目录管理员,明文密码落盘在 lam.conf,务必保证该文件权限(见第二节)。
5.2.4 账户类型:activeTypes 与 typeSettings
activeTypes 决定主界面出现哪些页签(如 user,group)。每个类型的细节在 typeSettings 里,实测结构:
"typeSettings": {
"suffix_user": "ou=people,dc=example,dc=net",
"attr_user": "#uid;#givenName;#sn;#uidNumber;#gidNumber",
"modules_user": "inetOrgPerson,posixAccount,shadowAccount",
"suffix_group": "ou=groups,dc=example,dc=net",
"attr_group": "#cn;#gidNumber;#memberUID;#description",
"modules_group": "posixGroup"
}
逐项说明:suffix_<type> 是该类型条目的容器后缀(首次登录的 initsuff 向导建的就是这两个 OU);modules_<type> 是该类型启用的对象类模块组合(用户=inetOrgPerson+posixAccount+shadowAccount,即"person+POSIX 账号+密码时效"三件套);attr_<type> 是列表页显示列(# 前缀表示按属性名取值)。增减页签改 activeTypes;调列表列改 attr_*;换对象类组合改 modules_*——三者都可在 Web 界面(Edit server profiles → Types 选项卡)完成,手改文件注意保持 JSON 结构。
5.2.5 模块参数:moduleSettings
模块级参数也是明文 JSON,值为字符串数组(实测):
"moduleSettings": {
"posixAccount_user_minUID": ["10000"],
"posixAccount_user_maxUID": ["30000"],
"posixGroup_group_minGID": ["10000"],
"posixGroup_group_maxGID": ["20000"]
}
键名规则为 <模块>_<类型>_<参数名>。minUID/maxUID、minGID/maxGID 约束建户建组时编号的合法区间与自动分配范围,多套环境共用同一 LDAP 时务必错开区间避免编号冲突。
5.2.6 其余实用项
timeZone(界面时区,影响日志时间与过期判断的展示,出厂 Europe/London,国内建议 Asia/Shanghai);defaultLanguage(出厂 en_GB.utf8,中文界面用 zh_CN.utf8,需系统已生成该 locale);httpAuthentication(改为 "true" 后由 Web 服务器的 HTTP 认证替身登录,适合接 SSO 网关);hideDnPart(列表页隐藏 DN 前缀段);twoFactorAuthentication(双因素开关,取值 none 外还有 WebAuthn/TOTP 等,相关键一组,本文未实测);scriptPath/scriptServer/scriptRights(lamdaemon 的 SSH 参数,配额与家目录自动管理用,命令行工具实测见 《LDAP Account Manager 9.7 常用 CLI 命令与工具详解》)。
六、生产配置模板
一份经过本文全部实测验证的安全基线(Debian deb 布局路径),可直接作为初始化后的调整清单:
/etc/ldap-account-manager/config.cfg 建议项:
{
"default": "lam",
"sessionTimeout": 30,
"logLevel": 5,
"logDestination": "/var/log/lam/lam.log",
"allowedHosts": "10.0.0.0/8",
"passwordMinLength": 12,
"auditLogType": "FILE",
"auditLogTarget": "/var/log/lam/lam-audit.log"
}
配套准备(www-data 必须可写日志目录):
mkdir -p /var/log/lam && chown www-data:www-data /var/log/lam && chmod 750 /var/log/lam
逐项说明:logLevel: 5 记录 NOTICE 及以上(登录成功/失败都在),排障时临时调 7;日志与审计集中到 /var/log/lam,避开 /tmp 的 PrivateTmp 坑;allowedHosts 限定管理网段;sessionTimeout: 30 兼顾安全与体验。
/var/lib/ldap-account-manager/config/lam.conf 建议项(节选):
{
"ServerURL": "ldap://ldap01.example.net:389",
"useTLS": "yes",
"followReferrals": "false",
"pagedResults": "true",
"Admins": "cn=admin,dc=example,dc=net",
"accessLevel": "100",
"loginMethod": "search",
"loginSearchSuffix": "dc=example,dc=net",
"loginSearchFilter": "(uid=%USER%)",
"loginSearchDN": "cn=lam-ro,dc=example,dc=net",
"timeZone": "Asia/Shanghai",
"activeTypes": "user,group"
}
逐项说明:后端用独立主机名而非 localhost(支持后端迁移);useTLS: yes 前提是 slapd 已配好证书(见 5.2.1,否则连不上);pagedResults 应对大目录;search 直登用只读绑定账号 cn=lam-ro(在目录里预建并只授读权限);accessLevel: 100 供管理账号,审计/值班场景单独复制一份 profile 设 "0"。
改完校验 JSON(第三节路径 B 的 php -r 命令),然后重新登录使新配置进入会话。
七、常见问题
Q1:文件日志设了路径却没有任何文件?
按三步排查:① 路径是否通过 LAM 合法性检查(不能在 /usr、/etc、/proc 等目录内,必须 .log/.txt 结尾);② 目录对 www-data 是否可写(runuser -u www-data -- touch <路径>);③ 若写在 /tmp,文件其实落在 /tmp/systemd-private-<hash>-apache2.service-*/tmp/ 下(Debian apache2 的 PrivateTmp=yes,实测见 5.1.3)。此外确认改动后用了新会话访问。
Q2:审计日志(9.7)配了 auditLogTarget 却不落盘?
最常见根因是 /var/lib/ldap-account-manager/ 本身属主为 root,www-data 无写权限,而 LAM 对 touch 失败做了静默处理(实测见 5.1.4)。把 auditLogTarget 指到 www-data 可写目录(如自建 /var/log/lam/)或修正属主即可。审计行时间后无冒号、前缀含 AuditLog,别和运行日志混看。
Q3:SYSLOG 模式没有任何日志输出?
先验证系统 syslog 通道:logger test 后 journalctl | grep test。若 /dev/log 连接被拒(journald 未运行或 rsyslog 未装),PHP syslog() 会静默失败。修复系统 syslog 服务或改用文件模式。
Q4:手工改了配置文件但界面没变化?
配置在会话建立时读入并缓存,旧会话不会重新读文件。退出重新登录即可,无需重启 Apache(实测验证)。另外检查 sed 是否匹配到了带引号的字符串值——logLevel、sessionTimeout 是不带引号的数字。
Q5:开启 useTLS 后登录报 Cannot connect to specified LDAP server?
后端不支持 StartTLS(实测对照:ldap_start_tls: Protocol error (2) unsupported extended operation)。给 slapd 配置证书并监听 StartTLS,或改用 ldaps:// 并去掉 useTLS。
Q6:search 模式登录报 Unable to find the user name in LDAP?
输入框期望 uid 短名而非 DN;确认 loginSearchFilter 含 %USER% 占位符、loginSearchSuffix 覆盖目标条目、loginSearchDN 有搜索权限。目录管理员 DN(如 cn=admin,dc=...)通常无 uid 属性,搜不到属预期(实测见 5.2.3)。
Q7:首次登录初始化后缀报 Server is unwilling to perform?
profile 出厂后缀(dc=my-domain,dc=com)与实际目录不符,后端拒绝在没有父节点的位置建 OU。改 typeSettings 的 suffix_* 为真实后缀后重新登录再初始化(实测报错原文见 5.2.2)。
Q8:主配置密码设了简单值被拒?
主配置密码策略由 passwordMin* 组约束,出厂要求至少 8 字符且含字母、数字、符号(实测拒绝提示见 5.1.1)。q1w2e3r4! 这类含符号值可通过。
八、参考链接
- 专栏系列:《LDAP Account Manager 介绍与选型指南》(架构与选型)、《Debian 13 安装 LDAP Account Manager 9.7 指南》(安装与初始化)、《LDAP Account Manager 9.7 常用 CLI 命令与工具详解》(命令行运维)
- 官方文档:LDAP Account Manager manual(发行包内
docs/manual/index.html,含配置章节与 FAQ) - 源码参考:GitHub
LDAPAccountManager/lam9.7 版lib/security.inc(logNewMessage/logAuditMessage/会话超时)、lib/config.inc(accessLevel 常量与配置键定义) - 关联阅读:《389 Directory Server 介绍与选型指南》、《FreeIPA 介绍与选型指南》(后端目录选型)