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 ManagerLDAP Account ManagerLDAP 协议PHP 编程2026/10/28

LDAP Account Manager 9.7 配置参数详解

目标:讲清 LDAP Account Manager(LAM)两级配置文件的全部关键参数——主配置 config.cfg 与服务器 profile lam.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)
defaultlam默认服务器 profile 名
sessionTimeout30会话超时(分钟,滑动窗口,见 5.1.2)
hideLoginErrorDetails"false"登录页是否隐藏错误细节
logLevel4日志级别(3=ERROR/4=WARNING/5=NOTICE/7=DEBUG)
logDestination"SYSLOG"日志去向(SYSLOG/REMOTE/NONE/文件路径)
allowedHosts""管理界面 IP 白名单(空=不限制)
passwordMinLength10主配置密码最小长度
passwordMinUpper/MinLower/MinNumeric/MinClasses/MinSymbol0主配置密码字符类要求
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 时的地址)
moduleSettingsbase64 JSON请求访问等主配置级模块参数(Pro)
smsProvider/smsApiKey/smsToken/smsAccountId/smsRegion/smsFrom/smsSubject/smsAttributes/smsDefaultCountryPrefix""短信通道(Pro 自助服务)

服务器 profile lam.conf 关键键清单(出厂 profile lam 实测节选):

参数出厂值作用域
ServerURLldap://localhost:389后端 LDAP 地址(可 ldaps://)
useTLS"no"是否在连接上发起 StartTLS
followReferrals"false"是否跟随引用
pagedResults"false"是否分页查询(大目录建议开)
searchLimit"0"单次搜索结果上限(0=不限)
serverDisplayName""登录页显示的服务器别名
Passwd{CRYPT-SHA512}$6$...profile 配置密码哈希
Adminscn=admin,dc=my-domain,dc=com(出厂)可登录的管理员 DN 列表(分号分隔)
activeTypesuser,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 登录页
defaultLanguageen_GB.utf8默认界面语言
timeZoneEurope/London界面时区
typeSettingsJSON 对象每个账户类型的后缀/列显示/模块(明文)
moduleSettingsJSON 对象模块级参数:UID/GID 取值范围等(明文,值为数组)
toolSettingsJSON 对象各工具(文件上传、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):

数值级别实测记录到的典型内容
3ERROR登录失败、连接失败、无法读取 profile
4WARNING(默认)locale 警告、IP 变更拒绝、会话 ID 无效
5NOTICE登录成功
7DEBUG打开登录页、连接 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! 这类含符号值可通过。

八、参考链接