Dovecot/Postfix:如何在查询LDAP进行认证前对用户名执行初始语法检查?
Dovecot/Postfix:如何在查询LDAP进行认证前对用户名执行初始语法检查?
我完全理解你的痛点——攻击者用不带域名的用户名瞎试,导致LDAP查询生成无效DN,日志被垃圾信息塞满,看着就闹心。其实Dovecot本身就有内置的方法,能在触发LDAP查询前先拦截不符合格式的用户名,直接返回拒绝,不用麻烦LDAP服务器。
方法一:快速拦截不带@的用户名(最简单)
这种方法只校验用户名里是否包含@,足够解决你的问题,配置起来最快:
- 打开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 }
- 重启Dovecot服务生效:
systemctl restart dovecot
原理很简单:这个regex passdb会先检查用户名,只要不包含@就直接返回认证失败,根本不会走到LDAP查询那一步,自然就不会产生无效DN的错误日志了。
方法二:严格校验邮箱格式(更严谨)
如果想进一步限制用户名必须符合标准邮箱格式(比如防止user@或者@domain这种无效格式),可以用更精确的正则表达式:
- 同样在
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 }
- 创建
/etc/dovecot/valid-email-regex.conf文件,写入标准邮箱格式的正则:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
你可以根据自己的需求调整这个正则(比如允许国际域名、特殊字符等)。
- 重启Dovecot生效:
systemctl restart dovecot
额外说明
- 为什么要把regex passdb放在LDAP passdb前面?因为Dovecot的passdb是按顺序执行的,前置的检查会先生效,不符合条件的请求直接被拦截,不会触发后续的LDAP查询。
- 这种方式完全用Dovecot内置功能实现,不需要额外依赖,性能几乎没有损耗,非常适合你的场景。
这样配置后,那些不带域名的攻击请求会被直接拒绝,你的LDAP日志也能恢复清净了。
备注:内容来源于stack exchange,提问作者user2690527
相关产品推荐
相关产品推荐

