Dovecot Proxy 与 Lua 或者?

Dovecot Proxy 与 Lua 或者?

我构建了一个 Dovecot 代理,根据用户的域将用户发送到特定的后端。域 A 转到服务器 A,域 B 转到服务器 B,等等。域列表不是静态的,但变化不大。使用 passdb 驱动程序 sql 和简单的 SQL 语句完全可以正常工作,例如:

password_query = SELECT 
    NULL as password, 
    'y' as nopassword, 
    'y' as proxy, 
    NULL as destuser, 
    'y' as proxy_nopipelining, 
    host, 
    'y' as nodelay, 
    'y' as nologin, 
    'any-cert' as 'starttls' 
  FROM proxy_domain WHERE domain = '%d';

dovecot 配置包含:

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}

userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

我的“问题”其实不是什么大问题 - 但是...我只需要为这项工作安装并运行 Mysql/MariaDB 服务器,我认为一定有更简单的方法来解析特定域的主机。并行 postfix 安装使用简单的传输图来完成相同的工作。我不需要 SQL 服务器来进行这种简单的查找。

我想到了Dovecot Lua 密码数据库或者静态密码库但是我找不到任何有用的例子来用 Lua 将域与主机进行匹配,或者如何返回所有必要的参数?

所以我已经安装了 debian 包dovecot-auth-lua

我尝试过:

passdb {
  driver = lua
  args = file=/etc/dovecot/passdb.lua blocking=yes
  default_fields = password=NULL nopassword=y proxy=y destuser=NULL proxy_nopipelining=y nodelay=y nologin=y starttls=any-cert
}

这里有必要阻塞吗?这是只读操作,还是?

Lua 脚本:

local database = "/etc/dovecot/backends"

function auth_passdb_lookup(req)
 for line in io.lines(database) do
   for domain, host in string.gmatch(line, "(.+)%s(.+)") do
     if (domain == req.domain) then
       return dovecot.auth.PASSDB_RESULT_OK, "host=" .. host
     end
   end
 end
 return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, ""
end

当然还有<domain> <host>每行的后端文件。

但我在代理上遇到了错误

pam_unix(dovecot:auth): check pass; user unknown
pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=user@domain rhost=<my-ip>
pam(user@domain,ip,<id>): pam_authenticate() failed: Authentication failure (Password mismatch?)

这是什么意思?我不确定 - 但确实是这样的,因为我对其中一些返回了“NULL”。当我删除这两个属性时,password效果destuser是一样的。

答案1

pam_authenticate 意味着它正在尝试系统用户查找,通过注释掉 10-auth.conf 中 auth-system.conf.ext 的包含来禁用 pam 查找。

附言:你让 LUA 工作了吗?我正在尝试类似的东西。

编辑-通过将这些字段添加到 passdb 查找函数返回字段(而不是 userdb 查找函数字段)中,使我的工作正常:

返回 dovecot.auth.PASSDB_RESULT_OK, "密码=pass 代理=y 主机=imap.domain.com[电子邮件保护]通过=另一个通过”

相关内容