You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dovecot/Postfix:如何在查询LDAP进行认证前对用户名执行初始语法检查?

Dovecot/Postfix:如何在查询LDAP进行认证前对用户名执行初始语法检查?

我完全理解你的痛点——攻击者用不带域名的用户名瞎试,导致LDAP查询生成无效DN,日志被垃圾信息塞满,看着就闹心。其实Dovecot本身就有内置的方法,能在触发LDAP查询前先拦截不符合格式的用户名,直接返回拒绝,不用麻烦LDAP服务器。

方法一:快速拦截不带@的用户名(最简单)

这种方法只校验用户名里是否包含@,足够解决你的问题,配置起来最快:

  1. 打开Dovecot的认证配置文件(通常是/etc/dovecot/conf.d/10-auth.conf),在你现有的LDAP passdb配置之前,添加一个前置的regex passdb:
# 前置检查:拒绝所有不含@的用户名
passdb {
  driver = regex
  args = reject_not_found regexp:^.*@.*$
}

# 你原来的LDAP认证配置
passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}
  1. 重启Dovecot服务生效:
systemctl restart dovecot

原理很简单:这个regex passdb会先检查用户名,只要不包含@就直接返回认证失败,根本不会走到LDAP查询那一步,自然就不会产生无效DN的错误日志了。

方法二:严格校验邮箱格式(更严谨)

如果想进一步限制用户名必须符合标准邮箱格式(比如防止user@或者@domain这种无效格式),可以用更精确的正则表达式:

  1. 同样在10-auth.conf里添加前置的regex passdb:
passdb {
  driver = regex
  args = reject_not_found /etc/dovecot/valid-email-regex.conf
}

# 原有LDAP配置
passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}
  1. 创建/etc/dovecot/valid-email-regex.conf文件,写入标准邮箱格式的正则:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

你可以根据自己的需求调整这个正则(比如允许国际域名、特殊字符等)。

  1. 重启Dovecot生效:
systemctl restart dovecot

额外说明

  • 为什么要把regex passdb放在LDAP passdb前面?因为Dovecot的passdb是按顺序执行的,前置的检查会先生效,不符合条件的请求直接被拦截,不会触发后续的LDAP查询。
  • 这种方式完全用Dovecot内置功能实现,不需要额外依赖,性能几乎没有损耗,非常适合你的场景。

这样配置后,那些不带域名的攻击请求会被直接拒绝,你的LDAP日志也能恢复清净了。

备注:内容来源于stack exchange,提问作者user2690527

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:34:35