LDAP_TABLE(5) LDAP_TABLE(5)
名称
ldap_table - Postfix LDAP 客户端配置
概述
postmap -q "字符串" ldap:/etc/postfix/文件名
postmap -q - ldap:/etc/postfix/文件名 <输入文件
描述
Postfix 邮件系统使用可选表进行地址重写或邮件路由。这些表通常采用 dbm 或 db 格式。
此外,查找表也可以指定为 LDAP 数据库。
要使用 LDAP 查找,需要在 main.cf 中将 LDAP 源定义为查找表,例如:
alias_maps = ldap:/etc/postfix/ldap-aliases.cf
文件 /etc/postfix/ldap-aliases.cf 的格式与 Postfix main.cf 文件相同,可以指定下文描述的参数。本手册末尾提供了一个示例。
此配置方法适用于 Postfix 2.1 及更高版本。关于旧版 Postfix 的配置,请参阅下文"过时的 MAIN.CF 参数"部分。
有关 LDAP SSL 和 STARTTLS 的详细信息,请参阅下文"SSL 和 STARTTLS"部分。
列表成员资格
当使用 LDAP 存储诸如 $mynetworks、$mydestination、$relay_domains、$local_recipient_maps 等列表时,必须理解表需要将每个列表成员存储为单独的键。表查找操作会验证键的*存在性*。有关详细讨论,请参阅 DATABASE_README 文档中的"Postfix 列表与表"部分。
切勿创建返回 $mydestination 或 $relay_domains 中所有域的完整列表的表,或者返回 $mynetworks 中所有 IP 地址的表。
应该创建将每个匹配项作为键并带有任意值的表。对于 LDAP 数据库,返回键本身的情况并不少见。
例如,在定义 $mydestination 的映射中,切勿这样做:
query_filter = domain=*
result_attribute = domain
应该改为:
query_filter = domain=%s
result_attribute = domain
通用 LDAP 参数
下文中,默认值用括号表示。注意:不要在变量中使用引号,至少在 Postfix 配置例程能够正确处理带引号的字符串之前不要使用。
server_host (默认:localhost)
运行 LDAP 服务器的主机名,例如:
server_host = ldap.example.com
根据您使用的 LDAP 客户端库,可以在此指定多个服务器,库会在第一个服务器失败时按顺序尝试其他服务器。也可以通过类似以下方式为列表中的每个服务器指定不同端口(覆盖下面的 server_port):
server_host = ldap.example.com:1444
注意:此客户端在单次失败后会立即重新连接,并在第二次尝试也失败后放弃查找请求。
使用 OpenLDAP 时,可以使用 LDAP URL(列表)同时指定主机名和端口:
server_host = ldap://ldap.example.com:1444
ldap://ldap2.example.com:1444
OpenLDAP 库支持的所有 LDAP URL 都受支持,包括通过 UNIX 域套接字的连接和 LDAP SSL(最后一项需要 OpenLDAP 编译时支持 SSL):
server_host = ldapi://%2Fsome%2Fpath
ldaps://ldap.example.com:636
server_port (默认:389)
LDAP 服务器监听的端口,例如:
server_port = 778
timeout (默认:10 秒)
搜索操作在超时前可以持续的最长时间(秒),例如:
timeout = 5
search_base (无默认值;必须配置)
按照 RFC2253 标准进行搜索的基础 DN,例如:
search_base = dc=your, dc=com
Postfix 2.2 及更高版本中,此参数支持以下'%'扩展:
%% 替换为字面的'%'字符。
%s 替换为输入键。使用 RFC 2253 引用确保输入键不会添加意外的元字符。
%u 当输入键是 user@domain 格式的地址时,%u 替换为地址的本地部分(RFC 2253 引用格式)。否则,%u 替换为整个搜索字符串。如果本地部分为空,则取消搜索并返回无结果。
%d 当输入键是 user@domain 格式的地址时,%d 替换为地址的域部分(RFC 2253 引用格式)。否则,取消搜索并返回无结果。
%[SUD] 对于 search_base 参数,上述扩展的大写形式与其小写形式行为完全相同。对于 result_format 参数(以前称为 result_filter,请参阅"其他过时功能"部分和下文),它们扩展为输入键的相应组件而非结果值。
%[1-9] 模式 %1、%2、... %9 替换为输入键域中最显著的组件。如果输入键是 [email protected],则 %1 是 com,%2 是 example,%3 是 mail。如果输入键未限定或没有足够的域组件来满足所有指定模式,则取消搜索并返回无结果。
query_filter (默认:mailacceptinggeneralid=%s)
用于搜索目录的 RFC2254 过滤器,其中 %s 是 Postfix 尝试解析的地址的占位符,例如:
query_filter = (&(mail=%s)(paid_up=true))
此参数支持以下'%'扩展:
%% 替换为字面的'%'字符。(Postfix 2.2 及更高版本)
%s 替换为输入键。使用 RFC 2254 引用确保输入键不会添加意外的元字符。
%u 当输入键是 user@domain 格式的地址时,%u 替换为地址的本地部分(RFC 2254 引用格式)。否则,%u 替换为整个搜索字符串。如果本地部分为空,则取消搜索并返回无结果。
%d 当输入键是 user@domain 格式的地址时,%d 替换为地址的域部分(RFC 2254 引用格式)。否则,取消搜索并返回无结果。
%[SUD] 上述扩展的大写形式在 query_filter 参数中与其小写形式行为完全相同。对于 result_format 参数(以前称为 result_filter,请参阅"其他过时功能"部分和下文),它们扩展为输入键的相应组件而非结果值。
上述 %S、%U 和 %D 扩展在 Postfix 2.2 及更高版本中可用。
%[1-9] 模式 %1、%2、... %9 替换为输入键域中最显著的组件。如果输入键是 [email protected],则 %1 是 com,%2 是 example,%3 是 mail。如果输入键未限定或没有足够的域组件来满足所有指定模式,则取消搜索并返回无结果。
上述 %1、...、%9 扩展在 Postfix 2.2 及更高版本中可用。
下文描述的"domain"参数将输入键限制为匹配域中的地址。当"domain"参数非空时,对未限定地址或非匹配域中地址的 LDAP 查询将被取消并返回无结果。
注意:不要在 query_filter 参数周围加引号。
result_format (默认:%s)
在 Postfix 2.2 之前的版本中称为 result_filter。应用于结果属性的格式模板。最常用于在结果前后附加文本。此参数支持以下'%'扩展:
%% 替换为字面的'%'字符。(Postfix 2.2 及更高版本)
%s 替换为结果属性的值。当结果为空时跳过。
%u 当结果属性值是 user@domain 格式的地址时,%u 替换为地址的本地部分。当结果的本地部分为空时跳过。
%d 当结果属性值是 user@domain 格式的地址时,%d 替换为属性值的域部分。当结果未限定时跳过。
%[SUD1-9]
大写和数字扩展插入输入键的相应部分而非结果。它们的行为与 query_filter 中描述的完全相同,事实上由于输入键是预先知道的,如果键不包含结果模板中指定的所有信息,查找将被取消并返回无结果。
上述 %S、%U、%D 和 %1、...、%9 扩展在 Postfix 2.2 及更高版本中可用。
例如,使用"result_format = smtp:[%s]"可以使用 mailHost 属性作为 transport(5) 表的基础。应用结果格式后,多个值将连接为逗号分隔的字符串。下文解释的 expansion_limit 和 size_limit 参数可以限制结果中的值数量,这对于应返回单个值的映射特别有用。
默认值 %s 指定每个属性值应按原样使用。
此参数在 Postfix 2.2 之前的版本中称为 result_filter。如果未指定"result_format",将使用"result_filter"的值(如果存在),然后才使用默认值。这提供了与旧配置文件的兼容性。
注意:不要在结果格式周围加引号!
domain (默认:无域列表)
这是一个域名列表、文件路径或"type:table"数据库。当指定时,只有具有非空本地部分且域匹配的完全限定搜索键才符合查找条件:'user'查找、裸域查找和"@domain"查找将不会执行。这可以显著减少 LDAP 服务器上的查询负载。
domain = postfix.org, hash:/etc/postfix/searchdomains
最好不要使用 LDAP 来存储符合 LDAP 查找条件的域。
注意:不要为 local(8) 别名定义此参数。
此功能在 Postfix 1.0 及更高版本中可用。
result_attribute (默认:maildrop)
Postfix 将从目录返回的任何条目中读取的属性,用于解析为电子邮件地址。
result_attribute = mailbox, maildrop
不要依赖默认值("maildrop")。在所有 ldap 表配置文件中显式设置 result_attribute。这在没有 result_attribute 适用时特别重要,例如使用 leaf_result_attribute 和/或 terminal_result_attribute 的情况。如果"maildrop"也被列为叶或终端结果属性,默认值是安全的,但最好不要依赖这种情况。
special_result_attribute (默认:空)
可以包含 DN 或 RFC 2255 LDAP URL 的目录条目属性。如果找到,将执行递归搜索以检索 DN 引用的条目或 URL 查询匹配的条目。
special_result_attribute = memberdn
DN 递归检索与主查询相同的 result_attributes,包括用于进一步递归的特殊属性。
URL 处理仅检索那些同时包含在 URL 定义和 Postfix 表定义中的 result_attributes(普通、特殊、叶或终端)的属性。如果 URL 列出了表的任何特殊结果属性,这些属性将被检索并递归使用。未指定任何属性选择的 URL 等同于(RFC 2255)选择所有属性的 URL,此时所选属性将是 Postfix 表中结果属性的完整集合。
如果 LDAP URL 属性描述符或相应的 Postfix LDAP 表结果属性(但不是两者)使用 RFC 2255 子类型选项("attr;option"),从 LDAP 服务器请求的属性将包含子类型选项。在所有其他情况下,URL 属性和表属性必须完全匹配。同时在 URL 和 Postfix 表中包含选项的属性仅在选项完全相同时才会被请求。LDAP 属性描述符选项很少使用,大多数 LDAP 用户不需要关注这个细节级别。
terminal_result_attribute (默认:空)
当在 LDAP 条目中找到一个或多个终端结果属性时,所有其他结果属性将被忽略,只返回终端结果属性。这对于将组成员的扩展委托给特定主机很有用,通过在选定的组上使用可选的"maildrop"属性将组路由到特定主机,在那里组可能通过邮件列表管理器或其他特殊处理进行扩展。
result_attribute =
terminal_result_attribute = maildrop
当使用终端和/或叶结果属性时,最好将 result_attribute 设置为空值(当不使用它时),或者显式设置为所需值,即使它是默认值"maildrop"。
此功能在 Postfix 2.4 或更高版本中可用。
leaf_result_attribute (默认:空)
当在非终端(见上文)LDAP 条目中找到一个或多个特殊结果属性时,叶结果属性将从该条目的扩展中排除。这在扩展组时很有用,当通过 DN 或 URI 递归获取的成员对象的所需邮件地址属性也存在于组对象中时。要仅从叶对象而非包含组返回属性值,请将属性添加到 leaf_result_attribute 列表,而不是 result_attribute 列表,后者总是会被扩展。注意,result_attribute 的默认值不为空,当使用"leaf_result_attribute"将组扩展为成员 DN 地址列表时,您可能需要显式将其设置为空。如果组同时包含成员 DN 引用和保存多个字符串值 RFC 822 地址的属性,则字符串属性应放在"result_attribute"中。表示通过 DN(或 LDAP URI)引用的对象的电子邮件地址的属性应放在"leaf_result_attribute"中。
result_attribute = memberaddr
special_result_attribute = memberdn
terminal_result_attribute = maildrop
leaf_result_attribute = mail
当使用终端和/或叶结果属性时,最好将 result_attribute 设置为空值(当不使用它时),或者显式设置为所需值,即使它是默认值"maildrop"。
此功能在 Postfix 2.4 或更高版本中可用。
scope (默认:sub)
LDAP 搜索范围:sub、base 或 one。这些对应于 LDAP_SCOPE_SUBTREE、LDAP_SCOPE_BASE 和 LDAP_SCOPE_ONELEVEL。
bind (默认:yes)
是否以及如何绑定到 LDAP 服务器。较新的 LDAP 实现不需要客户端绑定,这可以节省时间。例如:
# 不绑定
bind = no
# 使用 SIMPLE 绑定
bind = yes
# 使用 SASL 绑定
bind = sasl
Postfix 2.8 之前的版本仅支持"bind = no"(表示不绑定)和"bind = yes"(表示执行 SIMPLE 绑定)。Postfix 2.8 及更高版本在编译时启用 LDAP SASL 支持(如 LDAP_README 中所述)时还支持"bind = sasl",并添加了同义词"bind = none"和"bind = simple"分别对应"bind = no"和"bind = yes"。有关"bind = sasl"可用的其他参数,请参阅下文 SASL 部分。
如果您确实需要绑定,可以考虑配置 Postfix 通过 SSL 隧道连接到本地机器的某个端口以访问 LDAP 服务器。如果 LDAP 服务器本身不支持 SSL,请在该系统上也部署一个隧道(包装器、代理等)。这应该可以防止密码在网络中以明文传输。
bind_dn (默认:空)
如果需要绑定,请使用此专有名称进行绑定。例如:
bind_dn = uid=postfix, dc=your, dc=com
使用"bind = sasl"(见上文)时,某些 SASL 机制可能不需要 DN,此时不应指定。
bind_pw (默认:空)
上述专有名称的密码。如果必须使用此选项,您可能希望使映射配置文件仅对 Postfix 用户可读。当使用过时的 ldap:ldapsource 语法时,将映射参数放在 main.cf 中,无法安全地存储绑定密码,因为 main.cf 需要全局可读以允许本地账户通过 sendmail 命令提交邮件。例如:
bind_pw = postfixpw
使用"bind = sasl"(见上文)时,某些 SASL 机制可能不需要密码,此时不应指定。
cache (忽略并显示警告)
cache_expiry (忽略并显示警告)
cache_size (忽略并显示警告)
上述参数不再被 Postfix 支持。缓存支持已从 OpenLDAP 2.1.13 版本中移除。
recursion_limit (默认:1000)
DN 和 URL 特殊结果属性评估的嵌套深度限制。限制必须是非零正数。
expansion_limit (默认:0)
对映射查找返回的结果元素总数(以逗号分隔的列表形式)的限制。设置为 0 表示禁用限制。如果超过限制,查找将以临时错误失败。将限制设置为 1 可确保查找不会返回多个值。
size_limit (默认:$expansion_limit)
对作为查找一部分执行的任何单个 LDAP 搜索返回的 LDAP 条目数的限制。设置为 0 表示禁用限制。DN 和 URL 引用的扩展涉及嵌套的 LDAP 查询,每个查询都单独受此限制约束。
注意:即使是单个 LDAP 条目也可以通过多个结果属性和/或多值结果属性生成多个查找结果。此限制对每次搜索在 LDAP 服务器上的资源使用进行上限限制,而不是最终查找结果的多重性。它与"ldapsearch"的"-z"选项类似。
dereference (默认:0)
何时解析 LDAP 别名。(注意:这与 Postfix 别名无关。)允许的值与 OpenLDAP/UM LDAP 实现中合法的值相同:
0 从不
1 搜索时
2 定位搜索的基对象时
3 总是
更多信息请参阅 ldap.h 或 ldap_open(3) 或 ldapsearch(1) 手册页。如果您使用的 LDAP 包有其他可能的值,请将此情况反馈至 [email protected] 邮件列表。
chase_referrals (默认:0)
设置(或清除)LDAP_OPT_REFERRALS(需要 LDAP 版本 3 支持)。
version (默认:2)
指定要使用的 LDAP 协议版本。
debuglevel (默认:0)
设置 OpenLDAP 库中的调试级别。
LDAP SASL 参数
如果您使用的是支持 SASL 的 OpenLDAP 库,且 Postfix 2.8 或更高版本按照 LDAP_README 所述编译了 LDAP SASL 支持,则可以通过 SASL 向 LDAP 服务器进行身份验证。
这允许使用简单密码之外的其他机制进行身份验证。增加的灵活性是有代价的:不再能够为 LDAP 绑定操作设置明确的超时时间。在不利条件下,SASL 绑定是否会超时,或者如果会超时,超时时间由 LDAP 和 SASL 库决定。
最好通过 proxymap(8) 使用 SASL 绑定的表,这样请求进程可以设置 proxymap 请求的超时。这也允许您通过覆盖 master.cf(5) 中的 proxymap(8) import_environment 设置来定制进程环境。可能需要特殊环境设置来配置 GSSAPI 凭据缓存或其他 SASL 机制特定选项。用于 LDAP 查找的 GSSAPI 凭据可能需要与 Postfix SMTP 客户端用于向远程服务器进行身份验证的凭据不同。
使用 SASL 机制需要 LDAP 协议版本 3,默认协议版本为 2 以保持向后兼容。您必须在"bind = sasl"之外设置"version = 3"。
以下参数与使用 LDAP 和 SASL 相关:
sasl_mechs (默认:空)
要尝试的 SASL 机制列表,以空格分隔。
sasl_realm (默认:空)
要使用的 SASL 领域(如果适用)。
sasl_authz_id (默认:空)
要声明的 SASL 授权标识(如果适用)。
sasl_minssf (默认:0)
建立连接所需的最小 SASL 安全因子。
LDAP SSL 和 STARTTLS 参数
如果您使用的是支持 SSL 的 OpenLDAP 库,Postfix 可以连接到 LDAP SSL 服务器并发出 STARTTLS 命令。
可以通过在 server_host 参数中使用 LDAP SSL URL 来请求 LDAP SSL 服务:
server_host = ldaps://ldap.example.com:636
可以使用 start_tls 参数启用 STARTTLS:
start_tls = yes
两种形式都需要 LDAP 协议版本 3,必须明确设置:
version = 3
如果查询映射的任何 Postfix 程序在 master.cf 中配置为在 chroot 环境中运行,则所有涉及的证书和密钥都必须复制到 chroot 环境中。当然,私钥应该只能由"postfix"用户读取。
以下参数与 LDAP SSL 和 STARTTLS 相关:
start_tls (默认:no)
是否在连接到服务器时发出 STARTTLS。不要在使用 LDAP SSL 时设置此参数(SSL 会话会在 TCP 连接打开时自动建立)。
tls_ca_cert_dir (无默认值;必须设置此参数或 tls_ca_cert_file)
包含 X.509 证书颁发机构证书的目录,这些证书将被客户端在 SSL/TLS 连接中识别。文件采用 PEM 格式,每个文件包含一个 CA 证书。文件通过 CA 主题名称的哈希值查找,因此该哈希值必须可用。如果有多个具有相同名称哈希值的 CA 证书,则扩展名必须不同(例如 9d66eef0.0、9d66eef0.1 等)。搜索按扩展名编号顺序进行,不考虑证书的其他属性。使用 OpenSSL 发行版中的 c_rehash 实用程序创建必要的链接。
tls_ca_cert_file (无默认值;必须设置此参数或 tls_ca_cert_dir)
包含 X.509 证书颁发机构证书的文件,这些证书将被客户端在 SSL/TLS 连接中识别,采用 PEM 格式。此设置优先于 tls_ca_cert_dir。
tls_cert (无默认值;必须设置)
包含客户端 X.509 证书的文件,用于在 SSL/TLS 连接中由客户端使用。
tls_key (无默认值;必须设置)
包含与上述 tls_cert 对应的私钥的文件。
tls_require_cert (默认:no)
是否在建立 SSL/TLS 连接时请求服务器的 X.509 证书并检查其有效性。支持的值是 no 和 yes。
设置为 no 时,不检查服务器证书信任链,但在 OpenLDAP 2.1.13 之前,服务器证书中的名称仍必须与 LDAP 服务器名称匹配。在 OpenLDAP 2.0.0 到 2.0.11 中,服务器名称不一定是您指定的名称,而是通过 LDAP 服务器连接的 IP 地址的反向查找确定。在 OpenLDAP 2.0.13 之前,忽略 LDAP 服务器证书中的 subjectAlternativeName 扩展:服务器名称必须与主题通用名称匹配。no 设置对应于 LDAP 客户端配置文件中的 TLS_REQCERT 的 never 值。
如果可以避免,请不要在 OpenLDAP 2.0.x(特别是 x ≤ 11)中使用 TLS。
设置为 yes 时,服务器证书必须由受信任的 CA 颁发且未过期。LDAP 服务器名称必须与证书中找到的名称之一匹配(参见上文关于 OpenLDAP 库版本相关行为)。yes 设置对应于 LDAP 客户端配置文件中的 TLS_REQCERT 的 demand 值。
TLS_REQCERT 的"try"和"allow"值在此没有等效项。它们在 OpenLDAP 2.0 中不可用,并且在任何情况下都具有可疑的安全属性。您要么需要经过 TLS 验证的 LDAP 连接,要么不需要。
yes 值仅在 Postfix 2.5 或更高版本中正常工作,或与 OpenLDAP 2.0 或更高版本配合使用。Postfix 对 LDAP over TLS 的支持是基于 OpenLDAP 2.0 API 添加的。
tls_random_file (无默认值)
当 /dev/[u]random 不可用时,客户端在 SSL/TLS 连接中获取随机位的文件路径。
tls_cipher_suite (无默认值)
在 SSL/TLS 协商中使用的密码套件。
示例
这是一个使用 LDAP 查找 local(8) 别名的基本示例。假设在 main.cf 中,您有:
alias_maps = hash:/etc/aliases,
ldap:/etc/postfix/ldap-aliases.cf
在 ldap:/etc/postfix/ldap-aliases.cf 中,您有:
server_host = ldap.example.com
search_base = dc=example, dc=com
当收到发送到本地地址"ldapuser"的邮件,且该地址未在 /etc/aliases 数据库中找到时,Postfix 将搜索在 ldap.example.com 端口 389 上监听的 LDAP 服务器。它将匿名绑定,搜索 mailacceptinggeneralid 属性为"ldapuser"的任何目录条目,读取找到的条目的"maildrop"属性,并构建这些 maildrop 的列表,这些地址将被视为 RFC822 地址,邮件将被发送到这些地址。
过时的 MAIN.CF 参数
为了向后兼容 Postfix 2.0 及更早版本,LDAP 参数也可以在 main.cf 中定义。指定 LDAP 源时使用不以斜杠或点开头的名称。LDAP 参数将作为您为源定义的名称、下划线和参数名称的组合访问。例如,如果映射指定为"ldap:ldapsource",则"server_host"参数将在 main.cf 中定义为"ldapsource_server_host"。
注意:在这种形式下,LDAP 源的密码将写入 main.cf,该文件通常全局可读。未来 Postfix 版本中将删除对此形式的支持。
其他过时功能
result_filter (无默认值)
为了向后兼容 2.2 之前的 LDAP 客户端,当未同时设置"result_format"时,目前可以使用 result_filter 代替 result_format。新名称更好地反映了该参数的功能。此兼容接口可能在未来的版本中移除。
参见
postmap(1),Postfix 查找表管理器
postconf(5),配置参数
mysql_table(5),MySQL 查找表
pgsql_table(5),PostgreSQL 查找表
README 文件
DATABASE_README,Postfix 查找表概述
LDAP_README,Postfix LDAP 客户端指南
许可证
必须随本软件分发 Secure Mailer 许可证。
作者
Carsten Hoeger、Hery Rakotoarisoa、John Hensley、Keith Stevenson、LaMont Jones、Liviu Daia、Manuel Guesdon、Mike Mattice、Prabhat K Singh、Sami Haahtinen、Samuel Tardieu、Victor Duchovni 以及许多其他人。
LDAP_TABLE(5)