AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1150411
Accepted
user2690527
user2690527
Asked: 2023-12-26 23:30:50 +0800 CST2023-12-26 23:30:50 +0800 CST 2023-12-26 23:30:50 +0800 CST

Dovecot/Postfix:如何在查询 LDAP 进行身份验证之前对用户名强制执行初始语法检查?

  • 772

我有一个 Postfix/Dovecot 设置并使用 OpenLDAP 作为用户/密码后端。由于虚拟主机,用户必须使用完全合格的电子邮件地址作为用户名登录,因此域部分对于身份验证是必需的,即用户名类似于<local-part>@<fqdn-domain>.

然而,不断有攻击尝试使用不带域部分的用户名进行身份验证。由于这会导致 LDAP 查询中的 DN 无效,因此我的日志中会出现大量由于 LDAP DN 无效而导致的错误消息。

是否有任何配置选项允许 Dovecot 对提供的用户名强制执行一些初始语法检查,如果失败,Dovecot 通过立即拒绝响应来缩短身份验证过程,而不是查询 LDAP 服务器然后失败?

Dovecot 中的 LDAP 配置是

uris = ldapi://%2frun%2fopenldap%2fslapd.sock
auth_bind = yes
auth_bind_userdn = uid=%n,ou=users,o=%d,dc=my-host,dc=my-domain,dc=my-tld
base = ou=users,o=%d,dc=server,dc=my-host,dc=my-domain,dc=my-tld

正如您所看到的,我的 LDAP 设置使用所谓的“连接点”在 DIT 中为不同的托管域提供不同的子分支。(o=%dDN 中的 - 部分。)根据Dovecot 配置手册 - 用户变量,%d如果用户名后面没有域部分,则为空@。

当攻击者尝试使用不完整的用户名进行身份验证时,这会导致我的日志中出现多余的错误消息,例如

Dec 26 16:25:54 server dovecot[24946]: auth: Error: ldap(root,187.205.80.184): ldap_bind() failed: Invalid DN syntax

这里,来自 187.205.80.184 的攻击者尝试以用户身份进行身份验证root,Dovecot 尝试查找uid=root,ou=users,o=,dc=my-host,dc=my-domain,dc=my-tld这显然是无效的,因为 后没有任何内容o=。

ldap
  • 2 2 个回答
  • 47 Views

2 个回答

  • Voted
  1. Best Answer
    Esa Jokinen
    2023-12-27T00:41:58+08:002023-12-27T00:41:58+08:00

    从 Dovecot v2.2.33 开始,您可以使用条件设置默认域:

    %{if;%d;eq;;example.com;%d}

    这是:

    • if使用条件句
    • %d 要比较的值 1
    • eq 运算符:字符串相等
    • 空值 2用于比较
    • example.com如果条件为true;则结果值 当%d等于空字符串时(默认)
    • %d如果条件为false;则结果值 何时%d设置(非空)

    您可以在 LDAP 配置中使用它来代替%d:

    uris = ldapi://%2frun%2fopenldap%2fslapd.sock
    auth_bind = yes
    auth_bind_userdn = uid=%n,ou=users,o=%{if;%d;eq;;example.com;%d},dc=example,dc=com
    base = ou=users,o=%{if;%d;eq;;example.com;%d},dc=example,dc=com
    
    • 1
  2. user2690527
    2023-12-27T17:34:05+08:002023-12-27T17:34:05+08:00

    我自己找到了另一个解决方案,它不需要变量中的条件,因此也适用于旧的 Dovecot 版本。在 -variable 的特定情况下,%d以下配置指令可以解决问题

    auth_realms = <vhosted-dom-1> <vhosted-dom-2> ... <vhosted-domain-n>
    auth_default_realm = nowhere.notld
    

    第一行是支持的身份验证领域的空格分隔列表。根据客户端选择的 SASL 身份验证方法,这会通知客户端有关现有身份验证领域的信息。当然,这并不能阻止(愚蠢的)脚本攻击者仍然使用没有域部分的用户名。然而,正确设置该配置是一种很好的风格。

    第二行定义了默认领域(或者在我的例子中为域),如果客户端无法提供,Dovecot 会自动附加该领域。这里我把它设置为虚构的名字nowhere.notld。该值并不重要,它应该只与任何实际域不同。

    最后注意:当然,这并不能阻止有关身份验证尝试失败的日志消息。但那很好。但是,它可以防止由于 DN 无效而导致 LDAP 发生致命错误。相反,Dovevot 会针对失败的身份验证发出适当的警告。

    • 1

相关问题

  • Cygwin sshd 和 LDAP 身份验证

  • 从 OpenLDAP 检索操作属性

  • 为 Mac 网络使用 Linux 和 Open LDAP

  • 使用LDAP服务器身份验证的Linux中单个用户的多个登录名

  • 使用 smbldap 管理用户/组的 Web 前端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve